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

16

Ядро вопроса:

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

Контекст:

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

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

sudo ./truecrypt-7.2-setup-x86

Но выход:

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

UPDATE: для полноты, в тесте, я был в папке с файлом, но еще не выполнил исполняемый файл (chmod + x).

    
задан ubuntubu 27.10.2017 в 12:56
источник

3 ответа

24

./ не является командой. Команда ./truecrypt-7.2-setup-x86 .

Ваша оболочка и такие программы, как sudo , будут обрабатывать команду как путь , если она содержит хотя бы один символ / . Поскольку . представляет любую директорию, в которой вы сейчас находитесь, ./truecrypt-7.2-setup-x86 называет файл truecrypt-7.2-setup-x86 в текущем каталоге. Если такого файла нет или есть файл, который не может быть запущен, вы получите сообщение об ошибке.

Когда команда не содержит косой черты, ее ищут каталоги, перечисленные в $PATH . , как Сергей Колодяжный говорит . Текущий каталог не будет автоматически искать - и not рекомендуется поместить . в $PATH . Таким образом, вы случайно не запускаете то, чего не ожидали запустить, потому что у вас было cd d в каталоге, который их содержит.

Написание ./ перед именем исполняемого файла в текущем каталоге общий путь для его запуска, но это на самом деле не является особым синтаксисом. Например, если вы испортили свой $PATH и вам нужно было выполнить команду, например ls , вы могли бы написать /bin/ls . В этом случае или вообще не требуется . ; необходимо, чтобы / где-то в пути, чтобы обозначить, что вы имеете в виду, что это путь.

Так как . всегда является текущим каталогом, а / - это только разделитель каталогов, первое, что нужно сделать, это проверить, что файл, который вы назвали, действительно существует в текущем каталоге. (Если это так, проверьте его разрешения , а ответ дан Eliah Kagan 27.10.2017 в 14:15

источник
21

.. / часть команды говорит: «Посмотрите в текущем каталоге и выполните команду« truecrypt-7.2-setup-x86 »отсюда». Вам нужно запустить эту команду из каталога, в котором вы распаковали файл.

Это можно протестировать: в том же окне терминала, где вы пытаетесь выполнить команду, введите команду ls -l true* - если файл присутствует в текущем рабочем каталоге, то список, содержащий файл (и кучу дополнительных информация).

Как заметила Zanna в комментариях, у вашего файла могут быть разрешения на выполнение - это можно легко устранить. В качестве тестового примера в моем каталоге отображается

[email protected]:~/test$ ls -l
total 4
-rw-r--r-- 1 chick chick 788 Oct 27 06:15 rFullBack
[email protected]:~/test$

и файл «rFullBack» перечисляет «-rw-» как мое разрешение, чтобы прочитать и записать файл. Я могу выполнить команду chmod +x rFullBack , а список каталогов изменится на

[email protected]:~/test$ ls -l
total 4
-rwxr-xr-x 1 chick chick 788 Oct 27 06:15 rFullBack
[email protected]:~/test$

Там мои разрешения теперь «-rwx», указывая, что я могу выполнить файл.

Короче говоря, если файл существует в вашем каталоге

запустите команду

chmod +x ./truecrypt-7.2-setup-x86

, а затем команда

sudo ./truecrypt-7.2-setup-x86
    
ответ дан Charles Green 27.10.2017 в 13:24
8

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

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

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

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

Итак, важные шаги:

  1. cd , где вы сохранили файл ; если он находится в ~/Downloads , то cd ~/Downloads
  2. Запустите chmod +x ./truecrypt-7.2-setup-x86 , это говорит: «make file truecrypt-7.2-setup-x86, который находится в этом исполняемом каталоге
  3. И теперь сделайте sudo ./truecrypt-7.2-setup-x86

Обратите внимание, что использование ./ не является случайным поведением, но на самом деле является стандартом, указанным Стандарт портативного интерфейса операционной системы (aka 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 для каталога, содержащего исполняемый файл с этим именем.

Из Зачем вам нужно ./ (dot-slash) перед именем скрипта, чтобы запустить его в bash? :

  

Он работает с ./, потому что POSIX указывает , что имя команды, которое содержит / будет использоваться как имя файла напрямую, подавляя поиск в $ PATH. Вы могли бы использовать полный путь для того же самого эффекта, но ./ короче и легче писать.

    
ответ дан Sergiy Kolodyazhnyy 27.10.2017 в 13:35