我刚从Winows旅行车上下来,gnome-terminal和bash看起来很棒,但我不知道如何让它做我想做的事情(我怀疑它是可能的)。<登记/>
可以将std输出(例如来自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
运行sudo watch 30 kill -USR1 1234
是否有一些快捷的终端/重击法术?
感谢。
答案 0 :(得分:1)
您应该可以将其打包在$()
:
$(pgrep ... | sed ...)
但为什么不这样做:
while :; do sleep 30; clear; kill -USR1 $(pgrep '^dd$'); done
答案 1 :(得分:1)
将其包裹在$()中。 $()像环境变量一样分配标准输出。在一行上,这将运行打印的命令。
$(pgrep -l '^dd$' | sed -n 's/^\([0-9]\+.*\)/sudo watch -n 30 kill -USR1 \1/p')
答案 2 :(得分:1)
只需将命令传递给sh
:
pgrep -l '^dd$' | sed -n 's/^\([0-9]\+.*\)/sudo watch -n 30 kill -USR1 \1/p' | sh
答案 3 :(得分:0)
仅仅因为这在某些Google搜索中出现的相对较高,我会添加这个答案。
如果你在一个命令周围放置`,那么输出将被重新路由到一个字符串中,如果它本身就会作为一个命令运行。
例如,这将运行'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键正下方。