ㅤ
Давай это исправлять в контексте 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) будут символы *, ?, [ ], то это интерпретируется как шаблон для поиска файла.Так называемое — Pathname Expansion.
Ага. Теперь если в имени файла содержится символ
-, к примеру твой файл называется: -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.
Даже если работает без кавычек это ничего не значит, не ровен час получишь по ебалу.
Например твой скрипт будет выполняться в другом окружении, где $IFS (разделитель слов) изменён или файлы содержат пробелы и спецсимволы.
В общем сразу мотай на ус эту тему, подстели соломку и пиши скрипты как профи.
tags: #bash #badpractices #bestpractices
—
🔔 @bashdays➡️ @gitgate