bash 文件中的 Bash“脚本”命令?

bash 文件中的 Bash“脚本”命令?

我有一个 bash 脚本,/usr/bin/local/myscript。我通常从外部软件(在我的例子中为 Autohotkey)运行该文件,基本上我的意思是脚本将立即完成并且窗口关闭,因此我在窗口上看不到任何日志、信息日志或错误日志。所以我确实喜欢“编写”整个运行步骤,以便在程序运行不佳时进行调试。但简单地将 ascript ~/script.txt放在文件的第一行myscript不起作用,我不知道发生了什么,文件的下一行基本上没有执行。那么,是否有一种(正确的)方法在 bash 文件中使用“脚本”,或者是“脚本”的更好替代方案?

答案1

但简单地将 ascript ~/script.txt放在文件的第一行myscript不起作用,我不知道发生了什么,文件的下一行基本上没有执行。

对于 shell 解释来说myscriptscript ~/script.txt只是运行外部可执行文件的命令。可执行文件就是script在这种情况下。

如果可执行文件是sleep, taror 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

  1. 将脚本的 stderr 重定向到日志文件。这可以在脚本中完成

    # just after shebang
    exec 2>/path/to/logfile
    

    如果myscript在其标准输出上生成输出,这很重要并且实际上到达某个地方(通过管道或重定向),那么您不想破坏它。但是,如果它通常打印到终端并且您也想记录它,则将 stderr 和 stdout 重定向到日志文件:

    # just after shebang
    exec 2>/path/to/logfile 1>&2
    

    即使在myscript没有终端的情况下运行,此方法也将起作用。

  2. 或者让脚本bash在最后运行交互式 shell(例如 )。新的 shell 将阻止窗口关闭,您将能够看到脚本到目前为止已打印到终端的内容。这显然需要一个终端。请注意,如果myscript发生在exitkill本身或exec另一个可执行文件上,那么它永远不会到达带有bash;的行。考虑到这一点。

    如果由于某种原因从脚本启动的交互bash清除了终端或其他东西,请改用sleep 3600。关键是您实际上并不需要额外的 shell,您需要任何使终端仿真器保持打开足够长的时间的进程,以便您可以检查以前的输出。

无论您选择哪种方法,都将

set -x

尽早myscript让 shell 解释它并在执行时打印命令和参数。这应该会给您带来有用的见解。

相关内容