为什么在 Mac 中加载 .bash_profile 返回错误代码 1

为什么在 Mac 中加载 .bash_profile 返回错误代码 1

每当我打开 bash 终端时,都会返回错误代码 1:

Last login: Tue Jan 15 16:19:53 on ttys000
spam@moss:~ $ echo $?
1

我发现这是由我的最后一行代码引起的.bash_profile

test -f $HOME/.debug && export profile_bash_profile='.bash_profile' || return 0

如果我删除此行,则会返回错误代码 0。我不明白此行如何会导致任何问题,因为我可以.bash_profile使用错误代码 0 进行搜索:

spam@moss:~ $ source .bash_profile
spam@moss:~ $ echo $?
0

更新:

有人知道 Mac 如何加载 ~/.bash_profile 吗?我怀疑 Mac 在启动登录 shell 时会提供它。似乎命令return没有按预期运行 - 当我将其return 5作为最后一行~/.bash_profile并启动登录 shell 时,它没有返回错误代码 5(我确信~/.bash_profile这是最后加载的脚本)。

答案1

请注意,在没有脚本(例如来自)的情况下在return函数外部使用时会发生什么情况,在中没有记录。sourcereturn.bash_profileman bash

不同之处在于脚本或函数的返回代码在 中的内部记录方式bash。如果您有return一个值,则该值将被赋予呼叫代码,例如您返回的函数调用或source命令。由于在 shell 初始化期间返回时没有这样的调用者.bash_profile,因此该值将被丢弃。您访问的$?前一个语句的返回码

使用苹果的bash-86.1作为参考:

如果您有source一个脚本,则其内容将被解析并执行,直到遇到语句。其返回值被单独记录,调用者( in )return负责将其值分配给保存最后一个退出代码的变量:。execute_command_internalbash-3.2/execute_cmd.clast_command_exit_value

maybe_execute_file如果它被调用为启动脚本,则通过调用中的run_startup_files函数来加载它bash/shell.c。它不是常规的命令执行:虽然文件的内容(包括最后的)被正确执行,但return没有人关心您返回的实际值。它只是被丢弃。

所以,你在这里看到了什么行为? 本质上与您不带参数调用时相同return:就像return简单地返回其前面的命令的返回代码一样,在您的情况下,这是失败的测试。

如何获得期望的行为?由于您无法exit在不退出 shell 的情况下.bash_profile退出,因此您需要确保紧接在它之前的命令产生所需的返回代码,在本例中:

test -f $HOME/.debug && export profile_bash_profile='.bash_profile' || { true; return; }

答案2

我通过反复试验找到了以下答案。也许 BASH 专家可以解释更多。

  1. .bashrc内容:

    test -f $HOME/existent_file || return 4
    

    打开新终端后:

    $ echo $?
    0
    
  2. .bashrc内容:

    test -f $HOME/non_existent_file || return 4
    

    打开新终端后:

    $ echo $?
    1
    
  3. .bashrc内容:

    function foo () { 
        return 4 
    }
    foo;
    

    打开新终端后:

    $ echo $?
    4
    
  4. .bashrc内容:

    return 4
    

    打开新终端后:

    $ echo $?
    0
    
  5. 与上同.bashrc

    $ source ~/.bashrc
    $ echo $?
    4
    
  6. 这些命令直接从终端运行:

    $ test -f $HOME/existent_file  || return 4
    $ echo $?
    0
    $ test -f $HOME/non_existent_file  || return 4
    bash: return: can only `return' from a function or sourced script
    $ echo $?
    1
    

因此,return仅适用于函数和源文件。我不知道如何用户的帖子~/.bashrc已被阅读,但显然没有来源。

相关内容