读取命令在哪里?

读取命令在哪里?

我想找到该read命令,因此我这样做了:

$ which read

它返回退出状态 1。为什么会发生这种情况?

答案1

read是 shell 的内置命令,而不是外部命令。which仅告诉您有关外部命令的信息。 假设您使用的是 Bash(或其他 Bourne 风格的 shell),您通常应该使用type或 而command -v不是which

ek@Cord:~$ type read
read is a shell builtin

typecommand本身就是 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 中的。

相关内容