LINUX.ORG.RU

Новая версия Advanced Bash Scripting


0

0

Вышла новая - 5.0 - версия ABS Guide, исчерпывающего руководства по написанию скриптов на Bash. Интересно, что судя по Changelog, релиз выйдет только послезавтра.

Changelog

http://personal.riverusers.com/~thegr...

>>> Подробности

Ответ на: комментарий от execve

> Одной из существенных причин переезда на zsh для меня была невозможность в bash сделать одну ~/.history на все shell'ы. За прошедшие ~10 лет у bash что-то изменилось?

Мужик, ты объясни, чего ты хочешь! Я сколько не пялился, два .bash_history разглядеть не смог. Ну никак! Что, надо на глаза наживать или веки оттягивать?

annoynimous ★★★★★
()
Ответ на: комментарий от annoynimous

Угу запусти один xterm понабирай там что-то потом второй xterm понабирай там что-то(одновременно конечно). А потом посмотри хистори общий в этих двух запущенных xterm или нет. А потом хоть оппялься на один .bash_history толку ноль.

anonymous
()
Ответ на: комментарий от anonymous

> Вопрос что делать?

Вариант 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
===}}}

execve
()
Ответ на: комментарий от execve

Нашел... Был zsh 4.3.0 там этого нема, теперь обновил до 4.3.4 но дополнения все равно нет. хотя zstyle этот прописал

anonymous
()
Ответ на: комментарий от anonymous

> Угу запусти один xterm понабирай там что-то потом второй xterm понабирай там что-то(одновременно конечно). А потом посмотри хистори общий в этих двух запущенных xterm или нет. А потом хоть оппялься на один .bash_history толку ноль.

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

annoynimous ★★★★★
()
Ответ на: комментарий от annoynimous

> Мужик, ты объясни, чего ты хочешь! Я сколько не пялился, два
.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.
===}}}

execve
()
Ответ на: комментарий от annoynimous

> Как я понимаю, это фича, а не баг. Просто каждый шелл синхронизует свои файловые буфера только при своем завершении. И это правильно.

Это _НЕ_правильно. Я набрал команду - она должна попасть в history. И по Ctrl-R найтись.

Вспоминать, в каком именно терминале была набрана команда - запаришься.

Особенно если терминалов несколько, они сидят на разных хостах (с общим $HOME, ага), и ещё активно используется screen.

> Представь, под одним аккаунтом сидят два чувака по разные строны океана. Накой хрен им общая история команд - непонятно.

На случай двух чуваков это можно сделать отклюыаемым (как в zsh, ага).

execve
()
Ответ на: комментарий от anonymous

> Нашел... Был zsh 4.3.0 там этого нема, теперь обновил до 4.3.4 но дополнения все равно нет. хотя zstyle этот прописал

В файле zsh/4.3.4/functions/Completion/Unix/_hosts параметр use-ip присутствует?

Ну и, на всякий случай, глупо-наивный вопрос, но всё же: ты zsh перезапустил?

execve
()
Ответ на: комментарий от execve

Угу уже запарился 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

_hosts=( "$_cache_hosts[@]" )
fi

_wanted hosts expl host \
compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' -a "$@" - _hosts

anonymous
()
Ответ на: комментарий от anonymous

Кстати там рядом _known_hosts лежит он где используется? И как-нить дебаг можно натравить на все это дело?

anonymous
()
Ответ на: комментарий от anonymous

Нашел трабл да это был патч в дистре со старых времён. Именно на ssh и поэтому вся бяка лезла. Сейчас поправил как надо все поперло, спасибо всем.

anonymous
()
Ответ на: комментарий от execve

На самом деле, не всегда это удобно. Я обычно намеренно открываю несколько терминалов для работы в разных частях системы.

Тем не менее, открой для себя history (ключи -n и -a) и переменную PROMPT_COMMAND — поведение zsh легко эмулируется без лишних сущностей.

