Как работает вызов команд в оболочке
Нет, это не команда. Способ работы оболочек заключается в том, что при вводе строки текста первое слово будет рассматриваться как команда, и если команда не является одной из встроенных в оболочку, оболочка будет просматривать все местоположения, перечисленные в 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
явно, вводит в заблуждение, поэтому об этом следует помнить; Однако, пожалуйста, обратите внимание, что это не было был суть вопроса, который задает OP.
Документация и ссылки
Из bash
руководства по 4.3, раздел «КОМАНДА ИСПОЛНЕНИЯ»:
Если имя не является ни функцией оболочки, ни встроенной функцией и не содержит косых черт, bash ищет в каждом элементе PATH каталог, содержащий исполняемый файл с этим именем.
От чего вам нужно ./ (точка-косая черта) перед именем скрипта, чтобы запустить его в bash? :
Он работает с ./, потому что POSIX указывает, что имя команды, содержащее /, будет использоваться как имя файла напрямую, подавляя поиск в $ PATH. Вы могли бы использовать полный путь для того же эффекта, но ./ короче и проще для написания.
./
Часть команды говорит «Искать в текущей директории, и выполнить команду„TrueCrypt-7.2-Setup-x86“здесь». Вам нужно запустить эту команду из каталога, куда вы распаковали файл.