我想将 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”。虽然我认为额外的信息可以在捕获后被剥离。
至少的
script
实现是可编写脚本的。util-linux
例如,您可以这样做:
并将
file.log
捕获写入终端的所有内容,包括您键入的内容的回声。这还包括由 tty 行规程执行的转换,例如将 LF 转换为 CRLF。script
还增加了一些标题和:
从具有 ksh 样式进程替换支持的 shell 中的页脚,您可以使用以下命令删除:
或者,正如@zevzek 所建议的那样,告诉
script
将包含页眉/页脚的日志写入/dev/null
,但将script
的输出(-q
没有页眉或页脚)重定向tee
到进行日志记录。或 with
zsh
onmulti_ios
(默认情况下):要禁用由 开始的伪 tty 的 tty 行规程的输出后处理
script
,您可以在此处禁用它并至少在主机 tty 上重新启用 NL -> CRNL 转换,如下所示:(假设中的命令
...
不恢复该输出处理)。要记录应用程序对 tty 设备的读取和写入内容,另一种方法是使用
strace -P "$(tty)"
记录它对 tty 所做的所有系统调用,并包含一个用于读取和写入的十六进制转储,然后我们可以使用 xxd 对其进行解码:与此语法一起使用。
tee
我可以向您保证,您的意见将在
file
您完成后提交。