为什么 echo 不打印 $(grep ... /proc/net/bonding/bond0) 的输出?



当我直接运行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管道一起工作。

我的直觉是/proc/net的结果实际上包含空字节,这会使shell脱离。

你正在尝试的是非常类似于臭名昭著的无用的使用echo,虽然我想如果目标是得到所有的输出在单行上,它不是完全无用的(但仍然坏了,因为shell会扩展结果中的任何通配符)。

不妨试试:

grep Interface /proc/net/bonding/bond0 |
tr '00' '12' |
sed 's/^[^:]*://;s/ //g;N;s/^[^:]*://;s/ //g;s/n/ /'

虽然s/n/ /的东西可能不能移植到所有的sed变体。

根据@CharlesDuffy和@tripleee以及我的一位同事的信息得出了这个结论。

我不确定这种情况是否常见,但在这里发帖以防将来有人遇到这种情况。

环境变量IFS设置为非标准字符。虽然catgrep工作正常-大概是因为两者都不依赖于IFS工作-echo不是。

我不完全确定这是怎么发生的,但是对于面临这个问题的任何人,检查您的环境中名为IFS(env | grep IFS)的变量,并将其设置回默认值(' tn')。

PS:周中早晨糟糕的开始/facepalm

最新更新