如何将一个命令的输出作为下一个命令的参数值传递

时间:2019-04-19 14:30:28

标签: linux bash ssh

我想将命令的结果作为下一个命令的参数的传递。我知道有xargs和管道|,但它们并没有真正的帮助。

我想运行命令tail -f --pid=$REMOTE_PID logs,其中REMOTE_PID是在远程服务器上运行的程序的PID。它在日志文件中写入1到30的数字,并且{ {1}}。因此,我想同时显示来自本地计算机上日志文件的数字。 所有这些都是在脚本中完成的,而不是手动进行的!

这是我到目前为止所做的,但无法获得正确的PID。在第一个命令中,我使用&释放外壳,以便可以运行下一个命令

sleep(1)

这些命令有效,但在混合正确的一个之前我得到了几个PID:

tail:无法打开“ 8087”进行读取:没有此类文件或目录
尾巴:无法打开“ 8109”进行读取:没有此类文件或目录
==>日志<==
1
2
3
...

我尝试了另一个代码:

ssh user@host 'nohup sh showdigits.sh' &
ssh user@host 'PID=`pgrep -f showdigits.sh` && tail --pid=$PID -f logs'

我收到此错误:
cat:pid:没有这样的文件或目录
尾巴::无效的PID

我想拥有脚本ssh user@host 'nohup sh showdigits.sh' & ssh user@host "ps -ef | awk '/[s]howdigits.sh/{print $2}' > pid && tail --pid=`cat pid` -f logs" 的唯一一个PID,并将其传递给尾部。也许有一个更简单的解决方案?

谢谢

2 个答案:

答案 0 :(得分:1)

您的策略是:

  1. 开始一个过程
  2. 断开连接,忘记它
  3. 重新连接并尝试找到它
  4. 关注

您可以通过完全删除第2步和第3步来简化此操作:

ssh user@host '
  nohup sh showdigits.sh &
  tail --pid=$! -f logs
'

(注意:使用sh运行脚本是worst practice

答案 1 :(得分:0)

您的grep匹配超过1个结果。第一个匹配项分配给--pid =,其他匹配项解释为文件名。
您必须先将其通过头部(或尾部),然后再进行处理(取决于您想要的pid)
PID=$(pgrep -f showdigits.sh | head -n1)