首页 > 解决方案 > 如何将一个命令的输出作为下一个命令的参数值传递

问题描述

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

我想运行tail -f --pid=$REMOTE_PID logsREMOTE_PID 是远程服务器上运行的程序的 PID 的命令。它在日志文件中写入从 1 到 30 的数字,并且sleep(1). 所以我想同时显示来自本地机器上日志文件的数字。所有这些都是在脚本中完成的,而不是手动!

这是我到目前为止所做的,但无法获得正确的 PID。在第一个命令中,我放了 & 来释放 shell,这样我就可以运行下一个命令

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

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

尾部:无法打开“8087”进行阅读:没有这样的文件或目录
尾部:无法打开“8109”进行阅读:没有这样的文件或目录
==>日志<==
1
2
3
...

我尝试了另一个代码:

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"

我收到此错误:
cat: pid: No such file or directory
tail: : invalid PID

我想拥有脚本的唯一一个 PIDshowdigits.sh并将其传递给尾部。也许有更简单的解决方案?

谢谢

标签: linuxbashssh

解决方案


你的策略是:

  1. 启动一个进程
  2. 断开连接并忘记它
  3. 重新连接并尝试找到它
  4. 跟着它

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

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

(注意:使用sh运行脚本是最糟糕的做法


推荐阅读