当我直接运行一个grep管道时,我得到了两行输出:
$ grep Interface /proc/net/bonding/bond0 | cut -d : -f 2 | sed 's/ //g'
eno1np0
eno2np1
$奇怪的是,当我捕获并调用echo时,输出是空的。
$ echo $(grep Interface /proc/net/bonding/bond0 | cut -d : -f 2 | sed 's/ //g')
$grep输出的for循环显示了许多空行:
$ for a in $(grep Interface /proc/net/bonding/bond0 | cut -d : -f 2 | sed 's/ //g'); do echo $a; done
$不管它的价值是什么,我尝试过将stderr重定向到stdout,而没有运气:
echo $(grep Interface /proc/net/bonding/bond0 2>&1 | cut -d : -f 2 | sed 's/ //g')我甚至尝试使用cat而不是grep。
如何让echo实际打印grep命令输出的内容?通常情况下,echo工作。对于其他事情,我可以像往常一样回显输出。我可以将文本回显到文件中。我只是无法让它与这个grep管道一起工作。
发布于 2022-06-15 12:46:07
我的预感是,来自/proc/net的结果实际上包含空字节,这会抛出shell。
您正在尝试的与臭名昭著的useless use of echo非常相似,尽管我认为如果目标是将所有输出都放在一行上,它并不完全无用(但是仍然是坏的,因为shell将扩展结果中的任何通配符)。
也许可以试试这个:
grep Interface /proc/net/bonding/bond0 |
tr '\000' '\012' |
sed 's/^[^:]*://;s/ //g;N;s/^[^:]*://;s/ //g;s/\n/ /'尽管s/\n/ /可能不是所有sed变体都可移植的。
发布于 2022-06-15 13:58:37
根据“CharlesDuffy和@tripleee”以及我的一位同事的信息,我们发现了这一点。
我不确定这是一个常见的事件,但张贴在这里,以防其他人在未来遇到这种情况。
原因是环境变量IFS被设置为非标准字符。虽然cat和grep工作正常--大概是因为两者都不依赖于IFS才能工作-- echo却没有。
我不完全确定这是如何发生的,但对于面临此问题的任何人,请检查您的环境中是否有一个名为IFS (env | grep IFS)的变量,并将其设置为默认(' \t\n')。
PS:一个周中早晨/facepalm的糟糕开端
https://stackoverflow.com/questions/72631290
复制相似问题