bash中复杂别名的返回值是多少?


2

当我执行一个命令作为一系列命令的别名时,返回给shell的值是什么?另外,假设我有一个像这样定义的别名:

alias doit 'cd ~/some/dir; ./my_app; cd -'

如何创建返回./my_app整个别名命令返回值的返回值?

Answers:


4

别名几乎是文本替代。因此,在别名定义之后,键入doit等同于键入cd ~/some/dir; ./my_app; cd -。这是一个语法正确的命令列表,其返回值是序列中最后一个命令的返回值cd -

其他答案显示了保存中间命令状态并返回它的一般方法。但是,在这种特定情况下,有一种更好的方式来表达这一系列的操作:不是更改到另一个目录然后再​​更改,而是执行需要子shell内不同的当前目录的操作,以便当前目录的shell根本不会改变。

doit () {
  (cd ~/some/dir && ./my_app "$@")
}

我做了两个额外的改进:

  • 使用&&而不是;在命令之间使用,以便my_appcd命令失败时不尝试执行。
  • 要传递给允许的参数my_app:如果您运行doit foo barmy_app被调用,有两个参数foobar

非常好的回答,谢谢!一个问题:是什么导致它在子shell中运行?它是括号中的命令包装还是它们在shell函数中运行的事实?
2010年

@heavyd:括号是子shell的语法。shell函数中的代码不会与其上下文隔离,因此您可以cd在函数中运行并使其影响调用者。
Gilles 2010年

1

返回的值是最后执行的命令的退出状态。

也许你应该使用一个函数:

功能
{
    cd~ / some / dir
    ./my_app
    本地X = $?
    cd  - 
    返回$ X.
}

来自man Bash

$? Expands to the status of the most recently executed foreground pipeline.

注意:local命令确保不修改全局变量(具有相同名称)。


0

shell中的代码块通常返回块中最后一个命令的返回值。在你的情况下,那将是cd -,这不太可能失败。

我认为你可以通过将别名转换为shell函数来获得你想要的东西:

doit () {  
    cd ~/some/dir  
    ./my_app  
    RETVAL=$?  
    cd -  
    return $RETVAL  
}
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.