因此,命令:
dmesg | grep 'Attached SCSI disk' | awk '{ print $5}'
当直接从 shell 执行时,工作正常,输出:
[sdb]
[sdc]
[sda]
但是,当我启动它时:
sh -c "dmesg | grep 'Attached SCSI disk' | awk '{ print $5}'"
# or
bash -c "dmesg | grep 'Attached SCSI disk' | awk '{ print $5}'"
我得到:
[ 2.460353] sd 1:0:0:0: [sdb] Attached SCSI disk
[ 2.461348] sd 2:0:0:0: [sdc] Attached SCSI disk
[ 2.464181] sd 0:0:0:0: [sda] Attached SCSI disk
这清楚地表明最后一个管道还没有执行。
我做错了什么?
最佳答案
您的 $5
过早被评估。将其更改为 \$5
。
如果您将 bash
替换为 echo
,您会看到 $5
被替换为空字符串:
% echo "dmesg | grep 'Attached SCSI disk' | awk '{ print $5}'"
dmesg | grep 'Attached SCSI disk' | awk '{ print }'
因此,当 bash 计算命令时,awk 将打印整行,而不是第五个字段。
当您转义美元符号时(通过预先添加反斜杠),变量 $5
会被保留:
% echo "dmesg | grep 'Attached SCSI disk' | awk '{ print \$5}'"
dmesg | grep 'Attached SCSI disk' | awk '{ print $5}'
关于linux - bash/sh -c 不适用于多个管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12091324/