Подводные камни в Bash №1
Вот всё трём мы с тобой за бест-практики, но практически ничего не разбираем по бэд-практикам.
Давай это исправлять в контексте Bash скриптов.
Временами будет много, временами мало и банально, но постараюсь всё разжевать и сделать интересную выжимку из наблюдений.
Естественно будет серебряная пуля — как сделать правильно.
Ну чё, готов? Тогда поехали!
Почему при копировании файлов, необходимо использовать кавычки?
Допустим, у тебя есть переменная $file
, в которой как ни странно хранится имя файла. И есть $target
, в ней мы указываем путь куда скопировать файл.
Если мы пишем:
То возникает проблема, Если имя файла содержит пробелы, то Bash ясен хуй разобьет эту строку на пробелы:
Команда превращается в такое:
И это воспримется интерпретатором как копирование нескольких файлов:
Дальше. Если в имени файла ($file
) будут символы *, ?, [ ]
, то это интерпретируется как шаблон для поиска файла.
Так называемое — Pathname Expansion.
Ага. Теперь если в имени файла содержится символ -
, к примеру твой файл называется: -bashdays.txt
, то команда cp
расценит, что ты указал флаг и выебет тебя в глаз.
Как правильно?
Вот так:
Кавычки в данном контексте предотвратят разделение на пробелы и ошибочное расширение подстановок.
Но если сделать так:
Чтобы не быть «инвалидом и бараном» нужно после cp
вхерачить --
.
Эти два тире напомнят cp
что дальше идут только файлы, а никакие-то флаги.
Каков итог?
Думаю ты и сам выводы сделал. Всегда пиздярь кавычки вокруг переменных в Bash.
Даже если работает без кавычек это ничего не значит, не ровен час получишь по ебалу.
Например твой скрипт будет выполняться в другом окружении, где $IFS (разделитель слов) изменён или файлы содержат пробелы и спецсимволы.
В общем сразу мотай на ус эту тему, подстели соломку и пиши скрипты как профи.