每当我打开 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
函数外部使用时会发生什么情况,在中没有记录。source
return
.bash_profile
man bash
不同之处在于脚本或函数的返回代码在 中的内部记录方式bash
。如果您有return
一个值,则该值将被赋予呼叫代码,例如您返回的函数调用或source
命令。由于在 shell 初始化期间返回时没有这样的调用者.bash_profile
,因此该值将被丢弃。您访问的$?
是前一个语句的返回码。
使用苹果的bash-86.1作为参考:
如果您有source
一个脚本,则其内容将被解析并执行,直到遇到语句。其返回值被单独记录,调用者( in )return
负责将其值分配给保存最后一个退出代码的变量:。execute_command_internal
bash-3.2/execute_cmd.c
last_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 专家可以解释更多。
.bashrc
内容:test -f $HOME/existent_file || return 4
打开新终端后:
$ echo $? 0
.bashrc
内容:test -f $HOME/non_existent_file || return 4
打开新终端后:
$ echo $? 1
.bashrc
内容:function foo () { return 4 } foo;
打开新终端后:
$ echo $? 4
.bashrc
内容:return 4
打开新终端后:
$ echo $? 0
与上同
.bashrc
:$ source ~/.bashrc $ echo $? 4
这些命令直接从终端运行:
$ 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
已被阅读,但显然没有来源。