Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 从另一个脚本中获取shell脚本并检查返回代码_Bash_Shell - Fatal编程技术网

Bash 从另一个脚本中获取shell脚本并检查返回代码

Bash 从另一个脚本中获取shell脚本并检查返回代码,bash,shell,Bash,Shell,我想从另一个脚本中获取一个文件,例如name.sh,并检查返回代码,确定它的错误代码。如果我使用 source name.sh 然后,如果name.sh返回非零返回代码,我的主脚本将停止运行,但我需要决定退出代码是否继续或停止 如果我使用 ret_code="`source name.sh`" echo $ret_code 然后ret_代码为空,不打印错误代码。 我不能用这些: sh name.sh ./name.sh bash name.sh 因为name.sh不是可执行的,我不希望它是

我想从另一个脚本中获取一个文件,例如name.sh,并检查返回代码,确定它的错误代码。如果我使用

source name.sh
然后,如果name.sh返回非零返回代码,我的主脚本将停止运行,但我需要决定退出代码是否继续或停止

如果我使用

ret_code="`source name.sh`"
echo $ret_code
然后ret_代码为空,不打印错误代码。 我不能用这些:

sh name.sh
./name.sh
bash name.sh

因为name.sh不是可执行的,我不希望它是可执行的

返回代码应该在变量
$?
中。您可以执行以下操作:

source name.sh         # Execute shell script
ret_code=$?            # Capture return code
echo $ret_code

文件不需要是可执行文件才能运行
sh name.sh
。然后使用
$?

sh name.sh
ret_code=$?

在Amin中,name.sh的返回值只是最后执行的命令的返回值。像往常一样使用
$?
访问它

捕获返回代码的最简单方法是构造“name.sh”,这样失败的命令将导致不再执行任何命令(这可能会成功,然后掩盖错误)。因为您使用的是bash,所以也可以使用函数。只需将逻辑移到函数中并调用它。这样,您的
name.sh
就变成了一个单行程序,
$?
的值将是函数返回的任何值

例如:

# cat fred
function f() {complicated; logic; here; export FRED="asdf";return 1;}
f
# source fred
# echo $?
1
# echo $FRED
asdf
但是,如果您将逻辑放入函数中,那么您也可以对该文件进行源处理,然后在空闲时调用该函数

# cat fred
function f() {complicated; logic; here; export FRED="asdf";return 1;}
# source fred
# f && echo "that worked!" || echo "failed again"
failed again
# echo $FRED
asdf

为什么不将“name.sh”的可执行代码封装在函数中?@doukremt因为我的脚本应该在目录中运行一系列其他脚本反标记(```)生成一个从属shell,然后执行
source name.sh
;这相当于
bash name.sh
(假设$SHELL是bash)。如果使用source name.sh if name.sh包含exit 1,则代码停止以继续使用
source
的目的是在当前SHELL中运行脚本。因此,
退出
也将停止当前shell。您最初的问题明确要求使用
源代码
,我假设您知道后果。我已经提到,如果我使用源代码,会出现什么问题,但无论如何感谢您的帮助,我认为您误解了Amin的要求。他正在寻找文件来源,而不是运行它。寻源的返回值只是最后执行的命令的返回值。