当我执行一个已作为一系列命令别名的命令时,返回到 shell 的值是什么?另外,假设我有一个如下定义的别名:
alias doit 'cd ~/some/dir; ./my_app; cd -'
我怎样才能使返回值./my_app
返回整个别名命令的返回值?
答案1
别名几乎就是文本替换。因此,在别名定义之后,键入doit
相当于键入cd ~/some/dir; ./my_app; cd -
。这是一个语法正确的命令列表,其返回值是序列中最后一个命令的返回值,此处为cd -
。
其他答案展示了保存中间命令状态并返回它的一般方法。但是,在这个特定情况下,有一种更好的方法来表达这个操作序列:不是切换到另一个目录然后再改回来,而是在子 shell 中执行需要不同当前目录的操作,这样 shell 的当前目录就不会发生任何变化。
doit () {
(cd ~/some/dir && ./my_app "$@")
}
我还做了另外两项改进:
- 在命令之间使用
&&
而不是,以便在命令失败时;
不尝试执行。my_app
cd
- 允许将参数传递给
my_app
:如果运行doit foo bar
,my_app
则使用两个参数foo
和进行调用bar
。
答案2
返回的值是最后执行的命令的退出状态。
也许你应该使用一个函数来代替:
函数 doit { cd〜/一些/目录 ./我的应用 本地 X=$? 光盘 - 返回 $X }
从man Bash
:
$? Expands to the status of the most recently executed foreground pipeline.
笔记:该local
命令确保没有修改任何全局变量(同名)。
答案3
shell 中的代码块通常返回块中最后一个命令的返回值。在您的例子中,该命令的返回值是cd -
,它不太可能失败。
我认为你可以通过将该别名转换为 shell 函数来获得你想要的东西:
doit () {
cd ~/some/dir
./my_app
RETVAL=$?
cd -
return $RETVAL
}