【问题标题】:In gnome-terminal/bash, can std output be run directly (interpreted?) as a command?在 gnome-terminal/bash 中,std 输出可以作为命令直接运行(解释吗?)?
【发布时间】:2011-04-19 00:58:53
【问题描述】:

我刚从 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  

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

【问题讨论】:

    标签: ubuntu sed command gnome-terminal


    【解决方案1】:

    你应该可以把它包裹在$():

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

    但为什么不这样做:

    while :; do sleep 30; clear; kill -USR1 $(pgrep '^dd$'); done
    

    【讨论】:

    • 为什么不“同时”呢? ...因为在寻找一种方法来显示dd 的进度时,这就是 sn-p 所显示的,而且我不想冒险离开我知道的轨道太远(不是 dd!)...但是我认为我会明智地听取 StackAthlon 大师的建议... :) 我会试一试“While”...
    【解决方案2】:

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

    $(pgrep -l '^dd$' | sed -n 's/^\([0-9]\+.*\)/sudo watch -n 30 kill -USR1 \1/p')
    

    【讨论】:

      【解决方案3】:

      只需将命令通过管道发送到sh:

      pgrep -l '^dd$' | sed -n 's/^\([0-9]\+.*\)/sudo watch -n 30 kill -USR1 \1/p' | sh
      

      【讨论】:

      • 谢谢...我没有意识到您可以通过管道连接到 sh... 这很好。这次我将使用 $(),但很高兴了解管道到 sh,它可能会在某个时候派上用场..
      【解决方案4】:

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

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

      例如,这将运行“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 键的正下方。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多