Re: bash и область видимости переменной в while

2014-03-04 Пенетрантность Oleksandr Gavenko
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

2014-02-18 Пенетрантность Vladimir Skubriev
А. Понял. Спасибо)

Деревня )

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

2014-02-17 Пенетрантность Alexander Galanin
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

2014-02-17 Пенетрантность Artem Chuprina
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

2014-02-17 Пенетрантность Artem Chuprina
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

2014-02-17 Пенетрантность Vladimir Zhbanov
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

2014-02-17 Пенетрантность dimas
 Потому что пайп создаёт вложенный шелл со своими переменными. Можно
 записать во временный файл, который считать после цикла.
истинно так, сам натыкался на эти грабли, долго не мог понять, в чем же дело,
помогло вдумчивое чтение 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

2014-02-17 Пенетрантность Artem Chuprina
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

2014-02-17 Пенетрантность Vladimir Skubriev
Сделал так:

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

2014-02-17 Пенетрантность Artem Chuprina
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

2014-02-16 Пенетрантность Vladimir Skubriev
  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