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


9

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

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

Это почему?


@David B: runnable file => executable file?
Лазер

Ответы:


13

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


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.