有没有简单的方法可以记录shell脚本执行的所有活动?


18

是否有一种简单的方法可以将发生在shell脚本中的所有活动记录到文件中?

我有一个剧本。它输出诸如回显“指令”之类的内容,以及其他程序输出。我知道命令:

command | tee -a "$log_file"

command >> logifle.log

我要问的是是否有用于记录的shell参数,或者我可以使用的set命令等等。如果不需要,我不一定要向文件添加数十个重定向或tee。我仍然想获取标准输出-我也只希望将其记录下来。


5
大声笑,:wq就像我在vim中一样
j0h

1
令我感到困惑的是,大多数人似乎是这样做的,而不是:x
道歉并恢复莫妮卡(Monica)

Answers:


18

如果您通常使用来运行脚本foo.sh,请尝试使用来运行它(假设它是bash脚本)bash -x foo.sh。如果要将所有内容都重定向到文件,请尝试bash -x foo.sh > file.log 2>&1(请注意,我也要重定向stderr,2>&1如果不希望,请删除)。如果您也想看看发生了什么,请bash -x foo.sh 2>&1 | tee log.file


20

有一个非常方便的方法:

使用script使终端会话的打字稿

  1. 启动命令 script

    如果提供了参数file,例如script ~/tmp/outputscript则将对话保存在此文件中。如果未提供文件名,则对话框将保存在文件中typescript

  2. 启动脚本或您想开始的任何事情

  3. 如果脚本完成,请script通过Ctrl- 停止D

  4. 检查默认输出文件中的输出 typescript


script使用一步来启动命令,请使用参数-c

-c COMMAND
    Run the COMMAND rather than an interactive 
    shell. This makes it easy for a script to capture
    the output of a program that behaves differently
    when its stdout is not a tty.

script在脚本内部使用该脚本没有意义,因为script分叉了外壳程序或启动了一个新的外壳程序。

如果存在变量SHELL,则脚本派生的shell将是该shell。如果未设置SHELL,则假定为Bourne外壳。(大多数外壳会自动设置此变量)。


4
@Fabby我喜欢我的回答,但我看不到灰色的小东西;)
AB

我使用script logfilename,所以我选择了它。
waltinator 2015年

我可以从外壳程序中调用“脚本”吗?
2015年

1
这没有任何意义,请参阅我的改进答案。
2015年

1
+1。谢谢您的回答:-) script也可以通过fifo进行监视。来自man script:“ -f, --flush每次写入后刷新输出。这对于远程合作非常有用:一个人可以完成mkfifo foo; script -f foo,另一个人可以实时监视使用来完成的工作cat foo”。它也可以用于监视程序何时等待输入或完成操作,例如通过监视fifo的时间戳。
sudodus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.