【问题标题】:Calling a bash command with -c and piped string for awk使用 -c 和管道字符串为 awk 调用 bash 命令
【发布时间】:2013-11-24 22:02:27
【问题描述】:

如果我从命令提示符运行以下命令,它会按预期工作:-

ps -eo pid,command | grep -v bash | grep syslogd | awk '{print $1}'

输出只是 syslogd 进程的 pid。根据 bash 的手册页,使用 -c 参数允许传递命令字符串。所以,我尝试了这个:-

/bin/bash -c "ps -eo pid,command | grep -v bash | grep syslogd | awk '{print $1}'"

不仅打印 syslogd 进程的 pid,还打印 syslogd 的路径:-

 19 /usr/sbin/syslogd

有人能解释一下为什么会这样吗,是否可以用这种方式用 bash 调用命令,以便它的行为与直接调用命令时相同并且只打印进程的 pid?

【问题讨论】:

  • 顺便说一句,正确的写法是ps -eo pid,command | awk '!/bash/ && /syslogd/ {print $1}'。另见partmaps.org/era/unix/award.html#grep
  • @tripleee 好名字(!),谢谢 ;O)

标签: linux macos bash shell awk


【解决方案1】:

$1 正在被外部 shell 解释,因为它在双引号中。您需要使用反斜杠对其进行转义。

/bin/bash -c "ps -eo pid,command | grep -v bash | grep syslogd | awk '{print \$1}'"

顺便说一句,在 Linux 上,您可以将所有这些替换为 pgrep

$ pgrep syslogd
25855

【讨论】:

    【解决方案2】:

    这也应该有效

    pidof syslogd
    

    【讨论】:

    • 它在 OSX 上不可用,但更有趣的是,在我的 CentOS 服务器上,它显示“找不到命令”,尽管有该命令的手册页。
    猜你喜欢
    • 1970-01-01
    • 2014-09-12
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多