Вопрос возник, когда я не смог установить программное обеспечение, поэтому я искренне спрашиваю об этом ./ потому что я не знал об этом, и вывод «команда не найдена» был сбивает с толку меня о том, что на самом деле команда была.
Я хотел бы установить файл truecrypt-7.2-setup-x86
.
Инструкции говорят использовать команду:
sudo ./truecrypt-7.2-setup-x86
Но вывод:
sudo: ./truecrypt-7.2-setup-x86: command not found
ОБНОВЛЕНИЕ: для полноты, в тесте я был в папке с файлом но еще не сделал файл исполняемым (chmod + x).
./
не является командой. Команда является ./truecrypt-7.2-setup-x86
. Ваша оболочка и программы, такие как sudo
, будут обрабатывать команду как путь , если она содержит хотя бы один символ /
. Поскольку .
представляет каталог, в котором вы находитесь в данный момент, ./truecrypt-7.2-setup-x86
присваивает имя файлу truecrypt-7.2-setup-x86
в текущем каталоге. Если такого файла нет или он не может быть запущен, вы получите сообщение об ошибке.
Когда команда не содержит косой черты, ее ищут в каталогах, перечисленных в $PATH
, как Сергей Колодяжный говорит . Текущий каталог не ищется автоматически - и не рекомендуется , чтобы поместить .
в $PATH
. Таким образом, вы случайно не запускаете вещи, которые не ожидали запустить, потому что у вас было cd
d к каталогу, который их содержит.
Запись ./
перед именем исполняемого файла в текущем каталоге обычным способом его запуска, но на самом деле это не специальный синтаксис. Например, если вы испортили $PATH
и вам нужно было выполнить команду типа ls
, вы могли бы написать /bin/ls
. Нет .
необходимо в этом случае или в целом; что-то нужно /
где-то в имени пути, чтобы показать, что вы имеете в виду, что это имя пути.
Поскольку .
всегда является текущим каталогом, а /
- просто разделителем каталогов, первое, что нужно сделать, это проверить, действительно ли названный вами файл действительно существует в текущем каталоге. (Если это так, то проверьте его разрешения , как Чарльз Грин объясняет . Но если вы извлекли файл из архива, то он обычно [ 1126] уже будет иметь права на выполнение, если он предназначен для запуска.)
./часть команды говорит, "Смотрят в текущем каталоге и выполняют команду 'truecrypt-7.2-setup-x86' отсюда". Необходимо выполнить эту команду из каталога, где Вы распаковали файл.
Это может быть протестировано: В том же окне терминала, где Вы пробуете команду, введите команду ls -l true*
- если файл будет присутствовать в текущем рабочем каталоге, то список, показывающий файл (и набор дополнительной информации), будет отображен.
Как Zanna отметил в комментариях, Ваш файл не может иметь, выполняют полномочия - это может быть зафиксировано легко. Как тестовый сценарий, мои шоу каталога
chick@dad:~/test$ ls -l
total 4
-rw-r--r-- 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$
и файл "rFullBack" перечисляет '-rw-' как мое разрешение, чтобы считать и записать файл. Я могу выполнить команду chmod +x rFullBack
и каталог, перечисляющий изменения в
chick@dad:~/test$ ls -l
total 4
-rwxr-xr-x 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$
Там мои полномочия теперь '-rwx', указывая, что я могу выполнить файл.
Короче говоря, если файл существует в Вашем каталоге
выполните команду
chmod +x ./truecrypt-7.2-setup-x86
и затем команда
sudo ./truecrypt-7.2-setup-x86
Нет, это не команда. Путем работа оболочек состоит в том, когда Вы вводите в строке текста, первое слово будет рассматриваемым как команду, и если команда не будет одной из оболочки встроенные затем, то оболочка посмотрит на все местоположения, перечисленные в PATH
переменная среды.
Что происходит, если то, когда команда Вы хотите работать, находится в том же каталоге, как Вы в настоящее время располагались, но тот каталог не находится в списке PATH
каталоги? Именно тогда необходимо использовать ./
. Это - способом точно то же как выполнение /bin/bash
- Вы говорите оболочку где Ваша желаемая расположенная команда, полный путь к нему. И в случае./Вы говорите для окружения, "смотрят в этом каталоге". Таким образом, важная часть - то, что необходимо быть в том же каталоге, где файл расположен.
Конечно, для фактического выполнения исполняемого файла, он должен иметь исполняемый набор битов, таким образом, Вы должны будете chmod +x ./my_file
.
Так важные шаги:
cd
где Вы сохранили файл; если это находится в ~/Downloads
, затем cd ~/Downloads
chmod +x ./truecrypt-7.2-setup-x86
, это говорит "make-файл truecrypt-7.2-setup-x86, который находится в этом исполняемом файле каталога" sudo ./truecrypt-7.2-setup-x86
Отметьте то использование ./
не случайное поведение, но на самом деле стандарт, указанный стандартом Интерфейса Переносимой информационной системы (иначе POSIX), конкретно см. раздел "Command Search and Execution".
$ # 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 руководства, раздел "COMMAND EXECUTION":
Если имя не является ни функцией оболочки, ни встроенным, и не содержит наклонных черт, удар ищет каждый элемент ПУТИ для каталога, содержащего исполняемый файл тем именем.
От того, Почему Вам нужен./(точечная наклонная черта) перед названием сценария для выполнения его в ударе?:
Это работает с./, потому что POSIX указывает, что название команды, которые содержат / будет использоваться в качестве имени файла непосредственно, подавляя поиск в $PATH. Вы, возможно, использовали полный путь для того же самого эффекта, но./короче и легче записать.