Re: bash и область видимости переменной в while
On 2014-02-18, Vladimir Skubriev wrote: Что делают внутренние скобки ? Круглые - создают отдельный процесс. Фигурные - в текущем. Из POSIX: Grouping Commands The format for grouping commands is as follows: (compound-list) Execute compound-list in a subshell environment; see Shell Execution Environment . Variable assignments and built-in commands that affect the environment shall not remain in effect after the list finishes. { compound-list;} Execute compound-list in the current process environment. The semicolon shown here is an example of a control operator delimiting the } reserved word. Other delimiters are possible, as shown in Shell Grammar ; a newline is frequently used. Зачем может понадобиться { }? Из POSIX (см. пример XXX ниже): Each redirection shall apply to all the commands within the compound command that do not explicitly override that redirection. $ ( var=1; ); echo x $var x x x $ { var=1; }; echo x $var x x 1 x $ { var=x; echo $var; } | cat echo $var x 1 $ { var=x; echo $var; } | cat echo $var x 1 $ { var=x; echo $var; } /dev/null echo $var# XXX x $ { false; true; } echo ok || echo fail ok $ { true; false; } echo ok || echo fail fail $ ( exit 0 ) echo ok || echo fail ok $ ( exit 1 ) echo ok || echo fail fail $ { echo user XXX YYY; echo cd /pub; echo put backup.tgz; echo exit; } | ftp -n server.org -- Best regards! -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: https://lists.debian.org/87vbvtlj1w@gavenkoa.example.com
Re: bash и область видимости переменной в while
А. Понял. Спасибо) Деревня ) 18.02.2014, 11:14, Artem Chuprina r...@ran.pp.ru: Vladimir Skubriev - Debian-russian @ Tue, 18 Feb 2014 09:08:37 +0400: VS Сделал так: VS while read line VS do VS if echo $line | grep -q 'Installed Size' VS then VS module=$( echo $line | sed -r 's/(^.*: )(.*)(\(.*$)/\2/' ) VS printf MODULE: $module\n VS ram_mods=$ram_mods $module VS fi VS done (echo $dmidecode_t6_out) VS Заработал. VS Что делают внутренние скобки ? VS Без них ругался. Которые? Мои? Объединяют while и echo $var в один процесс, в который и идет пайп. Но без них ругаться не должно. Или выше вокруг echo? Это синтаксис такой. Подстановка вывода процесса в качестве файла. VS 17.02.2014, 13:12, Artem Chuprina r...@ran.pp.ru: Vladimir Skubriev - Debian-russian @ Mon, 17 Feb 2014 11:52:06 +0400: VS dmidecode_t6_out=$( dmidecode -t 6) VS VS VS echo $dmidecode_t6_out | while read line VS do VS if echo $line | grep -q 'Installed Size' VS then VS module=$( echo $line | sed -r 's/(^.*: )(.*)(\(.*$)/\2/' ) VS printf Founded MODULE: $module\n VS ram_mods=$ram_mods $module VS fi VS done VS VS printf Modules: $ram_mods\n VS VS Почему последний printf печатает только Modules без содержания переменной $ram_mods ? Да, помогает извращение вида var=$(echo -e qqq\nwww | ( while read line; do var=$var $line; done; echo $var )) Внутренние скобки существенны. -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87ob266r3s@wizzle.ran.pp.ru VS -- VS Faithfully yours, VS Vladimir Skubriev VS -- VS To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org VS with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org VS Archive: http://lists.debian.org/16811392700...@web21m.yandex.ru -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/8761oc7v1r@wizzle.ran.pp.ru -- Faithfully yours, Vladimir Skubriev -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/387511392714...@web30g.yandex.ru
Re: bash и область видимости переменной в while
On Mon, 17 Feb 2014 11:52:06 +0400 Vladimir Skubriev vladi...@skubriev.ru wrote: echo $dmidecode_t6_out | while read line ... Почему последний printf печатает только Modules без содержания переменной $ram_mods ? Потому что пайп создаёт вложенный шелл со своими переменными. Можно записать во временный файл, который считать после цикла. -- Alexander Galanin -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20140217122952.ee08ae14bccda0e4be0b4...@galanin.nnov.ru
Re: bash и область видимости переменной в while
Vladimir Skubriev - Debian-russian @ Mon, 17 Feb 2014 11:52:06 +0400: VS VS VS dmidecode_t6_out=$( dmidecode -t 6) VS VS VS echo $dmidecode_t6_out | while read line VS do VS if echo $line | grep -q 'Installed Size' VS then VS module=$( echo $line | sed -r 's/(^.*: )(.*)(\(.*$)/\2/' ) VS printf Founded MODULE: $module\n VS ram_mods=$ram_mods $module VS fi VS done VS VS printf Modules: $ram_mods\n VS VS Почему последний printf печатает только Modules без содержания переменной $ram_mods ? VS VS Спасибо! Это область видимости не у while, а у |. while запускается в подпроцессе. Но что-то у меня сходу не получилось показать, как правильно. Может, коллеги помогут... Работает sed -e 's/^/zzz/' (echo -e qqq\nwww) и работает while read line; do var=$var $line; done nic.ru; echo Var=$var А вот while read line; do var=$var $line; done (echo -e qqq\nwww); echo Var=$var выдает bash: syntax error near unexpected token `(echo -e qqq\nwww)' zsh - аналогично, почему - не понимаю. Подозреваю порядок подстановки... -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87siri6r8u@wizzle.ran.pp.ru
Re: bash и область видимости переменной в while
Vladimir Skubriev - Debian-russian @ Mon, 17 Feb 2014 11:52:06 +0400: VS dmidecode_t6_out=$( dmidecode -t 6) VS VS VS echo $dmidecode_t6_out | while read line VS do VS if echo $line | grep -q 'Installed Size' VS then VS module=$( echo $line | sed -r 's/(^.*: )(.*)(\(.*$)/\2/' ) VS printf Founded MODULE: $module\n VS ram_mods=$ram_mods $module VS fi VS done VS VS printf Modules: $ram_mods\n VS VS Почему последний printf печатает только Modules без содержания переменной $ram_mods ? Да, помогает извращение вида var=$(echo -e qqq\nwww | ( while read line; do var=$var $line; done; echo $var )) Внутренние скобки существенны. -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87ob266r3s@wizzle.ran.pp.ru
Re: bash и область видимости переменной в while
On Mon, Feb 17, 2014 at 01:08:33PM +0400, Artem Chuprina wrote: ... А вот while read line; do var=$var $line; done (echo -e qqq\nwww); echo Var=$var выдает bash: syntax error near unexpected token `(echo -e qqq\nwww)' zsh - аналогично, почему - не понимаю. Подозреваю порядок подстановки... Попробуйте так while read line; do var=$var $line; done (echo -e qqq\nwww); echo Var=$var -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20140217120100.GA25695@localhost.localdomain
Re: bash и область видимости переменной в while
Потому что пайп создаёт вложенный шелл со своими переменными. Можно записать во временный файл, который считать после цикла. истинно так, сам натыкался на эти грабли, долго не мог понять, в чем же дело, помогло вдумчивое чтение man bash)) в данном случае можно испольовать что-то типа while read line; do бла-бла-бла done EOF ...ввод, с которым работаем... EOF смотрел по своему примеру, в котором все работает (кстати, именно с while read line...), переменные видны всем желающим -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20140217180755.67637...@ulf.tvoe.tv
Re: bash и область видимости переменной в while
Vladimir Zhbanov - debian-russian@lists.debian.org @ Mon, 17 Feb 2014 16:01:00 +0400: А вот while read line; do var=$var $line; done (echo -e qqq\nwww); echo Var=$var выдает bash: syntax error near unexpected token `(echo -e qqq\nwww)' zsh - аналогично, почему - не понимаю. Подозреваю порядок подстановки... VZ Попробуйте так VZ while read line; do var=$var $line; done (echo -e qqq\nwww); echo Var=$var О, работает. Осознал идею, спасибо. -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87iosd7m8b@wizzle.ran.pp.ru
Re: bash и область видимости переменной в while
Сделал так: while read line do if echo $line | grep -q 'Installed Size' then module=$( echo $line | sed -r 's/(^.*: )(.*)(\(.*$)/\2/' ) printf MODULE: $module\n ram_mods=$ram_mods $module fi done (echo $dmidecode_t6_out) Заработал. Что делают внутренние скобки ? Без них ругался. 17.02.2014, 13:12, Artem Chuprina r...@ran.pp.ru: Vladimir Skubriev - Debian-russian @ Mon, 17 Feb 2014 11:52:06 +0400: VS dmidecode_t6_out=$( dmidecode -t 6) VS VS VS echo $dmidecode_t6_out | while read line VS do VS if echo $line | grep -q 'Installed Size' VS then VS module=$( echo $line | sed -r 's/(^.*: )(.*)(\(.*$)/\2/' ) VS printf Founded MODULE: $module\n VS ram_mods=$ram_mods $module VS fi VS done VS VS printf Modules: $ram_mods\n VS VS Почему последний printf печатает только Modules без содержания переменной $ram_mods ? Да, помогает извращение вида var=$(echo -e qqq\nwww | ( while read line; do var=$var $line; done; echo $var )) Внутренние скобки существенны. -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87ob266r3s@wizzle.ran.pp.ru -- Faithfully yours, Vladimir Skubriev -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/16811392700...@web21m.yandex.ru
Re: bash и область видимости переменной в while
Vladimir Skubriev - Debian-russian @ Tue, 18 Feb 2014 09:08:37 +0400: VS Сделал так: VS while read line VS do VS if echo $line | grep -q 'Installed Size' VS then VS module=$( echo $line | sed -r 's/(^.*: )(.*)(\(.*$)/\2/' ) VS printf MODULE: $module\n VS ram_mods=$ram_mods $module VS fi VS done (echo $dmidecode_t6_out) VS Заработал. VS Что делают внутренние скобки ? VS Без них ругался. Которые? Мои? Объединяют while и echo $var в один процесс, в который и идет пайп. Но без них ругаться не должно. Или выше вокруг echo? Это синтаксис такой. Подстановка вывода процесса в качестве файла. VS 17.02.2014, 13:12, Artem Chuprina r...@ran.pp.ru: Vladimir Skubriev - Debian-russian @ Mon, 17 Feb 2014 11:52:06 +0400: VS dmidecode_t6_out=$( dmidecode -t 6) VS VS VS echo $dmidecode_t6_out | while read line VS do VS if echo $line | grep -q 'Installed Size' VS then VS module=$( echo $line | sed -r 's/(^.*: )(.*)(\(.*$)/\2/' ) VS printf Founded MODULE: $module\n VS ram_mods=$ram_mods $module VS fi VS done VS VS printf Modules: $ram_mods\n VS VS Почему последний printf печатает только Modules без содержания переменной $ram_mods ? Да, помогает извращение вида var=$(echo -e qqq\nwww | ( while read line; do var=$var $line; done; echo $var )) Внутренние скобки существенны. -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/87ob266r3s@wizzle.ran.pp.ru VS -- VS Faithfully yours, VS Vladimir Skubriev VS -- VS To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org VS with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org VS Archive: http://lists.debian.org/16811392700...@web21m.yandex.ru -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/8761oc7v1r@wizzle.ran.pp.ru
bash и область видимости переменной в while
dmidecode_t6_out="$( dmidecode -t 6)" echo "$dmidecode_t6_out" | while read line do if echo "$line" | grep -q 'Installed Size' then module="$( echo "$line" | sed -r 's/(^.*: )(.*)(\(.*$)/\2/' )" printf "Founded MODULE: $module\n" ram_mods="$ram_mods $module" fi done printf "Modules: $ram_mods\n" Почему последний printf печатает только Modules без содержания переменной $ram_mods ? Спасибо! --Faithfully yours, Vladimir Skubriev -- To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/251081392623...@web27j.yandex.ru