1

我刚从 Winows 马车上下来, gnome-terminal 和 bash 看起来很棒,但我不太清楚如何让它做我想做的事,(我怀疑这是可能的)。
可以使标准输出(例如来自 sed)作为命令运行吗?
(即,将输出解释并作为脚本逻辑的一部分运行。)
我正在轮询一个进程以按时间间隔输出其状态,并且我想将其作为一个单行来执行。

# dd is already running in another terminal. Its PID is 1234
pgrep -l '^dd$' | sed -n 's/^\([0-9]\+.*\)/sudo watch -n 30 kill -USR1 \1/p'  
# this outputs: sudo watch 30 kill -USR1 1234  

是否有一些快捷的终端/bash 魔法可以运行sudo watch 30 kill -USR1 1234?谢谢。

4

4 回答 4

1

将其包裹在 $() 中。$() 像环境变量一样分配标准输出。在一行上,它运行打印的命令。

$(pgrep -l '^dd$' | sed -n 's/^\([0-9]\+.*\)/sudo watch -n 30 kill -USR1 \1/p')
于 2010-09-29T20:31:55.263 回答
1

只需将命令通过管道传输到sh

pgrep -l '^dd$' | sed -n 's/^\([0-9]\+.*\)/sudo watch -n 30 kill -USR1 \1/p' | sh
于 2010-09-29T20:32:55.960 回答
1

您应该能够将其包装在$()

$(pgrep ... | sed ...)

但为什么不这样做:

while :; do sleep 30; clear; kill -USR1 $(pgrep '^dd$'); done
于 2010-09-29T20:28:13.457 回答
0

仅仅因为这在某些谷歌搜索中出现的相对较高,我将添加这个答案。

如果你把 `` 放在一个命令周围,那么输出将被重新路由到一个字符串中,如果它本身将作为一个命令运行。

例如,这将运行“echo 3”:

`echo "echo 3"`

这也可以与多个层一起使用,例如:

``echo "echo echo 3"``

将回显“3”,因为第一个回声给出了“回声回声3”,它启动了另一个回声,该回声给出了正在运行的“回声3”。

我总是使用 `` 而不是 $() 或 |sh / |bash 因为我个人认为它在脚本中看起来更干净。但它的工作原理几乎与 $() 完全一样(我不相信有任何区别,但可能会有细微差别)。

可以用 $() 和 `` 做但不能用 | 做的一件事 bash 正在分配变量。您可以存储输出,然后再执行它:

azdefvar="`COMMAND_THAT_OUTPUTS_COMMAND`"

这是一个例子:

daboross@DaboUbuntu:~$ date +%T
13:09:20
daboross@DaboUbuntu:~$ azdef="`echo "date +%T"`"
daboross@DaboUbuntu:~$ echo $azdef
date +%T
daboross@DaboUbuntu:~$ $azdef
13:09:45
daboross@DaboUbuntu:~$ echo $azdef | bash
13:09:53

在任何这些情况下,您都可以使用 $() 而不是 ``。

` 键在大多数键盘上位于 esc 键的正下方。

于 2013-06-05T20:15:29.717 回答