我想找到该read
命令,因此我这样做了:
$ which read
它返回退出状态 1。为什么会发生这种情况?
答案1
read
是 shell 的内置命令,而不是外部命令。which
仅告诉您有关外部命令的信息。 假设您使用的是 Bash(或其他 Bourne 风格的 shell),您通常应该使用type
或 而command -v
不是which
。
ek@Cord:~$ type read
read is a shell builtin
type
和command
本身就是 shell 内置命令,它们不仅知道外部命令,还知道关键字、内置命令、别名和函数。which
是一个不知道这些事情的外部命令;它只知道外部命令。有时which
当你询问它关于你能在你的 shell 中使用。有时它确实会为命令显示一些内容,但它不是相同的在 shell 中使用该命令时实际运行的东西。
ek@Cord:~$ type type command which
type is a shell builtin
command is a shell builtin
which is /usr/bin/which
在 Bash 中,你可以按照命令的尝试顺序查看命令当前可能的所有含义,使用以下命令type -a
:
ek@Cord:~$ type -a read
read is a shell builtin
ek@Cord:~$ type -a echo
echo is a shell builtin
echo is /bin/echo
有关为什么通常不应使用which
以及在包括 Bash 在内的各种 shell 中应使用什么的更多信息,请参阅为什么不使用“which”?那么用什么呢?
答案2
如果你对 UNIX 和 shell 的工作原理有一点了解,那么从语法 ( read var1 var2 ...
) 中应该可以明显看出,没有外部程序可以设置本地 shell 变量,因此read
必须内置于外壳中。
在 bash 中,您不仅会得到退出代码 1,还会得到类似这样的消息which: no read in (/home/user/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games)
。这应该提醒您,如果read
仍然发现,则它一定是内置在 shell 中的。