Как говорится в заголовке, есть ли разница для файловых систем * NIX? например ls file
иls ./file
linux
filesystems
Сергей Алаев
источник
источник
Ответы:
Я не в восторге от объяснения SmallLoanOf1M. Это технически правильно, но отвечает таким образом, который не соответствует примеру использования в вопросе.
Итак, в качестве примера, здесь есть одно важное отличие между этими двумя вопросами: «файл» и «./file»
Что, если файл назван с символом, который анализируется оболочкой? Особенно в отношении символов, интерпретируемых командой.
В частности, символ «тире»: «-». Но другие символы имеют значение для оболочки.
Пример. Мой файл был назван "-dingle"
Попробуйте перечислить файл:
Еще хуже, что, если файл был назван "
-rf rmbomb *
"? Теперь попробуйте удалить егоЯ даже не собираюсь приводить этот пример, но, надеюсь, вы поняли идею.
Итак, как вы перечисляете файл, начинающийся с тире? Используйте
./
спереди.То же самое для
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
они всегда будут одним и тем же путем, один указан более явно, чем другой. Не все команды ведут себя таким образом при обработке аргументов, но большинство так и делают.