在 Bash 中执行命令时是否可以打印所有命令?

Elp*_*Kay 1 bash

如何在执行 shell 命令时回显它们,我已经学会了如何set -v在执行命令时使用打印命令。如果set -v在开始时添加foo.shbash -v foo.sh运行,则效果很好。但是,如果通过或 简单地foo.sh调用,则不会打印中的命令。是否有一个全局开关可以使所有命令和函数通过所有调用的脚本在执行时打印出来?bar.shbash bar.sh./bar.shbar.sh

ogu*_*ail 8

是否有一个全局开关可以使所有命令和函数通过所有调用的脚本在执行时打印出来?

是的,BASH_ENV可以用于那个。手册描述如下。

如果在调用 Bash 执行 shell 脚本时设置了这个变量,它的值将被扩展并用作执行脚本之前要读取的启动文件的名称。

因此,您可以在调用第一个脚本时放入set -v一个文件并为其分配路径BASH_ENV。例如:

$ cat env.sh
set -v
$
$ cat foo
#!/bin/bash
true
./bar
$
$ cat bar
#!/bin/bash
false
Run Code Online (Sandbox Code Playgroud)
$ BASH_ENV=./env.sh ./foo
#!/bin/bash
true
./bar
#!/bin/bash
false
Run Code Online (Sandbox Code Playgroud)

或者,要在无需创建额外文件的情况下执行此操作,您可以使用虚构的SHELLOPTS值启动脚本

# too long, and might require adjustments for future versions
env SHELLOPTS=braceexpand:hashall:interactive-comments:verbose ./foo
Run Code Online (Sandbox Code Playgroud)

或者,通过set命令或通过添加-vSHELLOPTS第一个脚本中的 shebang 和导出来启用详细信息。

set -v
# exports all options, not only `verbose'
export SHELLOPTS
# the rest of the script
Run Code Online (Sandbox Code Playgroud)