Суть вопроса:
Вопрос возник, когда я не смог установить программное обеспечение, поэтому я искренне спрашиваю об этом. /, Потому что я не знал об этом, и вывод "команда не найдена" сбивал меня с толку о том, что на самом деле была команда.
Контекст:
Я хотел бы установить файл 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“здесь». Вам нужно запустить эту команду из каталога, куда вы распаковали файл.chmod +x
,chmod -x
наоборот - она удаляет исполняемые праваОтветы:
./
это не команда. Команда есть./truecrypt-7.2-setup-x86
.Ваша оболочка и подобные программы
sudo
будут обрабатывать команду как путь, если она содержит хотя бы один/
символ. Поскольку.
представляет любой каталог, в котором вы находитесь в данный момент,./truecrypt-7.2-setup-x86
присваивает имя файлуtruecrypt-7.2-setup-x86
в текущем каталоге. Если такого файла нет или он не может быть запущен, вы получите сообщение об ошибке.Когда команда не содержит косой черты, ее
$PATH
ищут в каталогах , как говорит Сергей Колодяжный . Текущий каталог не автоматический поиск - и это не рекомендуется ставить.
в$PATH
. Таким образом, вы случайно не запускаете вещи, которые не ожидали запустить, потому что вы случайно оказалисьcd
в каталоге, который их содержит.Письмо
./
перед именем исполняемого файла в текущем каталоге общий способ его запуска, но на самом деле это не специальный синтаксис. Например, если вы испортили свой$PATH
и вам нужно было выполнить команду вродеls
, вы можете написать/bin/ls
. Нет.
необходимости в этом случае или в целом; что-то нужно/
где-то в имени пути, чтобы показать, что вы имеете в виду, что это путь.Поскольку
.
это всегда текущий каталог и/
только разделитель каталогов, первое, что нужно сделать, это проверить, что файл, который вы назвали, действительно существует в текущем каталоге. (Если это так, то проверьте его разрешения , как объясняет Чарльз Грин . Но если вы извлекли файл из архива, у него обычно уже будут права на исполняемый файл, если он предназначен для запуска.)источник
./ Часть команды говорит: «Посмотрите в текущем каталоге и выполните здесь команду« truecrypt-7.2-setup-x86 »». Вам нужно запустить эту команду из каталога, куда вы распаковали файл.
Это можно проверить: в том же окне терминала, где вы пытаетесь ввести команду, введите команду
ls -l true*
- если файл присутствует в текущем рабочем каталоге, то отобразится список, показывающий файл (и кучу дополнительной информации).Как отметила Занна в комментариях, ваш файл может не иметь разрешений на выполнение - это можно легко исправить. В качестве контрольного примера мой каталог показывает
и файл «rFullBack» перечисляет «-rw-» как мое разрешение на чтение и запись файла. Я могу выполнить команду,
chmod +x rFullBack
и список каталогов изменится наТам мои разрешения теперь '-rwx', что означает, что я могу выполнить файл.
Короче говоря, если файл существует в вашем каталоге
запустить команду
а затем команда
источник
rw-
как ваше разрешение --
прежде чем это для set [gu] id и sticky-битов.Как работает вызов команд в оболочке
Нет, это не команда. Способ работы оболочек заключается в том, что при вводе строки текста первое слово будет рассматриваться как команда, и если команда не является одной из встроенных в оболочку, оболочка будет просматривать все местоположения, перечисленные в
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) , в частности, см. Раздел «Поиск и выполнение команд».Воспроизведение ошибки
ПРИМЕЧАНИЕ : сообщение об ошибке, выданное
sudo
явно, вводит в заблуждение, поэтому об этом следует помнить; Однако, пожалуйста, обратите внимание, что это не было был суть вопроса, который задает OP.Документация и ссылки
Из
bash
руководства по 4.3, раздел «КОМАНДА ИСПОЛНЕНИЯ»:От чего вам нужно ./ (точка-косая черта) перед именем скрипта, чтобы запустить его в bash? :
источник
sudo
вывод вводит в заблуждение. Если вы пытаетесь же безsudo
, вы получите другую ошибку изbash
:Permission denied
. И это правильно, поскольку вы не дали сценарию разрешение на выполнение (черезchmod +x
).sudo
вывод вводит в заблуждение, является правдой, но это ошибка, которая обнаруживается. Это может быть что-то, чтобы сообщить разработчикам и позволить им это исправить. Однако это не является основой обсуждения - нам нужно было выяснить, что сделал OP, чтобы вызвать такую ошибку, и направить их по правильному пути. Является ли это вводящим в заблуждение или нет - это не проблема здесь./bin/bash
: он не позволяет вам выполнить скрипт, для которого у вас нет разрешения на выполнение. Когда вы вводите имя сценария предваряющим, все, что имеет значение, это/bin/bash
тот факт, что/bin/bash
он исполняемый, так как это исполняемая команда. Когда вы этого не делаете, сам скрипт выполняется, что, в свою очередь, приводит к тому,#!
что вызывается либо ваша текущая оболочка, либо все, что находится в верхней строке/bin/bash
- просто пример здесь. Тот факт, что мы звоним/bin/bash
и./script.sh
определяем путь к исполняемой вещи - это то же самое. Prefacing script сbash script.sh
или/bin/bash script.sh
является совершенно другой темой, где вы запускаете исполняемый файл и передаете ему скрипт в качестве аргумента - который, кстати, может сломаться, если синтаксис написан для чего-то другого, кроме оболочки, которую вы вызываете, скажемcsh
./bin/bash
хорошо исполняемый файл, но дело в том, что вы все еще указываете полный путь к нему./bin/bash
или даже простоbash
является также распространенным способом решения проблемы отсутствия разрешений на выполнение сценария. Указание полного пути к сценарию не решает эту проблему. Так/bin/bash
что это особенно плохой пример в этом конкретном случае.