我想在Linux中使用普通命令管道一个函数。请注意,所有这些命令都放在.sh脚本中(我使用Bash shell)。例如,我有一个如下命令:
git diff --name-only HEAD~1..HEAD -z | xargs -0 dirname | catch_exceptions >> extracted_dir_names
我已将catch_exceptions
编写为此命令之上的函数,它包含2个sed delete语句。如果我在他们工作的函数中管道两个sed命令,但如果我一个接一个地把它们放在一起,他们不会。有人可以解释为什么会这样,以及如何解决这个问题?提前致谢。
这有效:
function catch_exceptions {
sed '/^\./d' | sed '\#this/path/alone#d'
}
pushd /path/to/direc
rm -f extracted_directories.txt
git diff --name-only HEAD~1..HEAD -z | xargs -0 dirname | remove_duplicates | catch_exceptions >> extracted_directories.txt
cat extracted_directories.txt
popd
}
但是当我用以下代码替换catch_exceptions时:
function catch_exceptions {
sed '/^\./d'
sed '\#this/path/alone#d'
}
它不起作用。
答案 0 :(得分:1)
使用第一个函数,第一个<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="years"></select>
命令的输出被送到第二个,所以当第一个完成时,第二个也是。
使用第二个函数,第一个sed
的输出将直接发送到标准输出,并且只有在完成后才会启动第二个sed
。第二个sed
的标准输入仍然连接到管道,但第一个读取所有数据,因此第二个sed
无法处理。
如果您希望两个sed
命令都从同一个管道中读取,请查看Two children reading from a pipe,并考虑将sed
与process substitution一起使用。另请查看Redirect stdout of one process to two processes。
答案 1 :(得分:0)
如果要将输出定向到函数中的更多sed,可以暂时使用文件。
sed '/^\./d' input.txt > tmp.txt
sed '\#this/path/alone#d' tmp.txt > output.txt
rm tmp.txt