Як говорить заголовок, чи є різниця для файлових систем * 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"
. Але в цьому випадку *
розширення не розгортається, оскільки глобальне розширення не відбувається на вмісті змінного розширення. Якщо ви цього хочете, вам знадобиться 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/
каталозі.
Таким чином, зазвичай використовується для виконання файлів у вашому робочому каталозі "на місці".
EDIT:
У вашому прикладі ls
викликається оболонка і знайдеться за допомогою змінної шляху. Його аргумент буде оброблено у вашому робочому каталозі, яким би це не було. Оскільки це за замовчуванням для ls
, ви не побачите різниці між специфікацією file
та явним зазначенням, ./file
оскільки вони обоє вказують на ваш поточний каталог.
Не всі команди приймають шляхи до файлів у робочому каталозі, а деякі очікують, що вони матимуть файли стану у каталозі, який вони самі заздалегідь визначають за допомогою конфігурації. Серед команд, які приймають файли як аргументи, ці команди зустрічаються рідше
ls
зазначено в первинному запитанні. Тобто чим більше різниця між refferencing на відносний шлях ( по відношенню до поточного робочого каталогу) Тобто ../../dir/filename
і абсолютний шлях /path/to/dir/filename
ls
вони завжди будуть однаковим шляхом, один визначений більш чітко, ніж інший. Не всі команди поводяться таким чином при обробці аргументів, але більшість це робить.