我如何通过别名或函数查看外壳中实际运行了什么命令


20

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


$@是您别名的一部分吗?请记住,别名实际上并不支持参数,它将扩展为调用别名的上下文的位置参数(如果有)。通常的运行somealias some args方式是通过扩展别名并保留参数以使其遵循。如果您实际上希望能够访问参数,请使用函数,并在"$@"
ilkkachu


1
@AlonAviv,很好。:)尽管如此,最好还是养成引用的习惯,"$@"否则带有空格或glob字符的参数将被烧毁。
ilkkachu

1
@DarkHeart这没有重复。另一个问题与外壳函数无关。
库沙兰丹

2
在对其进行编辑以完全更改其主题(并使现有答案之一无效)之前,这都不是。
Michael Homer

Answers:


29

set -x在外壳中使用。

$ alias hello='echo hello world!'
$ hello
hello world!

$ set -x
$ hello
+ echo hello world!
hello world!

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

输出将出现在外壳程序的标准错误流上(就像普通提示一样),因此它不会干扰标准输出的重定向,并且将在其前面加上由PS4外壳变量定义的提示(+␣默认情况下)。

具有一些功能的示例:

$ world () { echo "world"; }
$ hello () { echo "hello"; }
$ helloworld () { printf '%s %s!\n' "$(hello)" "$(world)"; }

$ helloworld
hello world!

$ set -x
$ helloworld
+ helloworld
++ hello
++ echo hello
++ world
++ echo world
+ printf '%s %s!\n' hello world
hello world!

我与运行set -x在默认情况下,所有的交互shell。很高兴看到实际执行了什么...但是我注意到可编程的制表符补全等可能会在某些外壳中导致不必要的跟踪输出。


14

你可以使用shell-expand-line,这势必会 Control- Alt- e默认为:

$ bind -p | grep shell-expand-line
"\e\C-e": shell-expand-line

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

$ install dicelab # now press C-Alt-e
$ sudo apt-get install  dicelab # the above line will be replaced with this

这是一个不错的功能。您知道zsh是否具有等效于的命令shell-expand-line吗?
the_velour_fog's

抱歉,我没有,因为我没有使用zsh。但有些人提出了自己的想法:wiki.math.cmu.edu/iki/wiki/tips/20140625-zsh-expand-alias.html
Arkadiusz Drabczyk


1

您可以使用内置的bash 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

$ install() { sudo apt-get install "@"; }

$ type install
install is a function
install () 
{ 
    aptitude install "@"
}
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.