10

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

5 ответов5

18

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

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

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

6

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

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

5

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

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

$ echo $ PATH
/ SBIN:/ бен:/ USR / SBIN:/ USR / бен:/ USR / игры:/ USR / местные / SBIN:/ USR / местные / бен:/ Главная / ivanatora / бен:/ USR / местные / 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 и обмануть вас, представив неверные данные.

1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .