在UNIX中,$?返回值为127的含义是什么?
当给定的命令未在你的PATH
系统变量中找到且不是内置的shell命令时,/bin/sh
返回值127。换句话说,系统无法理解你的命令,因为它不知道如何找到你要调用的二进制文件。
一般而言,它的意思是:
127 - 命令未找到
但它也可能意味着命令已被找到,
但是该命令所需的库未被找到。
127 - command not found
例子: $caat 错误信息将会是:
bash:
caat: 命令未找到
现在你可以使用echo $?
来检查。
For the shell’s purposes, a command which exits with a zero exit status has succeeded. An exit status
of zero indicates success. A non-zero exit status indicates failure. When a command terminates on a
fatal signal N, bash uses the value of 128+N as the exit status.
If a command is not found, the child process created to execute it returns a status of 127. If a com-
mand is found but is not executable, the return status is 126.
If a command fails because of an error during expansion or redirection, the exit status is greater than
zero.
Shell builtin commands return a status of 0 (true) if successful, and non-zero (false) if an error
occurs while they execute. All builtins return an exit status of 2 to indicate incorrect usage.
Bash itself returns the exit status of the last command executed, unless a syntax error occurs, in
which case it exits with a non-zero value. See also the exit builtin command below.
它没有特别的意义,除了最后一个退出的进程以状态码 127 退出。
然而,如果你使用 bash 作为 shell,它也用于告诉你尝试执行的命令无法执行(即找不到该命令)。如果进程以状态码 127 退出或找不到该命令,则很遗憾无法立即推断出原因。
编辑:
除了控制台上的输出,它不能立即被推断出来,但这里是 Stack Overflow,所以我假设你是在脚本中执行此操作。
如果您尝试使用脚本语言运行程序,您可能需要包含脚本语言的完整路径和要执行的文件。例如:
exec('/usr/local/bin/node /usr/local/lib/node_modules/uglifycss/uglifycss in.css > out.css');
-bash: ./my_script: /bin/bash^M: bad interpreter: No such file or directory
最好的方法是在整个文件中放置一个echo语句,并验证是否抛出了相同的错误。除了给出的答案外,还要注意在使用 /bin/sh
作为你的 shell 的情况下,以错误的行尾字符运行脚本文件也可能导致 127
退出代码。
例如,在基于 UNIX 的系统中以 CRLF 行尾字符运行 shell 脚本并使用 /bin/sh
shell 时,可能会遇到一些错误,就像我在运行名为 my_test.sh
的脚本后遇到的以下错误:
$ ./my_test.sh
sh: 2: ./my_test.sh: not found
$ echo $?
127
/bin/bash
,我得到了126
的退出代码,这与gnu.org关于bash
的文档相符:
最后,这是在如果找不到命令,则创建用于执行它的子进程返回状态
127
。如果找到命令但无法执行,则返回状态为126
。
/bin/bash
中运行我的脚本的结果:arman@Debian-1100:~$ ./my_test.sh
-bash: ./my_test.sh: /bin/bash^M: bad interpreter: No such file or directory
arman@Debian-1100:~$ echo $?
126
which [程序名]
命令来查看操作系统正在使用哪个二进制文件。如果没有输出结果,接下来需要检查执行权限和 PATH 环境变量。 - four43type
,它是一个Shell内置命令,可以识别所有这些内容。 - Charles Duffy126
(“权限被拒绝”),而不是127
;同样,尝试执行一个_目录_也会导致126
(“是一个目录”)。 - mklement0