Перейти к содержанию

Подводные камни в 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")"
  1. Кавычки защищают результат команды от разбиения.
  2. И cd получит целый путь, даже если в нём есть пробелы.

Как работают кавычки

  • Когда Bash видит $(...), он воспринимает это как отдельную область, некий «уровень».

  • Кавычки внутри $(...) работают только внутри.

  • Кавычки снаружи не объединяются с внутренними.

Наглядно, можно представить так:

cd "$( dirname "$f" )"

Внутренние кавычки "$f" защищают переменную f

Внешние кавычки "" защищают результат dirname "$f"

Теперь даже если переменная будет содержать пробелы команда не разобьётся на части.

ㅤЧитать первым в Телеграм

Комментарии