当我直接运行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
设置为非标准字符。虽然cat
和grep
工作正常-大概是因为两者都不依赖于IFS
工作-echo
不是。
我不完全确定这是怎么发生的,但是对于面临这个问题的任何人,检查您的环境中名为IFS
(env | grep IFS
)的变量,并将其设置回默认值(' tn'
)。
PS:周中早晨糟糕的开始/facepalm