出于文档目的,我的意思是从我执行的命令重定向到文件 stdout 和 stderr。例如,我会运行(我的命令没有别名那么简单,ll
但它可能无关紧要):
$ ll > out-err.dat 2>&1
$ cat out-err.dat
drwxr-xr-x 39 us00001 us00001 4096 jul 31 14:57 ./
drwxr-xr-x 3 root root 4096 feb 2 06:06 ../
-rw------- 1 us00001 us00001 62226 jul 31 11:56 .bash_history
...
同样出于文档目的,我想将我使用的命令行存储在同一个输出文件中。预期的行为和输出是
$ [NEW COMMAND LINE]?
$ cat out-err.dat
[NEW COMMAND LINE] <- This first line would contain the command line used
drwxr-xr-x 39 us00001 us00001 4096 jul 31 14:57 ./
drwxr-xr-x 3 root root 4096 feb 2 06:06 ../
-rw------- 1 us00001 us00001 62226 jul 31 11:56 .bash_history
...
如何才能做到这一点? 我知道我可以编写一个 bash 脚本并执行它,因此该命令将单独记录。我可以进一步编写一个脚本来将命令行回显到文件,然后通过重定向到同一个文件来执行它。我正在寻找一种可能的无脚本解决方案。
编辑:反馈一个不错的答案。这不适合作为评论。
我用 command 测试过echo_command ll echo_command.sh ../dir > out-err.dat 2>&1
。
Script echo_command.sh
,其中 I source
,包含函数的定义。
../dir
是一个不存在的目录,强制一些输出到stderr
.
方法1:效果很好,除了两个问题:
它不理解别名(
ll
在这种情况下;用ls
它替换时)。它不记录重定向部分。
方法2:效果不好。现在重定向部分也打印出来了,但是命令行打印到屏幕而不是重定向到文件。
编辑:对发布的关于script
实用程序的评论的反馈。它用途广泛,使用scriptreplay
.
script
可以单独调用,它会生成一个交互式 shell(它不会保留父 shell 的最近历史记录)
它也可以称为script -c <command> <logfile>
. 最后一种形式与 OP 的目标相对应,但它不会将命令本身存储到日志文件中。它产生(至少在基本情况下)与<command> > <logfile> 2>&1
.
所以看起来这在这里没有用。
你可以使用这样的函数:
例子:
正如蒂姆肯尼迪所说,还有一个非常有用的
script
命令:更新
如果您还需要记录重定向和基本上每个 shell 语法(请注意,我添加了一条
Command line:
消息以轻松识别正在执行的命令):请注意,您应该非常小心使用的引用
eval
:它还一次接受许多命令,而不仅仅是一个:
您可以使用
xtrace
shell 将其正在执行的命令打印到标准输出的机制:$PS4
如果你不喜欢它,从它的默认值(在大多数 shell 中)更改"+ "
为其他任何值(如果你不想要前缀,请将其设为空)。作为一个函数: