如何通过别名或函数查看 shell 中实际运行的命令

Alo*_*viv 24 shell bash debugging

我有一个 bash 函数(或别名),例如function install() {sudo apt-get install $@}. 运行命令时install dicelab,我期望实际运行的是sudo apt-get install dicelab. 我在哪里可以看到 shell 实际运行了什么?我想确保我更复杂的别名按预期工作。

Kus*_*nda 32

set -x在外壳中使用。

$ alias hello='echo hello world!'
$ hello
hello world!
Run Code Online (Sandbox Code Playgroud)
$ set -x
$ hello
+ echo hello world!
hello world!
Run Code Online (Sandbox Code Playgroud)

使用set -x在转弯xtrace外壳选项(set +x将其关闭),并应在工作的所有类似Bourne炮弹一样bashdash ksh93pdkshzsh。这会提示 shell 显示在执行别名扩展和变量扩展等之后执行的命令。

输出将在 shell 的标准错误流中(就像普通提示一样),因此它不会干扰标准输出的重定向,并且它前面会有一个由PS4shell 变量定义的提示(通常+?是默认的)。

几个函数的例子:

$ world () { echo "world"; }
$ hello () { echo "hello"; }
$ helloworld () { printf '%s %s!\n' "$(hello)" "$(world)"; }
Run Code Online (Sandbox Code Playgroud)
$ helloworld
hello world!
Run Code Online (Sandbox Code Playgroud)
$ set -x
$ helloworld
+ helloworld
++ hello
++ echo hello
++ world
++ echo world
+ printf '%s %s!\n' hello world
hello world!
Run Code Online (Sandbox Code Playgroud)

使用您的具体示例(更正语法并添加引号):

$ install () { sudo apt-get install "$@"; }
$ set -x
$ install dicelab
+ install dicelab
+ sudo apt-get install dicelab
bash: sudo: command not found
Run Code Online (Sandbox Code Playgroud)

sudo我的系统上没有使用或拥有,因此该错误是意料之中的。)

请注意,有一个已调用的通用实用程序install,因此aptin如果您在某个时候想要使用该实用程序,则可能需要将您的函数命名为其他名称 ( ?)。


请注意,跟踪输出是调试输出。它表示shell 在执行您的命令时正在执行的操作。您在屏幕上看到的输出可能不适合 shell 输入。

另请注意,我在bash上面使用。其他 shell 可能有另一个默认的跟踪提示(例如,zsh包含字符串zsh和当前命令的历史编号),或者可能不像bash嵌套调用那样“堆叠”提示。


我正在运行我曾经set -x在我所有的交互式 shell 中默认运行。很高兴看到实际执行了什么......但我注意到可编程选项卡完成等可能会导致某些 shell 中出现不需要的跟踪输出,并且某些 shell 在其默认跟踪输出中有点冗长(例如zsh)。


Ark*_*zyk 14

您可以使用shell-expand-line, 绑定到 Control- Alt-e默认情况下:

$ bind -p | grep shell-expand-line
"\e\C-e": shell-expand-line
Run Code Online (Sandbox Code Playgroud)

除其他事项外,它将替换别名与他们定义当前行,所以你可以看到你还是一个命令运行。例子:

$ install dicelab # now press C-Alt-e
$ sudo apt-get install  dicelab # the above line will be replaced with this
Run Code Online (Sandbox Code Playgroud)


bel*_*kka 6

使用内置命令type查看您要运行的别名或函数定义

此解决方案不需要运行命令

$ type ls
ls is aliased to `ls --color=auto -p'
$ type -a ls
ls is aliased to `ls --color=auto -p'
ls is /bin/ls
Run Code Online (Sandbox Code Playgroud)

From help type-a显示包含名为 NAME 的可执行文件的所有位置;包括别名、内置函数和函数,当且仅当未使用“-p”选项时

$ function hello() { echo hello; }  # define function
$ type hello
hello is a function
hello () 
{ 
    echo hello
}
Run Code Online (Sandbox Code Playgroud)