Linux shell如何获得$的返回码值?变量?

时间:2015-11-18 10:12:19

标签: shell exit-code waitpid

Linux shell是否执行fork / exec然后waitpid()获取返回代码以填充$?变量,每次执行某事?

1 个答案:

答案 0 :(得分:3)

是的,这正是它的作用。

如果您感兴趣,可以通过在command: guessit -j "Агенты А.Н.К.Л. (The Man from U.N.C.L.E.).2015.WEB-DLRip.mp4" Traceback (most recent call last): File "D:\Soft\Python27\Scripts\guessit-script.py", line 9, in <module> load_entry_point('guessit==2.0b3', 'console_scripts', 'guessit')() File "build\bdist.win32\egg\guessit\__main__.py", line 150, in main File "build\bdist.win32\egg\guessit\__main__.py", line 40, in guess_filename UnicodeEncodeError: 'ascii' codec can't encode characters in position 11-16: ordinal not in range(128) 下运行shell来获取此信息(一种拦截并打印程序所有系统调用的工具)。

strace

这给出了以下输出,修剪得很多:

strace bash -c '/usr/bin/ls > /dev/null; echo $?'

我使用了一个包含两个命令的bash脚本,因为否则bash不会fork,而只是执行命令,替换它自己(我发现它有用的优化!)

在输出中,execve("/usr/bin/bash", ["bash", "-c", "/usr/bin/ls > /dev/null; echo $?"], [/* 58 vars */]) = 0 [....] clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff16c3d69d0) = 1189 [....] wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 1189 [....] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1189, si_uid=1000, si_status=0, si_utime=0, si_stime=0} --- wait4(-1, 0x7ffd3096b290, WNOHANG, NULL) = -1 ECHILD (No child processes) [....] exit_group(0) = ? +++ exited with 0 +++ clone函数后面的系统调用,同样forkwait4调用。您没有看到waitpid,因为在子进程中发生了这种情况,我们没有要求exec跟踪。如果您添加strace,它会这样做,但也会跟踪-f进程的内容。