假设我有一个命令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
有一个更好的方法吗?
答案1
( exec >logfile 2>&1; set -x; somecommand )
要不就
( set -x; somecommand ) >logfile 2>&1
这将打开(...)
子 shell 中的跟踪并将所有输出重定向到文件logfile
。
如果somecommand
是mount
,那么文件logfile
最终可能看起来像
+ mount
/dev/sd0a on / type ffs (local)
/dev/sd0d on /tmp type ffs (local, nodev, nosuid, softdep)
/dev/sd0e on /var type ffs (local, nodev, nosuid)
/dev/sd0f on /usr type ffs (local, nodev)
/dev/sd0g on /usr/local type ffs (local, nodev, wxallowed)
/dev/sd0h on /home type ffs (local, nodev, nosuid, wxallowed, softdep)
/dev/sd0j on /backup type ffs (local, nodev, nosuid)
/dev/sd0k on /extra type ffs (local, nodev, nosuid, wxallowed, softdep)
mfs:92196 on /tmp_mfs type mfs (asynchronous, local, nodev, nosuid, wxallowed, size=8388608 512-blocks)
命令+␣
前面的(加号和空格)是跟踪提示符或四进制提示符,可以通过设置PS4
提示字符串来更改:
( PS4='$ '; set -x; df /tmp ) >logfile 2>&1
上面可能会产生类似的结果
$ df /tmp
Filesystem 512-blocks Used Avail Capacity Mounted on
/dev/sd0d 10315164 160 9799248 0% /tmp
在logfile
。
这对于简单的命令非常有效,这可能就是您所需要的。对于复合命令,使用或类似实用程序的其他答案script
可能更适合,因为复合命令的 shell 跟踪不会像人们键入它们时那样出现。变量等也将在跟踪输出中扩展。
答案2
你可以这样做:
echo date | script -q bigram-trace.txt
结果:
$ cat bigram-trace.txt
date
sh-4.4$ date
Sun, Feb 18, 2018 6:22:13 PM
sh-4.4$ exit
或者没有管道:
script -q bigram-trace.txt <<'eof'
date
eof
答案3
一种简单方便的方法,特别是如果您不仅要保存一个命令,而是要保存多个命令,方法是首先运行该命令script
,然后运行您的命令。 script
保存每个命令的输入和输出。完成后,键入exit
或 ctrl-D 退出script
。
例如,记录两个命令的输入和输出:
$ script
Script started, file is typescript
$ date
Sun Feb 18 16:59:45 PST 2018
$ for i in {1..3}; do echo $((i**2)); done
1
4
9
$ exit
Script done, file is typescript
要查看保存的信息,cat
文件typescript
:
$ cat typescript
Script started on Sun 18 Feb 2018 04:59:37 PM PST
$ date
Sun Feb 18 16:59:45 PST 2018
$ for i in {1..3}; do echo $((i**2)); done
1
4
9
$ exit
Script done on Sun 18 Feb 2018 05:00:13 PM PST
script
有很多选择。man script
详情请参阅。
答案4
我会为我经常做的事情制作一个脚本。
cat > foo
#! /bin/bash
echo "\$ $1" > "$2"
$1 >> "$2"
^D
chmod +x foo
然后运行
./foo "java -cp src/ nlp.lm.BigramModel atis/ 0.1" "trace/bigram-trace.txt"