Я хотел найти команду read
, поэтому я сделал:
$ which read
Возвращает статус выхода 1. Почему это происходит?
read
это встроенная оболочка, а не внешняя команда. which
говорит только о внешних командах. Предполагая, что вы используете Bash (или какую-то другую оболочку в стиле Bourne), вы обычно должны использовать type
или command -v
вместо which
.
ek@Cord:~$ type read
read is a shell builtin
type
и command
сами являются встроенными оболочками и знают не только о внешних командах, но и о ключевых словах, встроенных функциях, псевдонимах и функциях. which
- это внешняя команда, которая не знает об этих вещах; он знает только о внешних командах. Иногда which
ничего не появляется, когда вы спрашиваете о команде, которую вы можете использовать в вашей оболочке. Иногда это что-то вызывает для команды, но это не то же самое , что , что на самом деле выполняется, когда вы используете команду в своей оболочке.
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, см. Почему бы не использовать «который»? Что использовать тогда?
Если вы немного знаете, как работают UNIX и оболочка, из синтаксиса (read var1 var2 ...
) должно быть очевидно, что ни одна внешняя программа не может установить локальную переменную оболочки, поэтому read
должно встроен в оболочку.
В bash вы получаете не только код выхода 1, но и сообщение типа which: no read in (/home/user/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games)
. Это должно звучать как звонок, если read
все еще найден, он должен быть встроен в оболочку.