В чем разница между filename
и ./filename
? При каких обстоятельствах одно предпочтительнее другого?
5 ответов
Для файлов данных это не имеет значения - оба оператора будут ссылаться на файл данных в вашем текущем каталоге. (Например, cat filename
cat ./filename
семантически идентичны.)
Другое дело, если рассматриваемое имя файла относится к исполняемому файлу, т. Е. Это первая (или даже единственная) вещь, которую вы вводите в командной строке. ./filename
будет искать исполняемый файл в вашем текущем каталоге, и больше нигде. filename
, с другой стороны, будет оценивать переменную окружения PATH
и искать filename
в каждом каталоге, который там хранится (который может включать или не включать ваш текущий каталог).
./filename
(или любое другое /path/to/filename
), таким образом, предпочтительнее, когда вы хотите выполнить определенный исполняемый файл, а не первый, найденный в вашем PATH.
Если вы запускаете программу, filename
говорит, что нужно запустить первый файл, найденный в вашем $PATH
а второй говорит, что он запускает тот, что находится в текущем каталоге.
Если вы используете это имя файла в качестве аргумента для программы, как в do_something filename
do_something или do_something ./filename
то они означают одно и то же.
Вы имеете в виду выполнение команды, верно?
Существует переменная 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
Исполняемая безопасность - главная причина этой разницы.
Ты не хочешь . (представьте рабочий каталог или PWD) на своем пути, потому что кто-то может трояна http://en.wikipedia.org/wiki/Trojan_horse_%28computing%29 критически важный исполняемый файл, такой как ps или ls, в вашем PWD и обмануть вас, представив неверные данные.
Это зависит от того, какие обстоятельства вы используете его.
В качестве аргумента, например, "имя файла программы", это зависит от программы, но обычно они идентичны.
В качестве имени программы, например, "аргументы имени файла", затем "аргументы имени файла" будет искать PATH, чтобы найти двоичный файл, в то время как «./filename arguments» будет использовать программу в текущем каталоге. Это, очевидно, полезно, если. нет в PATH, но также полезно использовать этот, даже если. находится в пути, возможно, потому что это соответствует более ранней записи.