TGViewer
Bash Days | Linux | DevOps Bash Days | Linux | DevOps @bashdays · 23.6K subscribers
Post #239 12.7K
Привет и с пятницей господа и дамы! Отсматривал сегодня очередные домашние 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, хз, переучиваться я уж точно не буду.

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

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


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

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

touch "*"


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

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

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

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


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

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

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

tags: #bash #кодревью
—
💩 @bashdays
More from @bashdays
  1. Sep 30, 2026↗️ Для всех, кто строит 15 октября Cloud․ru соберет инженеров, которые строят и эксплуатир…
  2. Sep 29, 2026Самый жаркий холивар в команде — это не systemd, а какие заказать роллы на всю команду. Од…
  3. Sep 24, 2026Post #1565
  4. Sep 23, 2026Здрасти приехали, решил я в кой-то веке воспользоваться услугами Codex, создал аккаунт, по…
  5. Sep 22, 2026Всем привет, с вами TagdTagd. Сегодня опять поднимем тему архивов, но немного с другой сто…
  6. Sep 15, 2026Всем привет, с вами TagdTagd. И это вторая часть. Практическая. С первой частью можешь озн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →