小编Pho*_*nix的帖子

在 bash 脚本中记录命令行及其输出

有没有一种方法可以让脚本同时记录命令行运行(包括管道运行)及其输出,而无需复制命令行?

目的是脚本应该有一个干净的输出,但应该详细地记录到日志文件中(所以没有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 中)可以实现这一点而不必重复命令?

linux bash

2
推荐指数
1
解决办法
1538
查看次数

bash:解析脚本中的 F 键 (F1-F10)

我编写了一个 bash 脚本,它具有类似于“mc”或 Norton Commander 的“按钮”。现在,我使用数字键 (1-0) 来模拟按下的按钮。但是,我宁愿使用 F 键 (F1-F10) 来做这件事。

我看到了这个问题和答案,但我不确定这是否可以在脚本中使用以触发功能(例如,通过使用“读取”)。

bash 支持吗?如果是这样,是否有一种相当简单的方法来实现它?

更新

该脚本有点像破折号,需要刷新以保持内容最新。但是,同时我想保持“频道”开放以允许用户输入(因此sleep是不够的)。

当前用于获取用户输入的读取行如下所示:

read -n 1 -s -t "${iRefresh}" sReturnVar.

此处将“iRefresh”设置为 2 秒,以便在没有输入刷新显示时超时,然后返回到读取行。本质上,读取行在等待用户输入时兼作内容刷新。

bash

1
推荐指数
1
解决办法
61
查看次数

标签 统计

bash ×2

linux ×1