У zsh одно достоинство: буква ”Ζ“ — это круто.

Sphinx ★★☆☆
()
Ответ на: комментарий от execve

> bash не нужен.

Скрипты нужно писать либо портабельно (для POSIX sh), либо использовать возможности лучшего в мире shell - zsh. :)

zsh не нужен, ибо мало распространен. POSIX sh не приемлим для чего-то более сложного hello world ибо убог. Поэтому нужно писать под bash - стандарт шелла де-факто.

anonymous
()
Ответ на: комментарий от Evgueni

у меня zsh при попытке дополнить комманду, если она написана русскими буквами (часто забываю раскладку проверить), падает.

dima3351
()
Ответ на: комментарий от execve

> $ scp 1<Tab>

$ scp 192.168<tab>
192.168.0.1: 192.168.0.2: 192.168.0.4: 192.168.100.10:
192.168.0.101: 192.168.0.3: 192.168.0.5: 192.168.100.130:

$ bash --version
GNU bash, version 3.2.17(1)-release (i686-pc-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.


anonymous
()
Ответ на: комментарий от anonymous

>Это не говоря уже о том, что _только_ Linux идёт с bash в качестве /bin/sh

>угу. первое что делают бсд-шники это ставят баш =)

Протестую! Использую встроенный tcsh - для работы в консоли и sh - для скриптов.

anonymous
()

Это здорово. Лучшая дока по bash.

to all:
А зачем писать переносимые скрипты? Все-таки надо исходить из конкретной ситуации. У _меня_ 99% скриптов с wc -l > 10 написаны под
совершенно узкую задачу, и врядли вообще кому-нибудь понадобятся.
А так на всех машинах у меня bash. Зачем тогда мне писать на sh?
Когда пишешь скрипт _обычно_ знаешь нужно чтобы он работал _везде_ или нет. Тогда и принимать решение пишем на _чтоугодно_sh или на чистом sh.

tugrik ★★
()
Ответ на: комментарий от anonymous

> zsh не нужен, ибо мало распространен.

Ну и чо?

> POSIX sh не приемлим для чего-то более сложного hello world ибо убог.

Хаха. RTFM чего-нить помимо топика.

> Поэтому нужно писать под bash - стандарт шелла де-факто.

Когда вижу на слабой машинке кучу запущенных в результате вызовов скриптов тяжеленных bash'ей (который маскируется под /bin/sh), то таким стандартизаторам хочется оторвать яйца.

execve
()
Ответ на: комментарий от dima3351

> у меня zsh при попытке дополнить комманду, если она написана русскими буквами (часто забываю раскладку проверить), падает.

Версия какая? До достаточно недавнего времени zsh не дружил с UTF-8.

BTW, у меня bash 0.1 падает просто при запуске. :)

execve
()
Ответ на: комментарий от Sphinx

> На самом деле, не всегда это удобно. Я обычно намеренно открываю несколько терминалов для работы в разных частях системы.

Ну и? Примеры неудобства где? Примеры _удобства_ я привёл.

execve
()

Спор 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


sdio ★★★★★
()
Ответ на: комментарий от dima3351

> dima3351-home% zsh4 --version zsh 4.2.5 (x86_64-unknown-linux-gnu)

UTF-8 добавлен в 4.3.1

execve
()

А зачем это нужно. Перлом пользоваться уже запретили что ли.

anonymous
()
Ответ на: комментарий от anonymous

>угу. первое что делают бсд-шники это ставят баш =)

абсолютное враньё. ага

anonymous
()
Ответ на: комментарий от execve

> универсальные скрипты потому и называются универсальными, что работают почти у всех, а не только у кучки риальных пасанов с самым крутым shell'ом последней версии.

Это ты про пионеров-zsh-ников? ;)

> Это не говоря уже о том, что _только_ Linux идёт с bash в качестве /bin/sh

