有没有一种方法可以让脚本同时记录命令行运行(包括管道运行)及其输出,而无需复制命令行?
目的是脚本应该有一个干净的输出,但应该详细地记录到日志文件中(所以没有set -x)。除了输出之外,它还应记录导致输出的命令行,这可能是管道命令一衬里。
最基本的方法是复制脚本中的命令行,然后将其转储到日志中,然后捕获正在运行的实际命令的输出:
echo "command argument1 \"quoted argument2\" | grep -oE \"some output\"" >> file.log
output="$(command argument1 "quoted argument2" 2>&1 | grep -oE "some output")"
echo "${output}" >> file.log
Run Code Online (Sandbox Code Playgroud)
这有一个副作用,即日志中引用的部分需要转义,这可能会导致错误,从而导致混乱。
如果没有任何命令通过管道传输,则可以将命令行存储在数组中,然后“运行”该数组。
command=(command argument1 "quoted argument2")
echo "${command[@]}" >> file.log
output="$("${command[@]}" 2>&1)"
echo "${output}" >> file.log
Run Code Online (Sandbox Code Playgroud)
虽然用这种方法"quoted argument2"会变成quoted argument2日志。
有没有一种方法(在 bash 中)可以实现这一点而不必重复命令?
我编写了一个 bash 脚本,它具有类似于“mc”或 Norton Commander 的“按钮”。现在,我使用数字键 (1-0) 来模拟按下的按钮。但是,我宁愿使用 F 键 (F1-F10) 来做这件事。
我看到了这个问题和答案,但我不确定这是否可以在脚本中使用以触发功能(例如,通过使用“读取”)。
bash 支持吗?如果是这样,是否有一种相当简单的方法来实现它?
更新
该脚本有点像破折号,需要刷新以保持内容最新。但是,同时我想保持“频道”开放以允许用户输入(因此sleep是不够的)。
当前用于获取用户输入的读取行如下所示:
read -n 1 -s -t "${iRefresh}" sReturnVar.
此处将“iRefresh”设置为 2 秒,以便在没有输入刷新显示时超时,然后返回到读取行。本质上,读取行在等待用户输入时兼作内容刷新。