Как стать автором
Обновить

Комментарии 32

Я плохой линуксоид если не знал ни про одну из этих возможностей?

Нет. Вы просто не читали man bash. Оно вообще занятное — массивы там всякие, сокеты, хитрые подстановки переменных.
НЛО прилетело и опубликовало эту надпись здесь

Использую, но там где надо что-то сложнее пары сравнений предпочитаю питон.

Как человек знающий-таки bash (и даже эти переменные)… могу вас только поддержать.

bash — это ужасная вещь. Он начала создаваться ещё в 70е, когда о безопасности никто не думал, а когда начали думать — то добавили костылей. Что при этом не удалось сделать — так это сделать так, чтобы простые методы были бы безопасны.

В результате любую задачу в bash можно сделать 10 разными способами из коготорых 9 простых — на самом деле не всегда работают.

Использовать язык, в котором такого количества мин нету где возможно — очень разумное решение…
Хороший линуксоид — не тот, кто всё знает, а тот, кто каждый день учится :)
Это похоже на путаницу, которую я почувствовал, когда понял, что локальная папка не была включена в более знакомую переменную PATH… но вы должны сделать это в переменной PATH, потому что вас могут обмануть, запустив фейковую команду из какого-нибудь скачанного кода.

Хотел я спросить на каком это вообще языке написано и зачем при переводе был искажен смысл, но когда я залез в оригинальную статью — там оказалась написана такая же чепуха.


На всякий случай поясняю о чем тут на самом деле речь: нельзя добавлять. в PATH, поскольку из-за этого могут переопределиться базовые команды шелла, как случайно, так и намеренно из-за действий злоумышленника. Так, вызывая ls, хочется быть уверенным что это именно /bin/ls, а вовсе не ./ls

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

Что не так с заголовком этого текста?

Предположим, это была бы написанная с нуля статья. Какое бы вы предложили название для неё?
Интереса ради погуглил clickbait bingo.
Из четырех слов заголовка два оттуда.

Так вы предложите альтернативу то.

НЛО прилетело и опубликовало эту надпись здесь

Но вы не упомянули что речь про, так сказать, системные переменные bash.

НЛО прилетело и опубликовало эту надпись здесь

Вот это точно кликбейт, когда из заголовка не ясен смысл, и приходится открывать статью чтоб разобраться, при том что тема интересная. А так всё ясно и понятно. Нормальный заголовок.

Я давно перешел на fish. Переучивание было немного утомительным. Некоторые вещи работают не так как в bash/zsh, и знания, за 20+ лет пробороздившие мозг, периодически приводят к попыткам написать как в bash.


Но одна вещь, которая вымораживает и из-за которой нет ни малейшего желания возвращаться. bash теряет историю. Да, у них в ChangeLog как минимум однажды писали, что эта проблема исправлена. Нет, не исправлена. Какие бы настройки истории я не использовал, рано или поздно возникает ситуация, когда я набираю Ctrl-R ansible-, и не вижу ровным счетом ничего. А потом гляжу в историю, и вижу, что она в очередной раз обнулилась. Обычно это случается в самый неподходящий момент, когда ты пытаешься срочно что-то починить или задеплоить.


За много лет регулярные полные и частичные потери истории так меня достали, что я поклялся никогда не использовать bash в интерактивном режиме. Скрипты продолжаю писать на нем, так как он есть в каждой системе по умолчанию, даже в Windows уже.

Не всегда так просто можно поменять shell, зачастую есть корпоративный стандарт, а какой-нибудь fish вообще не установлен. История да, это проблема в bash. Я решил её для себя сохраняя в файл, можно даже после каждой команды используя упомянутый тут PROMPT_COMMAND. А потом ещё и делая бакап этих файлов. Так что, не обязательно утомительно переучиваться. Плохо это или хорошо, но bash есть везде. Ну почти везде, не считая совсем урезанных версий на контроллерах.
Я решил её для себя сохраняя в файл, можно даже после каждой команды используя упомянутый тут PROMPT_COMMAND.

А как?
У меня пока прижился вот такой вариант, немного сложный, но для меня работает.
Тут синхронизируется история между всеми сессиями на хосте (это упрощённая версия, на самом деле синхронизируется история для всех сессий с одной домашней директорией, например хомяк на NFS)
Последняя строка срабатывает при каждом логине это «очистка» истории от «мусора» и не обязательна.
export HISTCONTROL=ignoreboth:erasedups
export PROMPT_COMMAND="history -n; history -w; history -c; history -r"
TMPFILE=$(mktemp); tac "${HISTFILE}" | sed -e 's/[[:space:]]*$//' | awk '!x[$0]++' | tac > "${TMPFILE}" ; cat "${TMPFILE}" > "${HISTFILE}" ; rm "${TMPFILE}"; unset TMPFILE

У меня в PROMPT_COMMAND было, оказывается, добавлено «history -a», но все равно не работало — между разными сессиями не синхронизировалось. Попробовал заменить на ваш вариант.
Для меня оказалось проще перейти на zsh. В нём после настройки с история ведёт себя хорошо, есть фичи, которых в баше не хватает, а синтаксис после bash гораздо привычнее, чем у fish.
Хранение истории в bash (точнее, в общем readline) действительно ужасно.
Это как раз то место, куда напрашивается применить sqlite :)
> он есть в каждой системе по умолчанию, даже в Windows уже.

А вот это спорное утверждение. В бсд, например, по умолчанию нету, пока не вытянется с чем-нибудь по зависимостям. Более того, /bin/sh там ВНЕЗАПНО действительно указывает на sh.
Но это ещё ладно, его, неожиданно, по дефолту нету в Убунте, а под его именем скрывается dash, который хоть и совместим с башем в большей части, но бывают сюрпризы (иначе откуда бы я узнал, что там на самом деле не баш?).
Ну и да, в эмбеддед обычно бизибокс, который тоже не совсем баш.
Вообще, ситуация с этими подменами маразмотична, ИМХО, а тема башизмов давно избита. Поэтому я лично никогда не буду использовать эти 'неожиданные' переменные, дабы не выстрелить себе в ногу. И вообще, писать предпочитаю на sh.
PS: в интерактивной режиме баша ещё раздражает например, что по умолчанию стрелки вверх/вниз тупо листают историю, а pgup/pgdown работают не везде, и что ^W стирает весь путь целиком. Поэтому всю жизнь пользовался tcsh, zsh или fish.
Почему неожиданных то? Редко используемых — возможно. Что неожиданного в том, что есть в man bash (даже то, что его до конца не читают — это ожидаемо ;))? Если переменная PROMPT_COMMAND указывает, какую команду использовать при отображении приглашения — это ожидаемо. Вот если бы эта переменная включала, к примеру, debug mode — это было бы действительно неожиданно.

10 лет на Линукс и с bash, а они продолжают меня удивлять. Спасибо за перевод, многое узнал впервые. Уж гораздо интереснее, чем типичные "n лайфхаков в командной строке", где в 100500-тый раз опишут что-то вроде Ctrl+R или "cd -"

Спасибо за cd -

(Уже не про bash) А есть ещё и git checkout -

Не считаю себя крутым линуксоидом, но о трёх возможностях знал. Тут просто как повезёт: нужно будет — узнаешь, если не нужно будет, то и не будешь об этом знать. Хотя кому-то явно будет полезно.
CDPATH может испортить не только настроение, но и сборку средствами make, например
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории