Является ли ./ (точка косая черта) командой?

Суть вопроса:

Вопрос возник, когда я не смог установить программное обеспечение, поэтому я искренне спрашиваю об этом ./ потому что я не знал об этом, и вывод «команда не найдена» был сбивает с толку меня о том, что на самом деле команда была.

Контекст:

Я хотел бы установить файл truecrypt-7.2-setup-x86.

Инструкции говорят использовать команду:

sudo ./truecrypt-7.2-setup-x86

Но вывод:

sudo: ./truecrypt-7.2-setup-x86: command not found

ОБНОВЛЕНИЕ: для полноты, в тесте я был в папке с файлом но еще не сделал файл исполняемым (chmod + x).

15
задан 28 October 2017 в 20:41

3 ответа

./ не является командой. Команда является ./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] уже будет иметь права на выполнение, если он предназначен для запуска.)

0
ответ дан 28 October 2017 в 20:41

./часть команды говорит, "Смотрят в текущем каталоге и выполняют команду '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
21
ответ дан 23 November 2019 в 02:38

Как делает команды вызова в работе оболочки

Нет, это не команда. Путем работа оболочек состоит в том, когда Вы вводите в строке текста, первое слово будет рассматриваемым как команду, и если команда не будет одной из оболочки встроенные затем, то оболочка посмотрит на все местоположения, перечисленные в PATH переменная среды.

Что происходит, если то, когда команда Вы хотите работать, находится в том же каталоге, как Вы в настоящее время располагались, но тот каталог не находится в списке PATH каталоги? Именно тогда необходимо использовать ./. Это - способом точно то же как выполнение /bin/bash - Вы говорите оболочку где Ваша желаемая расположенная команда, полный путь к нему. И в случае./Вы говорите для окружения, "смотрят в этом каталоге". Таким образом, важная часть - то, что необходимо быть в том же каталоге, где файл расположен.

Конечно, для фактического выполнения исполняемого файла, он должен иметь исполняемый набор битов, таким образом, Вы должны будете chmod +x ./my_file.

Так важные шаги:

  1. cd где Вы сохранили файл; если это находится в ~/Downloads, затем cd ~/Downloads
  2. Выполненный chmod +x ./truecrypt-7.2-setup-x86 , это говорит "make-файл truecrypt-7.2-setup-x86, который находится в этом исполняемом файле каталога"
  3. И теперь сделайте 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. Вы, возможно, использовали полный путь для того же самого эффекта, но./короче и легче записать.

8
ответ дан 23 November 2019 в 02:38

Другие вопросы по тегам:

Похожие вопросы: