我有一个 bash 脚本,/usr/bin/local/myscript。我通常从外部软件(在我的例子中为 Autohotkey)运行该文件,基本上我的意思是脚本将立即完成并且窗口关闭,因此我在窗口上看不到任何日志、信息日志或错误日志。所以我确实喜欢“编写”整个运行步骤,以便在程序运行不佳时进行调试。但简单地将 ascript ~/script.txt
放在文件的第一行myscript
不起作用,我不知道发生了什么,文件的下一行基本上没有执行。那么,是否有一种(正确的)方法在 bash 文件中使用“脚本”,或者是“脚本”的更好替代方案?
答案1
但简单地将 a
script ~/script.txt
放在文件的第一行myscript
不起作用,我不知道发生了什么,文件的下一行基本上没有执行。
对于 shell 解释来说myscript
,script ~/script.txt
只是运行外部可执行文件的命令。可执行文件就是script
在这种情况下。
如果可执行文件是sleep
, tar
or ls
,您会期望 shell 等到可执行文件完成后再解释myscript
.这没有script
什么不同:shell 等待script
完成。
script
旨在用于交互式使用。script ~/script.txt
运行一个交互式 shell,它不是解释的 shell myscript
。您写了“窗口关闭”(当没有 时script
),所以我假设myscript
在某个显示窗口的终端模拟器中运行。如果是这样,那么(使用script
)您可能会看到这个内壳由 启动script
,并且可以在外壳等待时与其交互。script
记录您在内壳中所做的事情。退出内壳终止script
,然后外壳(即myscript
)继续。但也许你关闭了终端模拟器,外壳收到 SIGHUP 并且不再继续。
这并不重要,因为现在应该清楚,即使外壳继续运行,script
从内部调用myscript
也无法帮助您进行调试。myscript
至少有两种调试方法myscript
:
将脚本的 stderr 重定向到日志文件。这可以在脚本中完成
# just after shebang exec 2>/path/to/logfile
如果
myscript
在其标准输出上生成输出,这很重要并且实际上到达某个地方(通过管道或重定向),那么您不想破坏它。但是,如果它通常打印到终端并且您也想记录它,则将 stderr 和 stdout 重定向到日志文件:# just after shebang exec 2>/path/to/logfile 1>&2
即使在
myscript
没有终端的情况下运行,此方法也将起作用。或者让脚本
bash
在最后运行交互式 shell(例如 )。新的 shell 将阻止窗口关闭,您将能够看到脚本到目前为止已打印到终端的内容。这显然需要一个终端。请注意,如果myscript
发生在exit
或kill
本身或exec
另一个可执行文件上,那么它永远不会到达带有bash
;的行。考虑到这一点。如果由于某种原因从脚本启动的交互
bash
清除了终端或其他东西,请改用sleep 3600
。关键是您实际上并不需要额外的 shell,您需要任何使终端仿真器保持打开足够长的时间的进程,以便您可以检查以前的输出。
无论您选择哪种方法,都将
set -x
尽早myscript
让 shell 解释它并在执行时打印命令和参数。这应该会给您带来有用的见解。