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