Набирая cp, ты не пишешь, где лежит программа: оболочка находит её сама. Где она ищет, покажут echo $PATH и type.
Если в имени команды нет /, Bash сначала проверяет свои встроенные команды, например cd и pwd. Потом ищет файл с таким именем в каталогах из PATH. PATH — переменная окружения: именованное значение, которое оболочка передаёт запущенным программам. Его значение — список каталогов через двоеточие.
echo $PATH печатает этот список: на учебной машине он начинается с /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin. Каталоги проверяются слева направо, и запускается первый найденный файл.
type показывает, что Bash нашёл по имени: cp is /usr/bin/cp — файл из PATH, cd is a shell builtin — встроенная команда, not found — ничего. Если cp уже запускалась в этой оболочке, type напечатает cp is hashed (/usr/bin/cp): Bash запомнил найденный путь.
Если в имени есть /, поиска нет: ~/tools/lab-status и ./lab-status указывают на файл напрямую. Точка в ./lab-status — текущий каталог, как в уроке о путях.
Ты перешёл в каталог ~/tools и набираешь lab-status. Что напечатает оболочка?
-
Текущий каталог в PATH не входит, и Bash его не проверяет. Из этого каталога сработает
./lab-status. -
До запуска дело не доходит: имя не нашлось ни среди встроенных команд, ни в каталогах PATH.
type lab-statusнапечатаетnot found. -
typeтолько показывает результат поиска и ничего не меняет. Выполниtype lab-statusдважды — вывод будет тем же.
Для имени без / Bash просматривает каталоги из PATH, и текущего каталога среди них нет. Файл рядом запускают путём: ./lab-status.
Главное в шаге
-
Имя без
/Bash ищет среди встроенных команд, потом в каталогах PATH слева направо. -
Имя с
/— путь к файлу:./lab-statusзапускает файл из текущего каталога без поиска. -
type имяпоказывает, что запустится: встроенная команда, файл из PATH или ничего.