Подводные камни в Bash №4
Представь что у тебя есть переменная
читать первым в телеграм читать первым в макс
f="My Documents/file.txt"
И в скрипте мы делаем так:
cd $(dirname "$f")
Это ошибочный вариант, бэд мать его практика.
Команда cd $(dirname "$f") должна вернуть путь к папке, где лежит файл.
НО! Результат этой команды разбивается на части, если в нём есть пробелы.
Например:
dirname "My Documents/file.txt"
Выдаст: My Documents
А если так:
cd My Documents
Логично, получаем ошибку: cd: No such file or directory: My
Bash думает что это два отдельных слова, а не один путь.
Бест-практика
cd -P -- "$(dirname -- "$f")"
- Кавычки защищают результат команды от разбиения.
- И
cdполучит целый путь, даже если в нём есть пробелы.
Как работают кавычки
Когда Bash видит
$(...), он воспринимает это как отдельную область, некий «уровень».Кавычки внутри
$(...)работают только внутри.Кавычки снаружи не объединяются с внутренними.
Наглядно, можно представить так:
cd "$( dirname "$f" )"
Внутренние кавычки "$f" защищают переменную f
Внешние кавычки "" защищают результат dirname "$f"
