Как говорится в заголовке, есть ли разница для файловых систем * NIX? например ls file
иls ./file
Как говорится в заголовке, есть ли разница для файловых систем * NIX? например ls file
иls ./file
Ответы:
Я не в восторге от объяснения SmallLoanOf1M. Это технически правильно, но отвечает таким образом, который не соответствует примеру использования в вопросе.
Итак, в качестве примера, здесь есть одно важное отличие между этими двумя вопросами: «файл» и «./file»
Что, если файл назван с символом, который анализируется оболочкой? Особенно в отношении символов, интерпретируемых командой.
В частности, символ «тире»: «-». Но другие символы имеют значение для оболочки.
Пример. Мой файл был назван "-dingle"
Попробуйте перечислить файл:
ls -dingle
# ls -dingle
ls: invalid option -- 'e'
Еще хуже, что, если файл был назван " -rf rmbomb *
"? Теперь попробуйте удалить его
rm "-rf rmbomb *"
Я даже не собираюсь приводить этот пример, но, надеюсь, вы поняли идею.
Итак, как вы перечисляете файл, начинающийся с тире? Используйте ./
спереди.
# ls ./-dingle
./-dingle
То же самое для rm
ls \-dingle
или ls \-rf\ rmbomb\ \*
. Это может быть хорошим способом обеспечения того, чтобы любой заданный набор команд был по меньшей мере непротиворечивым, так как указание ./
перед именем не будет экранировать символы после ./
.
rm "-rf rmbomb *"
самом деле делаете что-то плохое, вместо того, чтобы просто rm
напечатать ошибку. Это опасно, только если вы забыли процитировать имя файла, поэтому происходит разделение слов. (Особенно в сценарии оболочки, где вы запускаете rm $file
вместо rm "$file"
. Но в этом случае, *
расширение не будет расширяться, потому что расширение glob не происходит в содержимом раскрытия переменных. Если вы этого хотите, вам нужен eval
.) В любом случае, если ваш сценарий разделяет имена файлов перед передачей в rm, я бы сделал файл с именем space -rf .
или как-то еще, так что rm ./$i
это не поможет.
rm: invalid option -- ' '
от того, когда оно пытается интерпретировать пространство после -rf
как односимвольный переключатель, потому что это часть того же аргумента. (И да, я запустил это в пустом каталоге на тот случай, если я что-то упустил, и это было действительно опасно: P)
IFS=''
и -f
соответственно. Более редким примером является то, что awk
операнд (отличный от первого операнда, являющегося сценарием) рассматривает форму foo=bar
как назначение для выполнения, но ./foo=bar
как файл для чтения.
Да.
В file
командной строке BASH будет искать переменную окружения $ PATH для файла с таким именем. Если файл не находится в каталоге в переменной $ PATH, он не будет найден.
.
означает текущий каталог. ./
означает в текущем каталоге, в относительном выражении. Это эквивалентно тому, чтобы сказать что-то вроде /home/sheogorath/shivering/isles.img
при вызове ./isles.img
во время работы в /home/sheogorath/shivering/
каталоге.
Как таковой, он обычно используется для выполнения файлов в вашем рабочем каталоге "на месте".
РЕДАКТИРОВАТЬ:
В вашем примере ls
вызывается из оболочки и найти с помощью переменной пути. Его аргумент будет обработан в вашем рабочем каталоге, что бы это ни было. Поскольку это значение по умолчанию для ls
, вы не увидите никакой разницы между указанием file
и явным указанием, ./file
поскольку они оба указывают на ваш текущий каталог.
Не все команды будут принимать пути к файлам в рабочем каталоге, а некоторые ожидают, что вы будете указывать файлы в каталоге, который они сами предварительно задают в конфигурации. Среди команд, которые принимают файлы в качестве аргументов, эти команды встречаются реже
ls
упомянутая в исходном вопросе. То есть чем больше разница между refferencing на относительный путь ( по отношению к текущему рабочему каталогу) Т.е. ../../dir/filename
и абсолютный путь /path/to/dir/filename
ls
они всегда будут одним и тем же путем, один указан более явно, чем другой. Не все команды ведут себя таким образом при обработке аргументов, но большинство так и делают.