管道功能与linux中的其他命令

时间:2016-04-19 06:52:30

标签: git bash unix

我想在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'
}

它不起作用。

2 个答案:

答案 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,并考虑将sedprocess 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