Подводные камни в Bash №1
Вот всё трём мы с тобой за бест-практики, но практически ничего не разбираем по бэд-практикам.
читать первым в телеграм читать первым в макс
Давай это исправлять в контексте Bash скриптов.
Временами будет много, временами мало и банально, но постараюсь всё разжевать и сделать интересную выжимку из наблюдений.
Ну чё, готов? Тогда поехали!
Почему при копировании файлов, необходимо использовать кавычки?
Допустим, у тебя есть переменная $file, в которой как ни странно хранится имя файла. И есть $target, в ней мы указываем путь куда скопировать файл.
Если мы пишем:
cp $file $target
То возникает проблема, Если имя файла содержит пробелы, то Bash ясен хуй разобьет эту строку на пробелы:
file="You can suck my dick.avi"
Команда превращается в такое:
cp You can suck my dick.avi /tmp
И это воспримется интерпретатором как копирование нескольких файлов:
You
can
suck
my
dick.avi
Дальше. Если в имени файла ($file) будут символы *, ?, [ ], то это интерпретируется как шаблон для поиска файла.
Ага. Теперь если в имени файла содержится символ -, к примеру твой файл называется: -bashdays.txt, то команда cp расценит, что ты указал флаг и выебет тебя в глаз.
cp -bashdays.txt /tmp
cp: ну ты ебать инвалид -- 'h'
Try 'cp --help' for more information.
Как правильно?
Вот так:
cp -- "$file" "$target"
Но если сделать так:
cp "-bashdays.txt" "/tmp"
cp: еще и баран -- 'h'
Try 'cp --help' for more information.
Чтобы не быть «инвалидом и бараном» нужно после cp вхерачить --.
Эти два тире напомнят cp что дальше идут только файлы, а никакие-то флаги.
Каков итог?
Думаю ты и сам выводы сделал. Всегда пиздярь кавычки вокруг переменных в Bash.
Даже если работает без кавычек это ничего не значит, не ровен час получишь по ебалу.
В общем сразу мотай на ус эту тему, подстели соломку и пиши скрипты как профи.