И работает при вызове как /bin/sh в режиме совместимости с Bourne Shell. От того, что у тебя скрипт будет весь из себя универсальный с "#!/bin/sh" в системе появится iptables, iproute2 или ipfw/pf, или банально команда ifconfig будет выдавать те же самые показания и запускаться с теми же самыми ключами на разных платформах?

anonymous
()
Ответ на: комментарий от execve

> Ну и? Примеры неудобства где? Примеры _удобства_ я привёл.

Это чо удобство когда при комплишн на одном терминале для одной системы всплывают какие-то левые комплиты для другой системы в соседнем терминале? 8\ Это только мешать может.

anonymous
()
Ответ на: комментарий от execve

> Когда вижу на слабой машинке кучу запущенных в результате вызовов скриптов тяжеленных bash'ей (который маскируется под /bin/sh), то таким стандартизаторам хочется оторвать яйца.

Лучше сходи матчасть подучи, чайник. Тысяча здоровенных башей под свой *код* занимают столько же страниц памяти, сколько и один баш.

anonymous
()
Ответ на: комментарий от anonymous

> От того, что у тебя скрипт будет весь из себя универсальный с "#!/bin/sh" в системе появится

Этоя к тому, что у используемых в скриптах команд мало того что аргументы различаются на разных платформах, так и поведение тоже отличается. Взять для примера поведение date, "echo -e", ifconfig и т.п. на платформах solaris, bsd и linux. Поэтому универсальные скрипты - это имф, если речь не идет о hello_world.sh

anonymous
()
Ответ на: комментарий от anonizmus

>ваще для этого перл есть.

дык и др. языки есть. при чем тут перл, когда речь идет о шел?
Да и хэш может нужен на 10-20 значений.

> Который есть ваще везде %)

На 1% (это 3-4шт.) подопечных мне UNIXax нет.

sdio ★★★★★
()
Ответ на: комментарий от execve

Смяться не буду, zsh хорош, но т.к. нигде (на Solaris, AIX, HP-UX) zsh нет, ставить его туда глупо, а писать под линукс на zsh и потом заботится о портировании бессмыслено.
Вобщем он для группы любителей.

sdio ★★★★★
()

Пионеры? Идите вы на хрен, пионеры! (с) Ф. Раневская.

anonymous
()
Ответ на: комментарий от anonymous

Ага и хистори ты совсем не ведешь? У тебя от kernel версии 0.1 как болтаются 2 терминала на разные системыы, так и болтаются? Очень удобно.

anonymous
()
Ответ на: комментарий от execve

блин, на каком-то из столов я отлаживаю команду для конвертации кучи картинок, на другом — обрабатываю текстовики. Обе операции занимают время, пока конвертятся картинки я смотрю что вышло с текстами и наоборот.

В любом случае, в bash можно иметь и одну хистори на все терминалы, и всегда можно было так делать, zsh тут ничем не выделяется.

Sphinx ★★☆☆
()
Ответ на: комментарий от sdio

>дык и др. языки есть. при чем тут перл, когда речь идет о шел?

а чем вам интерпритатор перл не шелл?

anonymous
()
Ответ на: комментарий от Sphinx

> блин, на каком-то из столов я отлаживаю команду для конвертации кучи картинок, на другом — обрабатываю текстовики. Обе операции занимают время, пока конвертятся картинки я смотрю что вышло с текстами и наоборот.

И? Чё-то как-то тема неудобства единой history не раскрыта.

execve
()
Ответ на: комментарий от execve

>Это не говоря уже о том, что _только_ Linux идёт с bash в качестве /bin/sh. Ты кроме Linux-то что-нибудь видел? ;)

И слава богу.

jackill ★★★★★
()
Ответ на: комментарий от execve

>Только после установки соответствующего пакета. Так же, как и zsh, кстати.

OpenSolaris 10 - сразу ставится.

>а сам bash менее фукнционален, чем zsh.

