зачем ./ нужен для запуска работоспособного файла?

9

Я использую Ubuntu и замечаю, что многие из моих исполняемых скриптов не будут работать, если я не предшествую теме ./.

Например, если у меня есть сценарий Perl: /home/me/script.plи я в данный момент нахожусь /home/me, ввод script.plне будет, но ./script.plбудет.

Это почему?

Дэвид Б
источник
@David B: runnable file => executable file?
Лазер

Ответы:

13

Чтобы выполнить сценарий, вам нужно ввести полный путь к сценарию, если сценарий не присутствует в одном из каталогов, перечисленных в $PATHпеременной среды. Обычно (и по умолчанию) .(текущий каталог) не находится в вашем $PATH, поэтому вам нужно набрать его, ./scriptчтобы выполнить.

mipadi
источник
21

Потому что текущий каталог не в вашем пути. Это функция безопасности. Если бы он был у вас на пути, кто-то мог бы потенциально отбросить вредоносную копию обычной команды, и, например, когда вы находитесь в этом каталоге, вместо того, чтобы запускать настоящий sudo, вы запускаете поддельную. Это было бы плохо.

Мэтт Грир
источник
3
Это несколько вводит в заблуждение. До тех пор, пока они .были /usr/bin/, это не заменит реальное sudo. Это сделано для того, чтобы вы случайно не добавили программы на свой путь, но речь идет не о замене существующих.
Мэтью Флэшен
Вместо того sudo, чтобы использовать lsи rm. Гораздо более вероятно, что будет назван.
Аарон Дигулла
@aaron: конечно, но lsне будет спрашивать ваш пароль, и если пользователь может использовать sudoпароль, это интересно ...;)
Laurent
1
@Мэтью. Да, это все еще трудно использовать, но реальная угроза безопасности. Допустим, я вставил скрипт, slкоторый делает плохие вещи, затем вызывает ls, а затем удаляет себя. Вы не можете переопределить системные инструменты, но можете «опечатать»
Rich Homolka
@laurent: То , что я имел в виду: cp /bin/bash /tmp/sfhsdh ; chmod u+s tmp/sfhsdh >& /dev/null ; $0 "$@". Не нужно знать пароль.
Аарон Дигулла
4
echo $PATH

Вы должны иметь текущий каталог (одну точку) в вашем пути, чтобы это работало.

Вы можете добавить его к своему пути, если хотите, с помощью следующих команд.

ш / Баш: export PATH=$PATH:.

Tcsh / CSH: set PATH = ($PATH .)


источник
3

оболочка ищет пути для исполняемых файлов и по умолчанию ./не находится в пути.

Эмир
источник