В чем разница между именем файла и ./filename в Linux

10

В чем разница между filenameи ./filename? При каких обстоятельствах одно предпочтительнее другого?

как раз вовремя
источник

Ответы:

18

Для файлов данных это не имеет значения - оба оператора будут ссылаться на файл данных в вашем текущем каталоге. (Например, cat filenameи cat ./filenameсемантически идентичны.)

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

./filename(или любой другой /path/to/filename), таким образом, предпочтительнее, когда вы хотите выполнить определенный исполняемый файл, а не первый, найденный в вашем PATH.

DevSolar
источник
6

Если вы запускаете программу, filenameговорит , что запускается первая найденная в вашем, $PATHа вторая говорит, чтобы запустить одну в текущем каталоге.

Если вы используете это имя файла в качестве аргумента для программы как в, так do_something filenameи do_something ./filenameтогда они означают одно и то же.

Приостановлено до дальнейшего уведомления.
источник
5

Вы имеете в виду выполнение команды, верно?

Существует переменная окружения, PATHкоторая содержит некоторые системные каталоги, разделенные точкой с запятой. Когда вы набираете, commandсистема просматривает эти каталоги в указанном порядке, чтобы найти исполняемый файл с именем <команда>. Если он находит его, он пытается выполнить его. Вы можете увидеть свой путь через echo $PATHBash. Например:

$ echo $ PATH
/ sbin: / bin: / usr / sbin: / usr / bin: / usr / games: / usr / local / sbin: / usr / local / bin: / home / ivanatora / bin: / usr / local / kde4 / бен: / USR / местные / kde4 / бен

При вводе ./filenameвы указываете точный путь: текущий каталог. Вы можете видеть, что текущий каталог редко находится в вашем $ PATH (по соображениям безопасности). Поэтому, если вы хотите выполнить файл из текущего каталога, вы используете ./filename.

Чтобы выполнить файл по его пути (особенно если он не в $ PATH), вы также можете набрать <path>/file, например:

/ SBIN / Ifconfig

Иван Петрушев
источник
3

Исполняемая безопасность - главная причина этой разницы.

Ты не хочешь . (представьте рабочий каталог или PWD) на своем пути, потому что кто-то может трояна http://en.wikipedia.org/wiki/Trojan_horse_%28computing%29 критически важный исполняемый файл, такой как ps или ls, в вашем PWD и обмануть вас, представив неверные данные.

Bitbucket
источник
1

Это зависит от того, какие обстоятельства вы используете его.

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

В качестве имени программы, например, «аргументы имени файла», «аргументы имени файла» будут искать PATH, чтобы найти двоичный файл, в то время как «./filename arguments» будет использовать программу в текущем каталоге. Это, очевидно, полезно, если. нет в PATH, но также полезно использовать этот, даже если. находится в пути, возможно, потому что это соответствует более ранней записи.

горилла
источник