使用-c和用于awk的管道字符串调用bash命令

The*_*ght 0 linux macos bash shell awk

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

ps -eo pid,command | grep -v bash | grep syslogd | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

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

/bin/bash -c "ps -eo pid,command | grep -v bash | grep syslogd | awk '{print $1}'"
Run Code Online (Sandbox Code Playgroud)

不打印syslogd进程的pid,而是打印syslogd的路径: -

 19 /usr/sbin/syslogd
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么会这样,如果可以用这种方式用bash调用命令,那么它的作用与直接调用命令时的行为相同,只打印进程的pid?

Joh*_*ica 6

$1正在由外部shell来解释,因为它是在双引号.你需要用反斜杠来逃避它.

/bin/bash -c "ps -eo pid,command | grep -v bash | grep syslogd | awk '{print \$1}'"
Run Code Online (Sandbox Code Playgroud)

顺便说一下,在Linux上你可以用以下内容替换所有这些pgrep:

$ pgrep syslogd
25855
Run Code Online (Sandbox Code Playgroud)