假设我有一个命令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)
有一个更好的方法吗?
( 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
。
如果somecommand
是mount
,那么文件logfile
最终可能看起来像
+ 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
提示字符串来更改:
( 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
。
这对于简单的命令非常有效,这可能就是您所需要的。对于复合命令,使用script
或类似实用程序的其他答案可能更适合,因为复合命令的 shell 跟踪不会像人们键入它们时那样出现。变量等也将在跟踪输出中扩展。
我会为我经常做的事情制作一个脚本。
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)