echo $(command) 得到与命令输出不同的结果

bo *_*ang 1 bash subshell command-substitution

我使用的 Bash 命令:

  1. $ ssh user@myserver.com ps -aux|grep -v \"grep\"|grep "/srv/adih/server/app.js"|awk '{print $2}'

    6373
    
    Run Code Online (Sandbox Code Playgroud)
  2. $ ssh user@myserver.com echo $(ps -aux|grep -v \"grep\"|grep "/srv/adih/server/app.js"|awk '{print $2}')

    8630
    
    Run Code Online (Sandbox Code Playgroud)

第一个结果是正确的,第二个结果将改变我执行它的回显时间。但我不知道他们为什么不同。


我在做什么?

我的工作站的资源非常有限,因此我使用远程计算机来运行我的 Node.js 应用程序。ssh user@remotebox.com "cd /application && grunt serve"我在调试模式下运行它。当我命令Ctrl+时C,grunt 任务停止,但应用程序仍在调试模式下运行。我只想杀死它,我需要先获取PID。

tri*_*eee 5

命令替换由本地 shell 在运行之前执行ssh

如果您的本地系统的名称是here,远程系统的名称是there

ssh there uname -n
Run Code Online (Sandbox Code Playgroud)

将打印there

ssh there echo $(uname -n)  # should have proper quoting, too
Run Code Online (Sandbox Code Playgroud)

uname -n在本地运行,然后发送扩展的命令行echo herethere执行。

另外,除非您特别要求 shell 在打印之前对输出执行通配符扩展和空白标记化,否则echo $(command)无用的echocommand

另外,grep x | awk { y }无用的使用grep;它可以而且可能应该被重构为awk '/x/ { y }'——但是当然,在这里你正在重新发明pidof,所以最好只使用它。

 ssh user@myserver.com pidof /srv/adih/server/app.js
Run Code Online (Sandbox Code Playgroud)

如果你想在本地捕获打印的 PID,语法是

pid=$(ssh user@myserver.com pidof /srv/adih/server/app.js)
Run Code Online (Sandbox Code Playgroud)

当然,如果你只需要杀死它,那就是

ssh user@myserver.com pkill /srv/adih/server/app.js
Run Code Online (Sandbox Code Playgroud)