我想将 shell 脚本的输出(包括用户输入的文本)发送到终端和日志文件。
我认为一些组合可能会做到这一点tee
,exec
但到目前为止我还没有运气。我知道tee
它本身可以回显并捕获用户在终端中输入的内容:
$ tee logfile
Hello (I entered this at runtime)
Hello (I entered this at runtime)
^C
$ cat logfile
Hello (I entered this at runtime)
但我需要查看(在终端和日志文件中)用户输入的内容以响应在 shell 脚本中调用的命令。
tee
似乎无法始终如一地做到这一点。
例如:
$ read message 2>&1 | tee logfile
Hello (I entered this at runtime)
$ cat logfile
那里什么也没拍到。我希望Hello (I entered this at runtime)
像以前一样在文件中看到。
我还尝试在 shell 脚本中结合tee
使用,如下所示:exec
$ cat test.bash
#!bin/bash
# Note: in this simplified version of this file, I’m not looking at $1, $2, or anything else passed in, but will need to eventually
rm -f logfile
exec &> >(tee -a logfile)
echo “Say \”Hello\”” 2>&1
read -p “> “ 2>&1
不幸的是,添加exec
没有帮助:
$ ./test.bash
Say “Hello”
> Hello (I entered this at runtime)
$ cat logfile
Say “Hello”
>
如您所见,它捕获了echo
命令和read
命令的输出,但没有捕获我为响应read
命令而输入到终端的内容。
有没有办法做到这一点?
我知道script
命令(“制作终端会话的打字稿”)可以捕获屏幕上的所有内容并将其放入日志文件中。但是script
无法从 shell 脚本中以有用的方式调用该命令。(它可以?)
script
需要首先调用,然后用户必须调用所需的 shell 脚本。但我希望用户只需调用一个命令及其参数,然后让该命令负责运行其他所有内容并记录所有内容。
然后是脚本捕获的所有“额外”信息(例如颜色代码、退格),这使得在任意文本编辑器中读取生成的日志文件变得很困难。
我只想查看日志文件中的“人类可读”字符。而且我不想查看用户是否更正了拼写错误。我只想看到他们完成编辑并按 Enter 后屏幕上显示“Hello”。虽然我认为额外的信息可以在捕获后被剥离。