如何将命令及其执行输出同时保存到文件中

zac*_*ack 6 shell

假设我有一个命令java -cp src/ nlp.lm.BigramModel wsj/ 0.1,我想将命令本身和命令执行输出同时保存到文件中。

做到这一点的一种方法是

echo "$ java -cp src/ nlp.lm.BigramModel atis/ 0.1" > trace/bigram-trace.txt    
java -cp src/ nlp.lm.BigramModel atis/ 0.1 >> trace/bigram-trace.txt
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

Kus*_*nda 5

( exec >logfile 2>&1; set -x; somecommand )\n
Run Code Online (Sandbox Code Playgroud)\n\n

要不就

\n\n
( set -x; somecommand ) >logfile 2>&1\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将打开(...)子 shell 中的跟踪并将所有输出重定向到文件logfile

\n\n

如果somecommandmount,那么文件logfile最终可能看起来像

\n\n
+ mount\n/dev/sd0a on / type ffs (local)\n/dev/sd0d on /tmp type ffs (local, nodev, nosuid, softdep)\n/dev/sd0e on /var type ffs (local, nodev, nosuid)\n/dev/sd0f on /usr type ffs (local, nodev)\n/dev/sd0g on /usr/local type ffs (local, nodev, wxallowed)\n/dev/sd0h on /home type ffs (local, nodev, nosuid, wxallowed, softdep)\n/dev/sd0j on /backup type ffs (local, nodev, nosuid)\n/dev/sd0k on /extra type ffs (local, nodev, nosuid, wxallowed, softdep)\nmfs:92196 on /tmp_mfs type mfs (asynchronous, local, nodev, nosuid, wxallowed, size=8388608 512-blocks)\n
Run Code Online (Sandbox Code Playgroud)\n\n

命令+\xe2\x90\xa3前面的(加号和空格)是跟踪提示符或四进制提示符,可以通过设置PS4提示字符串来更改:

\n\n
( PS4='$ '; set -x; df /tmp ) >logfile 2>&1\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面可能会产生类似的结果

\n\n
$ df /tmp\nFilesystem  512-blocks      Used     Avail Capacity  Mounted on\n/dev/sd0d     10315164       160   9799248     0%    /tmp\n
Run Code Online (Sandbox Code Playgroud)\n\n

logfile

\n\n

这对于简单的命令非常有效,这可能就是您所需要的。对于复合命令,使用script或类似实用程序的其他答案可能更适合,因为复合命令的 shell 跟踪不会像人们键入它们时那样出现。变量等也将在跟踪输出中扩展。

\n


hsc*_*hou 0

我会为我经常做的事情制作一个脚本。

cat > foo
#! /bin/bash
echo "\$ $1" > "$2"
$1 >> "$2"
^D
chmod +x foo
Run Code Online (Sandbox Code Playgroud)

然后运行

./foo "java -cp src/ nlp.lm.BigramModel atis/ 0.1" "trace/bigram-trace.txt"
Run Code Online (Sandbox Code Playgroud)