Вышла новая - 5.0 - версия ABS Guide, исчерпывающего руководства по написанию скриптов на Bash. Интересно, что судя по Changelog, релиз выйдет только послезавтра.
> Одной из существенных причин переезда на zsh для меня была невозможность в bash сделать одну ~/.history на все shell'ы. За прошедшие ~10 лет у bash что-то изменилось?
Мужик, ты объясни, чего ты хочешь! Я сколько не пялился, два .bash_history разглядеть не смог. Ну никак! Что, надо на глаза наживать или веки оттягивать?
Угу запусти один xterm понабирай там что-то потом второй xterm понабирай там что-то(одновременно конечно). А потом посмотри хистори общий в этих двух запущенных xterm или нет. А потом хоть оппялься на один .bash_history толку ноль.
> Вопрос что делать?
Вариант 1: (правильный) обновить zsh. Или поставить новую версию, где
это есть, или приложить соответствующий патч.
Вариант 2: написать свою реализацию вытаскивания из known_hosts.
Что-то типа такого:
==={{{
known_hosts=(`sed -e 's/\([^ ]*\) .*/\1/' -e 's/,/\n/' ~/.ssh/known_hosts | sort | uniq`)
zstyle ':completion:*:ssh:*' hosts $known_hosts
zstyle ':completion:*:scp:*' hosts $known_hosts
===}}}
> Угу запусти один xterm понабирай там что-то потом второй xterm понабирай там что-то(одновременно конечно). А потом посмотри хистори общий в этих двух запущенных xterm или нет. А потом хоть оппялься на один .bash_history толку ноль.
Как я понимаю, это фича, а не баг. Просто каждый шелл синхронизует свои файловые буфера только при своем завершении. И это правильно. Представь, под одним аккаунтом сидят два чувака по разные строны океана. Накой хрен им общая история команд - непонятно.
> Мужик, ты объясни, чего ты хочешь! Я сколько не пялился, два
.bash_history разглядеть не смог. Ну никак! Что, надо на глаза
наживать или веки оттягивать?
Нужно кнопку "on" на мозгу нажать.
Объясняю.
Два терминала: term_1 и term_2.
В первом выполняем:
==={{{
term_1$ echo qqq
===}}}
Не закрывая первый переключаемся во второй и выполняем
==={{{
term_2$ <Ctrl-R> qqq
===}}}
В zsh во втором найдётся команда из первого.
В bash - нет.
Только что проверил на
==={{{
$ zsh --version
zsh 4.3.4 (i686-pc-linux-gnu)
$ bash --version
GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
===}}}
Угу уже запарился exit\nzsh набирать:) Ну вот файлик сам(там есть это всё):
#compdef ftp rwho rup xping traceroute host aaaa zone mx ns soa txt
# avoid calling variable "hosts", it's an obvious candidate for use in
# zstyle -e '*' hosts 'reply=($hosts)'
local expl _hosts tmp useip
if ! zstyle -a ":completion:${curcontext}:hosts" hosts _hosts; then
if (( $+_cache_hosts == 0 )); then
# uniquify
typeset -gUa _cache_hosts
local ipstrip='[:blank:]#[^[:blank:]]#'
# This boolean style determines whether hosts completes IP addresses. The
# default is no (not using IP addresses).
zstyle -t ":completion:${curcontext}:hosts" use-ip && useip=yes
[[ -n $useip ]] && ipstrip=
if (( ${+commands[getent]} )); then
# pws: we were using the horrible ": ${(A)...:=}" syntax to assign
# to _cache_hosts, overriding the typeset as well as being unreadable
# and having obscure splitting behaviour. Why? We've just
# tested _cache_hosts doesn't exist.
_cache_hosts=(${(s: :)${(ps:\t:)${(f)~~"$(_call_program hosts getent hosts 2>/dev/null)"}##${~ipstrip}}}
)
else
_cache_hosts=(${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##${~ipstrip}}})
if (( ${+commands[ypcat]} )) &&
tmp=$(_call_program hosts ypcat hosts.byname 2>/dev/null); then
_cache_hosts+=( ${=${(f)tmp}##${~ipstrip}} ) # If you use YP
fi
fi
local khostfile
typeset -Ua khostfiles
# This style specifies a list of files to look up for host names and IP
# addresses, if asked to. The files can contain comma separated host names
# and IP's, and any text on a line after the first whitespace,| or # is
# discarded. ssh's known_hosts files are thus supported. This style defaults
# to the list /etc/ssh/ssh_known_hosts, ~/.ssh/known_hosts
zstyle -a ":completion:${curcontext}:hosts" known-hosts-files khostfiles ||
khostfiles=(/etc/ssh/ssh_known_hosts ~/.ssh/known_hosts)
for khostfile in $khostfiles; do
if [[ -r $khostfile ]]; then
khosts=(${(s:,:)${(j:,:)${(u)${(f)"$(<$khostfile)"}%%[ |#]*}}})
if [[ -z $useip ]]; then
khosts=(${${khosts:#(#s)[0-9]##.[0-9]##.[0-9]##.[0-9]##(#e)}:#(#s)[0-9a-f:]##(#e )})
fi
_cache_hosts+=($khosts)
fi
done
fi
Скрипты нужно писать либо портабельно (для POSIX sh), либо использовать возможности лучшего в мире shell - zsh. :)
zsh не нужен, ибо мало распространен. POSIX sh не приемлим для чего-то более сложного hello world ибо убог. Поэтому нужно писать под bash - стандарт шелла де-факто.
Это здорово. Лучшая дока по bash.
to all:
А зачем писать переносимые скрипты? Все-таки надо исходить из конкретной ситуации. У _меня_ 99% скриптов с wc -l > 10 написаны под
совершенно узкую задачу, и врядли вообще кому-нибудь понадобятся.
А так на всех машинах у меня bash. Зачем тогда мне писать на sh?
Когда пишешь скрипт _обычно_ знаешь нужно чтобы он работал _везде_ или нет. Тогда и принимать решение пишем на _чтоугодно_sh или на чистом sh.
> POSIX sh не приемлим для чего-то более сложного hello world ибо убог.
Хаха. RTFM чего-нить помимо топика.
> Поэтому нужно писать под bash - стандарт шелла де-факто.
Когда вижу на слабой машинке кучу запущенных в результате вызовов скриптов тяжеленных bash'ей (который маскируется под /bin/sh), то таким стандартизаторам хочется оторвать яйца.
Спор bash vs. zsh :-)
вроде речь о скриптах, а вы тут сопли развели,
споря о крутизне при _интерактивной_ работе.
Какие автодополнения в скриптах?!
ну-ка на bash/zsh изобразите ассоциативный массив
ksh:
$ s1="aaa"
$ s2="bbb"
$ typeset -A myhash
$ myhash[$s1]=11
$ myhash[$s2]=22
$ echo ${myhash[$s1]}
11
$ echo ${myhash[$s2]}
22
> универсальные скрипты потому и называются универсальными, что работают почти у всех, а не только у кучки риальных пасанов с самым крутым shell'ом последней версии.
Это ты про пионеров-zsh-ников? ;)
> Это не говоря уже о том, что _только_ Linux идёт с bash в качестве /bin/sh
И работает при вызове как /bin/sh в режиме совместимости с Bourne Shell. От того, что у тебя скрипт будет весь из себя универсальный с "#!/bin/sh" в системе появится iptables, iproute2 или ipfw/pf, или банально команда ifconfig будет выдавать те же самые показания и запускаться с теми же самыми ключами на разных платформах?
> Ну и? Примеры неудобства где? Примеры _удобства_ я привёл.
Это чо удобство когда при комплишн на одном терминале для одной системы всплывают какие-то левые комплиты для другой системы в соседнем терминале? 8\ Это только мешать может.
> Когда вижу на слабой машинке кучу запущенных в результате вызовов скриптов тяжеленных bash'ей (который маскируется под /bin/sh), то таким стандартизаторам хочется оторвать яйца.
Лучше сходи матчасть подучи, чайник. Тысяча здоровенных башей под свой *код* занимают столько же страниц памяти, сколько и один баш.
> От того, что у тебя скрипт будет весь из себя универсальный с "#!/bin/sh" в системе появится
Этоя к тому, что у используемых в скриптах команд мало того что аргументы различаются на разных платформах, так и поведение тоже отличается. Взять для примера поведение date, "echo -e", ifconfig и т.п. на платформах solaris, bsd и linux. Поэтому универсальные скрипты - это имф, если речь не идет о hello_world.sh
Смяться не буду, zsh хорош, но т.к. нигде (на Solaris, AIX, HP-UX) zsh нет, ставить его туда глупо, а писать под линукс на zsh и потом заботится о портировании бессмыслено.
Вобщем он для группы любителей.
блин, на каком-то из столов я отлаживаю команду для конвертации кучи картинок, на другом — обрабатываю текстовики. Обе операции занимают время, пока конвертятся картинки я смотрю что вышло с текстами и наоборот.
В любом случае, в bash можно иметь и одну хистори на все терминалы, и всегда можно было так делать, zsh тут ничем не выделяется.
> блин, на каком-то из столов я отлаживаю команду для конвертации кучи картинок, на другом — обрабатываю текстовики. Обе операции занимают время, пока конвертятся картинки я смотрю что вышло с текстами и наоборот.
И? Чё-то как-то тема неудобства единой history не раскрыта.
>Особенно если терминалов несколько, они сидят на разных хостах (с общим $HOME, ага), и ещё активно используется screen.
А это разве безопасно? И какой смысл на разных хостах, имеющих доступ к одному HOME, сидеть одновременно под одним аккаунтом?
Вообще мозг взорван. Так себе и представляю - сижу на двух терминалах - пишу себе команды по разным темам на разные машины, и выполняю команды по очереди. Значит, они и в историю по очереди сыпятся? То есть цепочка команд не непрерывная? И как потом вспоминать?
> И какой смысл на разных хостах, имеющих доступ к одному HOME, сидеть одновременно под одним аккаунтом?
Чтобы выполнять на этих хостах специфичные для них действия?
> Вообще мозг взорван. Так себе и представляю - сижу на двух терминалах - пишу себе команды по разным темам на разные машины, и выполняю команды по очереди. Значит, они и в историю по очереди сыпятся? То есть цепочка команд не непрерывная? И как потом вспоминать?
Что такое "цепочка команд"?
> OpenSolaris 10 - сразу ставится.
Solaris 10 - не ставится. VasjaPupkinSolaris 10 - в качестве /bin/sh идёт scsh. И чо?
> Это здорово, конечно. Но имхо если такая потребность в истории, то может нужно просто скрипты себе написать? :)
Ага, ага. Вместо тысячи используемых пару (ну хорошо - десяток) раз в год и легко вытаскиваемых на свет из history команд - тысяча скриптов. Каждый со своим уникальным, неповторимым, легкозапоминаемым именем.
Не кури больше эту дрянь.
> Зачем мне десять тысяч cd ~ к примеру? :)
Ты бы почитал бы что ли прежде чем гнать сюда. Дубли подавляются.
> Появление последних результатов команд из других терминалов, не относящихся к задаче, решаемых на данном.
Согласно твоему описанию, команды оказываются в истории сразу. Значит, если на одном терминале я задавал параметры интерфейса, а на другом правил права на каталоги и при этом переключался туда-сюда, то, выходит, что при вызове той же команды для интерфейса, я получу команду для исправления прав на каталог.
>Ты бы почитал бы что ли прежде чем гнать сюда. Дубли подавляются.
Тогда смысл, если мне нужно выполнить ПОСЛЕДОВАТЕЛЬНОСТЬ команд?
>Вместо тысячи используемых пару
Жесть. Ты что там делаешь, в терминале-то? Причем на одних и тех же машинах? Может пора взять принцип IBM - машина должна работать, а человек - думать?
>VasjaPupkinSolaris 10 - в качестве /bin/sh идёт scsh. И чо?
Запишем - пи№;%л на OpenSolaris.
>Чтобы выполнять на этих хостах специфичные для них действия?
Если действия специфичны для каждого хоста, по кой хрен общая история команд?
>NFS-mounted HOME? RTFM
И что? Весьма небезопасно, особенно шаря свой хоум куда ни попадя.
А ты вообще пробовал читать все ответы, а не выборочно?