【发布时间】:2017-07-14 05:48:35
【问题描述】:
我猜这与ack 无关,但更多的是与bash:
这里我们创建file.txt 包含字符串foobar 所以ack 可以在其中找到foobar:
> echo foobar > file.txt
> echo 'ack foobar file.txt' > ack.sh
> bash ack.sh
foobar
> bash < ack.sh
foobar
到目前为止一切顺利。但是为什么 ack 没有找到这样的东西呢?
> cat ack.sh | bash
(no output)
或
> echo 'ack foobar file.txt' | bash
(no output)
为什么最后两种情况ack找不到foobar?
在前面添加unbuffer(来自期望)使其工作,我不明白:
> echo 'unbuffer ack foobar file.txt' | bash
foobar
甚至陌生人:
> cat ack2.sh
echo running
ack foobar file.txt
echo running again
unbuffer ack foobar file.txt
# Behaves as I'd expect
> bash ack2.sh
running
foobar
running again
foobar
# Strange output
> cat ack2.sh | bash
running
unbuffer ack foobar file.txt
this 输出是怎么回事?它回显unbuffer ack foobar file.txt 但不是running again?嗯?
【问题讨论】:
-
这是一个
ack问题。尝试将ack替换为grep并按预期工作。 -
看起来 ack 在运行
cat ack.sh | bash时对 stdin 不是终端感到不高兴。我会为ack提交一个错误文件。或者只使用grep;) -
注意显式重定向ack的标准输入也可以解决问题:
echo 'ack foobar file.txt <&-' | bash或echo 'ack foobar file.txt </dev/null' | bash