В плане интерпретатора или командной оболочки?

>Нажатием Ctrl-R в любом терминале вытаскивается любая команда, которая когда-либо набиралась мной за последние n лет

Это здорово, конечно. Но имхо если такая потребность в истории, то может нужно просто скрипты себе написать? :)

Зачем мне десять тысяч cd ~ к примеру? :)

jackill ★★★★★
()
Ответ на: комментарий от execve

>Особенно если терминалов несколько, они сидят на разных хостах (с общим $HOME, ага), и ещё активно используется screen.

А это разве безопасно? И какой смысл на разных хостах, имеющих доступ к одному HOME, сидеть одновременно под одним аккаунтом?

Вообще мозг взорван. Так себе и представляю - сижу на двух терминалах - пишу себе команды по разным темам на разные машины, и выполняю команды по очереди. Значит, они и в историю по очереди сыпятся? То есть цепочка команд не непрерывная? И как потом вспоминать?

jackill ★★★★★
()
Ответ на: комментарий от execve

>Примеры неудобства где?

Разорванная цепочка команд. Появление последних результатов команд из других терминалов, не относящихся к задаче, решаемых на данном.

jackill ★★★★★
()
Ответ на: комментарий от jackill

> А это разве безопасно?

NFS-mounted HOME? RTFM

> И какой смысл на разных хостах, имеющих доступ к одному HOME, сидеть одновременно под одним аккаунтом?

Чтобы выполнять на этих хостах специфичные для них действия?

> Вообще мозг взорван. Так себе и представляю - сижу на двух терминалах - пишу себе команды по разным темам на разные машины, и выполняю команды по очереди. Значит, они и в историю по очереди сыпятся? То есть цепочка команд не непрерывная? И как потом вспоминать?

Что такое "цепочка команд"?

> OpenSolaris 10 - сразу ставится.

Solaris 10 - не ставится. VasjaPupkinSolaris 10 - в качестве /bin/sh идёт scsh. И чо?

> Это здорово, конечно. Но имхо если такая потребность в истории, то может нужно просто скрипты себе написать? :)

Ага, ага. Вместо тысячи используемых пару (ну хорошо - десяток) раз в год и легко вытаскиваемых на свет из history команд - тысяча скриптов. Каждый со своим уникальным, неповторимым, легкозапоминаемым именем.

Не кури больше эту дрянь.

> Зачем мне десять тысяч cd ~ к примеру? :)

Ты бы почитал бы что ли прежде чем гнать сюда. Дубли подавляются.

> Появление последних результатов команд из других терминалов, не относящихся к задаче, решаемых на данном.

Ты гонишь.

execve
()
Ответ на: комментарий от execve

>Ты гонишь.

Согласно твоему описанию, команды оказываются в истории сразу. Значит, если на одном терминале я задавал параметры интерфейса, а на другом правил права на каталоги и при этом переключался туда-сюда, то, выходит, что при вызове той же команды для интерфейса, я получу команду для исправления прав на каталог.

>Ты бы почитал бы что ли прежде чем гнать сюда. Дубли подавляются.

Тогда смысл, если мне нужно выполнить ПОСЛЕДОВАТЕЛЬНОСТЬ команд?

>Вместо тысячи используемых пару

Жесть. Ты что там делаешь, в терминале-то? Причем на одних и тех же машинах? Может пора взять принцип IBM - машина должна работать, а человек - думать?

>VasjaPupkinSolaris 10 - в качестве /bin/sh идёт scsh. И чо?

Запишем - пи№;%л на OpenSolaris.

>Чтобы выполнять на этих хостах специфичные для них действия?

Если действия специфичны для каждого хоста, по кой хрен общая история команд?

>NFS-mounted HOME? RTFM

И что? Весьма небезопасно, особенно шаря свой хоум куда ни попадя.

А ты вообще пробовал читать все ответы, а не выборочно?

jackill ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.