怎么影响? bash

时间:2016-02-19 09:13:56

标签: bash

如果有办法影响'?' bash中的变量?

对于常规变量,可以只使用FOO = bar,从而回显$ FOO'将输出栏,但由于某种原因,它不适用于'?'变量。 我找到了两个解决方法,但它们并不令人满意。

首先,可以使用设置$的true和false吗?分别为0和1。

#! /bin/bash
echo $?
true
echo $?
false
echo $?

这将输出xxx,0,1。此变通方法是有限的,因为它只允许影响值0和1.

然后,可以在C(或其他)中编写一些代码,只需通过exit返回参数中的值,然后调用此函数。示例:

#! /bin/bash
rm foo.c
touch foo.c
echo "#include <stdio.h>" >> foo.c
echo "#include <stdlib.h>" >> foo.c
echo "int main(int argc, char **argv)" >> foo.c
echo "{" >> foo.c
echo "    return atoi(argv[1]);" >> foo.c
echo "}" >> foo.c
gcc -o foo foo.c
./foo 42
echo $?

那将输出42.即使它有效,但做一些如此简单的事情是非常讨厌的,更不用说这只是一个简化的版本,没有必须进行的所有检查,以确保不会覆盖任何东西。此外,这需要gcc出现在系统上。

2 个答案:

答案 0 :(得分:2)

如果您只想设置最新的返回代码,则根本不需要涉及C(尽管我想知道您为什么要这样做)。一个简单的shell函数就足够了:

ret() { return $1; }

将其称为ret 42

答案 1 :(得分:0)

当然你知道'$?'保存最后执行的命令的退出代码。如果命令是你自己编写的可执行文件,那么'$?'保留退出代码。 默认值为0(成功)。

总结一下:在您自己的脚本中使用exit

$ ls
$ echo $?
0
$ echo '#!/bin.bash' > script1.sh && chmod u+x script1.sh
$ ./script1.sh
$ echo $?
0
$ echo -e '#!/bin.bash\nexit 42' > script2.sh && chmod u+x script2.sh
$ ./script2.sh
$ echo $?
42

另外,请查看Return value in bash script