В некоторых случаях мне нужно использовать ./executable
вместо простого executable
при запуске файла в bash. В чем разница, и как мне узнать, какой из них мне следует использовать?
Например, у меня есть исполняемый файл adb
в папке DEV/ADT/sdk/platform-tools
.
В bash, если я ввожу adb
и запускаю его, я получаю ошибку: The program 'adb' is currently not installed. You can install it by typing: apt-get install android-tools-adb
Но если я набираю ./adb
, это работает отлично.
Первый ключевой пункт - это ./
указывает текущий или рабочий каталог, то есть, каталог, в котором Вы находитесь теперь, который является также тем, который Вы видите, вводите ли Вы команду pwd
(печать рабочий каталог). При мысли об этом удар работает два пути:
Если Вы указываете пустой исполняемый файл, такой adb
где никакой каталог не дан, затем колотите поиски вдоль каталогов, перечисленных в системном ПУТИ для исполняемого файла того имени, и выполняет первое такой исполняемый файл, который оно находит.
Видеть, какие каталоги находятся в системном ПУТИ, выполненном
echo $PATH
Если Вы указываете исполняемый файл с каталогом, такой как ./
в Вашем случае затем колотите, только ищет исполняемый файл в том каталоге. Если это не там, это останавливается с ошибкой.
В Вашем случае Вы были в DEV/ADT/sdk/platform-tools
папка, где исполняемый файл, adb
, был расположен. Так, когда Вы вводите ./adb
, удар ищет adb
в текущем каталоге и, если это находит его, это выполняет его.
С другой стороны, когда Вы вводите adb
, удар просматривает каталоги в ПУТИ. С тех пор DEV/ADT/sdk/platform-tools
находится, по-видимому, не в ПУТИ, это не находит исполняемый файл и жалуется.
Часто, люди избегают этой проблемы путем помещения текущего каталога в их ПУТЬ через что-то как:
PATH="$PATH:."
После того, как это сделано, когда Вы вводите имя пустого исполняемого файла, такой как adb
, удар будет искать его, как прежде, вдоль ПУТИ. Но так как ПУТЬ теперь включает текущий каталог, это посмотрит там также.
Добавление .
к ПУТИ обычно делается для индивидуальных пользователей. Поскольку более опасно, когда корень случайно выполняет неправильный исполняемый файл, это обычно не делается для корня.
Причина - это, если Вы не начинаете ее с ./
, это будет искать PATH
для executable
- Вы видите свой ток PATH
путем выполнения echo $PATH
- пример произвел:
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/home/wilf/.local/bin:/usr/games
Таким образом, если Вы хотите добавить DEV/ADT/sdk/platform-tools
к Вашему ПУТИ включите следующее ~/.bash_profile
(Вы, возможно, должны работать source ~/.bash_profile
во-первых, или выход из системы и вход в систему):
PATH=$PATH:DEV/ADT/sdk/platform-tools
Другой пример для ~/.local/bin
:
PATH=$PATH:$HOME/.local/bin
Если Вы снабжаете префиксом его ./
, это будет искать текущий рабочий каталог (можно найти это с echo $PWD
, pwd
, и т.д.) для файла.