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

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

假设我有一个命令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

如果somecommandmount,那么文件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"

相关内容