Найти тему
BASH DAYS | Linux Factory

Кодревью Bash скриптов или избыточные конструкции

Самые распространенные Bash велосипеды, которые в 99% повторяются у моих студентов.

Оно конечно работает правильно. Но бывалый глаз сразу ощутит дискомфорт глядя на такие конструкции.
Кстати я всегда придерживаюсь правила — одну задачу можно решить разными способами. Работает, да и пёс с ним. Но учить такому других, увы непозволительно, пусть лучше сразу правильно делают. Нормально делай, нормально будет.

Поехали!

cat bashdays.txt | cut -f 2 -d ';'

В текстовом файле bashdays.txt у меня забита строка: hello;world. Далее команда cat читает этот файл и перенаправляет данные на утилиту cut с помощью pipe «|». А cut уже режет строку по символу «;» и отдает мне второй элемент. То есть на выходе я получу: «world».

Но. Утилита cut сама умеет читать файлы. Проще говоря так:

cut -f 2 -d ';' bashdays.txt

Сюда можно приплести и grep, с которым обычно делают так:

cat bashdays.txt | grep "world"

Это прям любимый паттерн всех, забит в днк, даже я этим порой грешу. Это как на велосипеде, один раз научился, больше не разучишься. А по хорошему надо делать так:

grep "world" bashdays.txt

Ну и к примеру еще такое встречается часто:

cat bashdays.txt | tr 'a-z' 'A-Z'

Суть одна, cat передает данные в tr, а дальше они конвертятся в верхний регистр и выводятся на экран. По хорошему это было бы так:

tr 'a-z' 'A-Z' < bashdays.txt

Но опять же для кого по-хорошему? Мне привычнее вариант с cat, переучиваться я уж точно не буду.

Подпишись на BashDays в телеграм

А еще из любимого, это циклы, ща покажу:

for s in $(ls)
do
echo "$s"
done


Это цикл, который перебирает файлы. Тут вообще зачем-то используется вызов внешней утилиты ls, хотя она тут вообще не упёрлась. Да и если такое использовать в скриптах, вылезут баги.

Например, создай такой файл:

touch "*"

И заново запусти этот цикл. ООйой… заметил прикол? Вывод продублировал все имена файлов. Вот тебе и баг, а потом сиди полдня, думай, что же оно не работает.

Этот костыль можно и перекостылисть, указав утилите ls параметр -Q. Тогда утилита ls тепло обнимет кавычками все имена файлов. Но это лишние кавычки, потом их чо? Снова обрезать?

Правильнее было бы так:

for s in ./*; do echo "$s"; done

Не вызывается никакая внешняя утилита, да и безопаснее в разы, в плане наличия багов если у файла будет какое-то корявое имя.

Перлов конечно много встречается, но это прям основные. Если что-то еще экстренно вспомню, закину в телеграм комментарии. Ну либо ты закидывай, мы всегда рады твоей активности!

Обещал на выходные тебя не беспокоить, но видимо не получится. Так, что увидимся совсем скоро. Хороших тебе предстоящих выходных и береги себя!

Рекомендую почитать