linux - bash/sh -c 不适用于多个管道

标签 linux bash shell

因此,命令:

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/

相关文章:

linux - bash 循环文件回显到目录中的每个文件

Linux IP地址无法通过ssh命令访问

Java ProcessBuilder 和 bash

Linux Shell - Grep 命令

linux - 在 bash 中执行 shell 脚本时如何控制用户定义的命令?

linux - grep'ing 从以前的 grep 输出的文件

linux - 使用 AWK 替换列值

linux - 用 whiptail 显示一个变量

r - csv 文件,或制表符分隔文件,或任何文件

shell - 如果部分路径不存在,mkdir 也是