Як працюють команди виклику в оболонці
Ні, це не команда. Те, як оболонки працюють, це коли ви вводите рядок тексту, перше слово трактується як команда, а якщо команда не є однією з вбудованих оболонок, то оболонка буде розглядати всі місця, перелічені в PATH
змінній середовища .
Що станеться, якщо команда, яку ви хочете запустити, знаходиться в тому самому каталозі, який ви знаходитесь в даний момент, але цей каталог не знаходиться в списку PATH
каталогів? Ось тоді потрібно використовувати ./
. Це таким же чином, як робити/bin/bash
ви - ви повідомляєте оболонці, де знаходиться бажана команда, повний шлях до неї. А у випадку ./ ви говорите на оболонку "подивіться в цей каталог". Настільки важливою частиною є те, що ви повинні знаходитись у тому самому каталозі, де знаходиться файл.
Звичайно, для того, щоб реально запустити виконуваний файл, він повинен мати встановлений виконуваний біт, тому вам потрібно буде chmod +x ./my_file
.
Тож важливі кроки:
cd
де ви зберегли файл; якщо це в ~/Downloads
, тоcd ~/Downloads
- Виконати
chmod +x ./truecrypt-7.2-setup-x86
, це говорить "зробіть файл truecrypt-7.2-setup-x86, який є в цьому каталозі виконуваним"
- А тепер зробіть
sudo ./truecrypt-7.2-setup-x86
Зауважте, що використання ./
не є випадковою поведінкою, але насправді є стандартом, визначеним стандартом інтерфейсу портативної операційної системи (він же POSIX) , зокрема див. Розділ «Пошук і виконання команд».
Повтор помилки
$ # my script is in ~/Downloads folder
$ stat -c "%n" /home/xieerqi/Downloads/my_script.sh
/home/xieerqi/Downloads/my_script.sh
$ # if I run sudo ./my_script.sh, we get an error
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
$ # of course the command not found because file is not in ./, not in this dir
$ # this is not sudo's problem
$ # but sudo does indeed show the same error even if you're in same directory
$ cd ./Downloads/
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
ПРИМІТКА . Повідомлення про помилку, яке подається, sudo
очевидно, вводить в оману, тому це слід пам’ятати; однак зауважте, що це не було ядром питання, яке задає ОП.
Документація та довідки
З bash
4.3 посібника, розділ "КОМАНДА ВИКОНАННЯ":
Якщо ім'я не є ні функцією оболонки, ні вбудованим і не містить косої риски, bash здійснює пошук у кожному елементі PATH для каталогу, що містить виконавчий файл під цим іменем.
З Чому для запуску цього файлу в bash потрібен ./ (точкою косою рисою) перед назвою сценарію? :
Він працює з ./, оскільки POSIX вказує, що ім'я команди, яке містить /, буде використовуватися безпосередньо як ім'я файлу, пригнічуючи пошук у $ PATH. Ви могли використовувати повний шлях для точно такого ж ефекту, але ./ коротший і простіший для запису.
./
Частина команди говорить «Шукати в поточній директорії, і виконати команду" TrueCrypt-7.2-Setup-x86 "тут». Цю команду потрібно запустити з каталогу, де ви розпакували файл.