Bash Days | Linux | DevOps
23.3K subscribers
149 photos
25 videos
675 links
Авторский канал от действующего девопса

Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.

Автор: Роман Шубин
Реклама: @maxgrue

MAX: https://max.ru/bashdays

Курс: @tormozilla_bot
Блог: https://bashdays.ru
Download Telegram
Короче блядь! Если ты хочешь сохранить то, что ввёл человек, в переменную с именем foo, то не нужно писать доллар ($) перед именем переменной.

Напиши так:

read foo


А если хочешь прикрыть своё очко от спецсимволов, делай так:

IFS= read -r foo


Вот так делать хуёва:

read $foo


В этом случае $foo — уже не имя переменной, а значение переменной foo.

Как говорил мой техдир:

Рома, золотые у тебя руки. Оторвать бы их да пропить.


Делай правильно и твои руки никто не оторвёт и не пропьёт.

Для маленьких:

Представь, ты говоришь: «Дай хуй» — и тебе сразу дают хуй.

Всёж просто. 😲

А теперь представь, что ты говоришь: «Дай $хуй».

Тут сначала дополнительно нужно спросить «А кто такой хуй?» — может, это Олег? И тогда тебе дадут Хуй Олега.

То есть, сначала нужно узнать, кто прячется под «хуем», а потом уже брать, чтобы не взять чужой «хуй».

Надеюсь ты понял. Изучай!

🛠 #bash #badpractices #bestpractices

@bashdays / @linuxfactory / @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
370
Всё тебе, блядь, смехуюшечки да пиздахаханьки.

Создаём файл:

echo -e "foo\nbar\nfoo again" > bashdays.txt


Внутри получаем:

foo
bar
foo again


И применяем бэд-практику:

cat bashdays.txt | sed 's/foo/baz/g' > bashdays.txt


Эта команда читает файл bashdays.txt и одновременно пишет в него.

Что тут не так?

А всё! В лучшем случае получишь хуем по лбу и примеришь золотой пизды колпак. Эта команда испортит файл. Низя так делать! Всё проебёшь!

После этой команды файл bashdays.txt обнулится. Хотя визуально команда выглядит абсолютно безопасной.

А теперь делаем правильно!

sed 's/foo/baz/g' bashdays.txt > tmpfile && mv tmpfile bashdays.txt


Смотрим содержимое файла bashdays.txt и видим ожидаемый результат:

baz
bar
baz again


Здесь мы всё сделали через временный файл, громоздко, но по крайней мере безопасно. Веселый колпак тебе теперь точно не светит.

Можно извратиться и провернуть всё это дело на основе дескрипторов, но опять же этот способ не безопасен.

Можно правда хакнуть таким методом:

printf '%s\n' ',s/foo/baz/g' w q | ed -s bashdays.txt


Это работает без временного файла на уровне Bash, потому что ed сделаем всё сам. Но опять же конструкция нихуя непонятная.

Резюмируем: Не ссы использовать временные файлы, пусть твои bash скрипты будут безопасны и читаемы.

🛠 #bash #badpractices #bestpractices

@bashdays / @linuxfactory / @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
165
Нежных много, деловых мало. Ну не могу я из песни слов выбросить, получится сухо и не интересно.

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

Рассмотрим распространённый случай:

echo $foo


Тут всё предельно ясно и понятно. Все в ажуре!

Но это вершина айсберга. Эта команда может отрабатывать не так, как ты ожидаешь. Потому что foo это переменная. И если ты её не возьмешь в кавычки, то Bash может сделать с её содержимым всякие хитрые штуки.

Что подразумевается по «хитрыми штуками»

— Разделить содержимое на отдельные слова (если там есть пробелы).

— Подставить имена файлов с таким шаблоном, если он выглядит как *.zip (это называется глоббинг).

И тут у новичков возникает многочасовой проёб, когда переменная выводит неправильные значения.

Смотри:

msg="Пожалуйста, введите имя файла в формате *.zip"
echo $msg


Выглядит опять всё красиво. А по факту получаешь:

Пожалуйста, введите имя файла в формате awscliv2.zip


Да блядь! А я просто хотел вывести строкой *.zip а не получить список файлов в текущей папке.

var="*.zip"
echo "$var"
echo $var


Первое echo напечатает *.zip, а второе выведет список всех файлов, которые заканчиваются на .zip.

Поэтому, если ты хочешь наверняка вывести переменную как есть, лучше используй `printf`

printf "%s\n" "$foo"


Для маленьких:

Представь, что ты говоришь падшей женщине: «покажи что у тебя в трусах», она снимает трусы, а там — большой сочный хуй.

А чтобы в трусах был ожидаемый результат, нужно изначально это учесть в моменте знакомства (до просьбы) и расставить все кавычки.

Хотя у каждого свой ожидаемый результат… возможно кавычки вовсе и не потребуются.

Такие дела. Изучай!

🛠 #bash #badpractices #bestpractices

@bashdays / @linuxfactory / @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
162
Живу в лесу, поклоняюсь колесу…

А чё эта хуйня не работает? Яж всё правильно сделал!

su -c 'ls -la'


С виду всё верно. Но если внимательно прочитать команду и подумать, происходит такое:

Хочу стать root и выполнить команду ls -la.


Но у su другое мнение:

Хочу стать пользователем с именем -c


А -c — это не имя пользователя, а опция.

Поэтому правильно так:

su root -c 'ls -la'


Теперь логика не хромает:

Перейти к пользователю root и выполнить команду ls -la.


Вроде мелочь, а на эти грабли постоянно наступают и бегут — аа, у меня принтер не печатает!!! Что я делаю не так???

А чем отличается su от sudo я писал тут, почитай на досуге и обнови нейронные связи.


🛠 #bash #badpractices #bestpractices

@bashdays / @linuxfactory / @blog
Please open Telegram to view this post
VIEW IN TELEGRAM
46