URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9539
[ Назад ]

Исходное сообщение
"Shell и конвеер"

Отправлено mrRadio , 11-Сен-12 19:19 
Подскажите пожалуйста, нужно парсить вывод утилиты smbclient -gNL $ip, находить в выводе сервер samb`ы и его шары, но приходится сначала сливать вывод smbclient в tmp файл (так-как если испоьзовать конвеер переменные за циклом не будут сохраняться из-за subshell`a), чтобы его потом построчно разобрать в теле цикла и передавать результаты в переменные для дальнейших действий в функцию, вопрос заключается в том можно ли убрать tmp файл, используя каким нибудь образом конвеер, так-как ip много, нехочется делать лишнюю нагрузку на файловую систему, да и некрасиво это как мне кажется!?
p.s. пишу на shell, a не на bash, поэтому перенаправление в стиле "done < <(чего-то там)" не работает.
    while read line
    do
       object=`echo $line|awk -F"|" '{print $1}'`
       case "$object" in
          Disk)
                tmp=`echo $line|awk -F"|" '{print $2}'`
                dsk="$tmp $dsk"
                ;;
          IPC)
                ipc=`echo $line|awk '{print $3}'|tr -d "()"`
                ;;
          Server)
                echo $line|grep -q $ipc
                if [ $? -eq 0 ]
                then
                   srv=`echo $line|awk -F"|" '{print $2}'`
                fi
                ;;
       esac
    done < $ip.smb

Содержание

Сообщения в этом обсуждении
"Shell и конвеер"
Отправлено vle , 11-Сен-12 20:26 
0 cheusov>printf 'Всё\nработает\n' | { while read l; do ret="$ret $l"; done; echo $ret; }
Всё работает
0 0 cheusov>

"Shell и конвеер"
Отправлено mrRadio , 11-Сен-12 23:52 
> 0 cheusov>printf 'Всё\nработает\n' | { while read l; do ret="$ret $l"; done;
> echo $ret; }
> Всё работает
> 0 0 cheusov>

Вопрос в том что если поместить то что вы написали в скрипт, то вне тела цикла while, переменная $ret будет пустой, мне же нужно чтобы переменная была доступна вне цикла, но это невозможно из-за конвеера
поробуйте запустить такой вариант и поймете о чем я говорю:

#!/bin/sh
printf 'Всё\nработает\n' | { while read l; do ret="$ret $l"; done; echo $ret; }
echo $ret


"Shell и конвеер"
Отправлено vle , 12-Сен-12 00:39 
> #!/bin/sh
> printf 'Всё\nработает\n' | { while read l; do ret="$ret $l"; done; echo
> $ret; }
> echo $ret

Вопрос задать, конечно, можно, но надо же немного думать и над ответом.
Фигурные скобки там, где я их поставил, для чего стоят?


"Shell и конвеер"
Отправлено mrRadio , 12-Сен-12 01:22 
Спасибо разобрался, совсем забыл про блок!