【问题标题】:How to escape pipes in .screenrc for commands to run at startup?如何在 .screenrc 中转义管道以在启动时运行命令?
【发布时间】:2011-04-14 15:31:02
【问题描述】:

我正在使用byobu/screen,我希望有一个新的屏幕会话默认包含一些专门用于跟踪特定日志文件的窗口。

我的.screenrc 看起来像这样(技术上这是我的.byobu/windows 文件):

chdir /home/matt/code/project/logs
screen -t 'logs' tail -F current.log

chdir /home/matt/code/project
screen -t 'errors' tail -F current.log | grep -A 3 "ERROR"

chdir /home/matt/code/project
screen -t 'project'

chdir 
screen -t 'bash'

我的意图是在新屏幕会话中设置四个窗口:

  1. current.log 文件后面的标题为“日志”的窗口
  2. 标题为“错误”的窗口位于current.log 文件的尾部,并用greps 查找ERROR
  3. 标题为“项目”的窗口从我的项目的主目录开始
  4. 标题为“bash”的窗口从我的主目录开始。

但是,screen -t 'errors' tail -F current.log | grep -A 3 "ERROR" 命令中的管道最终会被屏幕逐字解释,因此我的第二个窗口永远不会出现。

如何在此命令中转义管道以使其按我的意愿进行解释?

此外,是否有更简单的方法来设置 screen/byobu 以在启动时启动正在运行(复杂)命令的窗口?

【问题讨论】:

    标签: bash pipe gnu-screen


    【解决方案1】:

    我最终解决了这个问题,方法是使用 stuff 命令模拟在窗口中输入命令并按 enter 执行它。这样做的好处是可以在屏幕窗口中跳出 tail 命令,而不会杀死窗口本身。

    这是我的 .screenrc 看起来如何完成此操作的示例;我写了a longer explanation on my blog:

    screen -t 'errors'
    stuff 'tail -F /var/ec/current.log | grep -A 3 "ERROR"^M'
    

    (^M 是通过按 Ctrl+V 输入,用键盘输入,而不是通过实际输入插入符号和大写 M)

    【讨论】:

      【解决方案2】:

      以下对我有用:

      screen -t errors bash -c "tail -F current.log | grep -A 3 ERROR"
      

      需要使用 bash(或其他 shell)来防止屏幕给出“找不到文件”-错误,如果从上面删除 bash -c 将是结果。

      【讨论】:

      • 请在您的代码中添加一些解释,以便将来帮助其他人
      • 这似乎是一个更简单的答案,它使用已知的bash -c 语法并且在 .screenrc 中运行良好
      【解决方案3】:

      您应该可以创建自定义脚本并在 .screenrc 中使用它 - 所以您将拥有 screen -t 'error' ./bin/current.log.sh

      和 tail -F ... 在 current.log.sh 中

      【讨论】:

        猜你喜欢
        • 2013-05-25
        • 2010-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-04
        • 1970-01-01
        • 1970-01-01
        • 2021-06-15
        相关资源
        最近更新 更多