在 Bash 脚本中,我使用“screen -L”以彩色方式记录已执行的命令。例如:
screen -L tree
然后我们用 读取日志文件less -R
。
执行此脚本时,其他屏幕可能正在运行,因此我们不知道哪个 screenlog.* 包含我们的输出。我不能要求用户自定义他/她的.screenrc
。
有没有办法在命令行上指定日志名称或读取特定的.screenrc
命令?
答案1
我对此有几点想法。首先,请注意,您可以通过-c
命令行开关调用 screen 时控制启动 screenrc。其次,您可以在 .screenrc 中使用环境变量。综合以上所有,下面是一个 shell 脚本,用于执行您想要的操作:
#!/bin/bash
cat << EOF >/tmp/screenrc.$$
logfile /tmp/screenlog.$$
EOF
screen -c /tmp/screenrc.$$ -L
rm /tmp/screenrc.$$
echo "logfile is /tmp/screenlog.$$"
该脚本会覆盖用户 screenrc 并将输出放置在特定文件中。在本例中,我使用$$
通过附加脚本进程名称来生成文件名。请注意,您通常应该使用mktemp
来创建安全的临时文件,但我现在很懒。
这也完全取代了用户.screenrc
。如果您仍想从该文件读取设置,则应将生成的配置文件更改为如下内容:
logfile /tmp/screenlog.$$
source $HOME/.screenrc
答案2
在 screen 4.06 及更高版本中,可以直接在命令行上使用 指定日志文件-Logfile <name>
。
对于早期版本,接受的答案可能是最清晰的选择。
(在屏幕 4.05 中,日志文件名可能会令人困惑地作为-L
选项的可选参数给出,如果有人试图将裸-L
选项作为最后一个选项,则会出现问题:命令名会被误解为日志文件名)。
答案3
使用:
tree -C > tree.log
-C
即使输出不是到 tty,该选项也会强制显示颜色。
相似地:
ls -l --color=always > ls.log
grep --color=always foo bar > grep.log
ack --color foo > ack.log
输出颜色的实用程序通常有办法在输出被发送到管道或重定向时强制打开颜色。
答案4
或者,还有一种在线完成的方法。
Ctrl通过+ A,在屏幕上进入命令模式:,然后使用logfile
以所需文件名称作为参数的命令:
logfile whatevernameyoulike.log
来源:Screen 手册页