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

Исходное сообщение
"sh, stdout stderr"

Отправлено Аноним , 19-Июн-12 19:30 
как вывод с stdout и stderr некой команды записать в переменные?

что-то одно без проблем:
so=$(date)
se=$(date 2>&1)
но как и stdout и stderr?


Содержание

Сообщения в этом обсуждении
"sh, stdout stderr"
Отправлено Pahanivo , 19-Июн-12 19:35 
> как вывод с stdout и stderr некой команды записать в переменные?
> что-то одно без проблем:
> so=$(date)
> se=$(date 2>&1)
> но как и stdout и stderr?

запиши в файлы, загрузи файлы в переменные


"sh, stdout stderr"
Отправлено Аноним , 20-Июн-12 02:34 
> запиши в файлы, загрузи файлы в переменные

красоты нет :)


"sh, stdout stderr"
Отправлено ACCA , 19-Июн-12 20:35 
> se=$(date 2>&1)

Вот так. Ты перенаправил 2>&1, при этом 1 остался. Получаешь обоих в $se.


"sh, stdout stderr"
Отправлено Аноним , 20-Июн-12 02:31 
>> se=$(date 2>&1)
> Вот так. Ты перенаправил 2>&1, при этом 1 остался. Получаешь обоих в
> $se.

ну да, но это не вопрос же:
se=`(date >/dev/null) 2>&1`


"sh, stdout stderr"
Отправлено Andrey Mitrofanov , 20-Июн-12 09:35 
>>> se=$(date 2>&1)
>> Вот так. Ты перенаправил 2>&1, при этом 1 остался. Получаешь обоих в
>> $se.
> ну да, но это не вопрос же:
> se=`(date >/dev/null) 2>&1`

( и ) лишние.

А про красоту... Вот такой "заход" не работает:

  481  tst() { echo 'out'; echo 'RRR' >&2; }
  482  tst
  483  read a < <( { read b < <( tst ) ; } 2>&1 ); echo "$a+$b"
  484  a=3; b=4; read a < <( { read b < <( tst ) ; } 2>&1 ); echo "$a+$b"
  485  a=3; b=4; read a < <( { { read b; echo "bb:$b" } < <( tst ) ; } 2>&1 ); echo "$a+$b"
  486  a=3; b=4; read a < <( { { read b; echo "bb:$b"; } < <( tst ) ; } 2>&1 ); echo "$a+$b"
  487  a=3; b=4; read a < <( { { read b; echo "bb:$b"; } < <( tst ) ; } >&3 2>&1 3>&2 ); echo "$a+$b"
  488  a=3; b=4; read a < <( { { read b; echo "bb:$b" >&3; } < <( tst ) ; } 2>&1 3>&2 ); echo "$a+$b"
  489  a=3; b=4; read a < <( { { read b; echo "bb:$b" >&2; } < <( tst ) ; } 2>&1 3>&2 ); echo "$a+$b"
  490  export b; a=3; b=4; read a < <( { { read b; echo "bb:$b" >&2; } < <( tst ) ; } 2>&1 3>&2 ); echo "$a+$b"
  491  export b; a=3; b=4; read a < <( { read b;} < <( tst ) ; } 2>&1 3>&2 ); echo "$a+$b"
  492  export b; a=3; b=4; read a < <( { read b; } < <( tst ) ; } 2>&1 3>&2 ); echo "$a+$b"
  493  export b; a=3; b=4; read a < <( { read b; } < <( tst ) 2>&1 ); echo "$a+$b"
  494  export b; a=3; b=4; read a < <( { read b; export b; } < <( tst ) 2>&1 ); echo "$a+$b"
  495  export b; a=3; b=4; read a < <( { read b; export b; } < <( tst ) 2>&1; ); echo "$a+$b"
  496  export b; a=3; b=4; { read a < <( { read b; export b; } < <( tst ) 2>&1; ) } ; echo "$a+$b"
  497  export b; a=3; b=4; { read a < <( { read b; export b; } < <( tst ) 2>&1; ) }; echo "$a+$b"
  498  export b; a=3; b=4; { read a < <( read b < <( tst ) 2>&1; ) }; echo "$a+$b"
  499  export b; a=3; b=4; { read a < <( read b < <( tst ) 2>&1; ); }; echo "$a+$b"

С mkfifo у меня тоже не вышло.

По факту нужно _2 одновременных read-а в _одном контексте-шеле -- чтоб обе переменные получили видимые в одном месте значения... У меня за две-три минуты не вышло.


"sh, stdout stderr"
Отправлено Аноним , 20-Июн-12 10:42 
>>>> se=$(date 2>&1)
>>> Вот так. Ты перенаправил 2>&1, при этом 1 остался. Получаешь обоих в
>>> $se.
>> ну да, но это не вопрос же:
>> se=`(date >/dev/null) 2>&1`
> ( и ) лишние.

не лишнее, пример 1:
====================
#!/bin/sh
se=`date gdfg >/dev/null 2>&1`
echo $se

# sh -x ./bin/test.sh
+ date gdfg
+ se=''
+ echo
====================

пример 2:
====================
#!/bin/sh
se=`(date gdfg >/dev/null) 2>&1`
echo $se

# sh -x ./bin/test.sh
+ se='+ date gdfg
date: illegal time format
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
            [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]'
+ echo + date gdfg date: illegal time format usage: date '[-jnu]' '[-d' dst] '[-r' seconds] '[-t' west] '[-v[+|-]val[ymwdHMS]]' ... '[-f' fmt date '|' '[[[[[cc]yy]mm]dd]HH]MM[.ss]]' '[+format]'
+ date gdfg date: illegal time format usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]
====================


>[оверквотинг удален]
>   498  export b; a=3; b=4; { read a <
> <( read b < <( tst ) 2>&1; ) }; echo
> "$a+$b"
>   499  export b; a=3; b=4; { read a <
> <( read b < <( tst ) 2>&1; ); }; echo
> "$a+$b"
> С mkfifo у меня тоже не вышло.
> По факту нужно _2 одновременных read-а в _одном контексте-шеле -- чтоб обе
> переменные получили видимые в одном месте значения... У меня за две-три
> минуты не вышло.

долго вчера игрался, так ничего и не получилось, нарисовал функцию с tmp файлом:

q1=''
q2=''
comexec(){
        err=`mktemp /tmp/XXXXXXX`
        if [ $? -ne 0 ]; then
                echo "not create tmp file"
                exit;
        fi
        exec 3>&2
        exec 2>$err
        q1=`eval "$1"`
        exec 2>&3 3>&-
        q2=`cat $err`
        if [ $? -ne 0 ]; then
                echo "not read tmp file"
                exit;
        fi
        rm $err
}


"sh, stdout stderr"
Отправлено Andrey Mitrofanov , 21-Июн-12 13:31 
>>> se=`(date >/dev/null) 2>&1`
>> ( и ) лишние.
> не лишнее, пример 1:

И точно. Хардкорный садо-мазо ABS :/

Вот так "без скобок" (=без субщела) у меня (и Advanced Bash-Scripting Guide-а, да) получилось:

$ se="`date     3>&1 2>&1 >/dev/null `"; echo +$se+
$ se="`date ddd 3>&1 2>&1 >/dev/null `"; echo +$se+

Но проблемы двух риидов в одном контексте это не решает, да.


"sh, stdout stderr"
Отправлено Аноним , 21-Июн-12 20:05 
>>>> se=`(date >/dev/null) 2>&1`
>>> ( и ) лишние.
>> не лишнее, пример 1:
> И точно. Хардкорный садо-мазо ABS :/
> Вот так "без скобок" (=без субщела) у меня (и Advanced Bash-Scripting Guide-а,
> да) получилось:
> $ se="`date     3>&1 2>&1 >/dev/null `"; echo +$se+
> $ se="`date ddd 3>&1 2>&1 >/dev/null `"; echo +$se+
> Но проблемы двух риидов в одном контексте это не решает, да.

Медитировал-медитировал, но так и не вымедитировал зачем кавычки нужны (se="..."). При test-е (if [ "se" == "" ]), если предыдущее выражение вернет пустой результат, все равно же se в скобки брать придется? Чего я в этом мире не знаю?


"sh, stdout stderr"
Отправлено Andrey Mitrofanov , 22-Июн-12 16:03 
>>>> ( и ) лишние.

:>

>> $ se="`date ddd 3>&1 2>&1 >/dev/null `"; echo +$se+
>> Но проблемы двух риидов в одном контексте это не решает, да.
> Медитировал-медитировал, но так и не вымедитировал зачем кавычки нужны (se="...")

Ага, сам такой, именно. Я не _знаю последовательности экспаншенов и подстановок, поэтому пишу лишние кавычки. Недостаток образования <В)))


"sh, stdout stderr"
Отправлено Аноним , 22-Июн-12 19:02 
>>> $ se="`date ddd 3>&1 2>&1 >/dev/null `"; echo +$se+
>>> Но проблемы двух риидов в одном контексте это не решает, да.
>> Медитировал-медитировал, но так и не вымедитировал зачем кавычки нужны (se="...")
> Ага, сам такой, именно. Я не _знаю последовательности экспаншенов и подстановок, поэтому
> пишу лишние кавычки. Недостаток образования <В)))

А... перестраховка всегда хорошо, да :)


"sh, stdout stderr"
Отправлено pavlinux , 22-Июн-12 06:23 
> как вывод с stdout и stderr некой команды записать в переменные?

Чёй-то я не фкурю...
Надо разделить выходной поток из команды на два и
каждый записать в свою переменную, за одну команду?


"sh, stdout stderr"
Отправлено Аноним , 22-Июн-12 19:01 
>> как вывод с stdout и stderr некой команды записать в переменные?
> Чёй-то я не фкурю...
> Надо разделить выходной поток из команды на два и
> каждый записать в свою переменную, за одну команду?

хотелось бы. в разные файлы же одновременно можно.


"sh, stdout stderr"
Отправлено pavlinux , 24-Июн-12 07:03 
>>> как вывод с stdout и stderr некой команды записать в переменные?
>> Чёй-то я не фкурю...
>> Надо разделить выходной поток из команды на два и
>> каждый записать в свою переменную, за одну команду?
> хотелось бы. в разные файлы же одновременно можно.

В две переменные - нельзя!
В два файла - нельзя!
В переменную и файл - нельзя!
В переменную и на консоль - можно!

{ se=$(date ddd 2>&1 1>&3-) ;} 3>&1;
echo $se;


"sh, stdout stderr"
Отправлено Pahanivo , 24-Июн-12 11:38 
> В два файла - нельзя!

some_sript.sh > /tmp/stdout_file 2>/tmp/stderr_file


"sh, stdout stderr"
Отправлено Аноним , 24-Июн-12 12:02 
> В два файла - нельзя!

date >/1.log 2>/2.log

> В переменную и файл - нельзя!

se=$(date 2>/2.log)


"sh, stdout stderr"
Отправлено pavlinux , 24-Июн-12 16:47 
>> В два файла - нельзя!
> date >/1.log 2>/2.log
>> В переменную и файл - нельзя!
> se=$(date 2>/2.log)

Ну хрен знает, в две переменные точно низя.


"sh, stdout stderr"
Отправлено Pahanivo , 24-Июн-12 21:39 
> Ну хрен знает, в две переменные точно низя.

:) fail за'shit'ан


"sh, stdout stderr"
Отправлено pavlinux , 25-Июн-12 03:03 
>> Ну хрен знает, в две переменные точно низя.
> :) fail за'shit'ан

Не всё так просто :)


"sh, stdout stderr"
Отправлено LSTemp , 26-Июн-12 01:28 
>>>> как вывод с stdout и stderr некой команды записать в переменные?
>>> Чёй-то я не фкурю...
>>> Надо разделить выходной поток из команды на два и
>>> каждый записать в свою переменную, за одну команду?
>> хотелось бы. в разные файлы же одновременно можно.
> В две переменные - нельзя!
> В два файла - нельзя!

можно:

#!/bin/bash
cmd='date'
res=`$cmd 1>succ 2>fail`

> В переменную и файл - нельзя!

?? не ожидал от Вас. из приведенного выше примера - ясно, что можно:

res=`$cmd 1>succ`
или
res=`$cmd 2>fail`

> В переменную и на консоль - можно!
> { se=$(date ddd 2>&1 1>&3-) ;} 3>&1;
> echo $se;

PS
непонятно чем Вы руководствовались, когда перенаправление вывода на консоль, отделили от той же операции с файлами.



"sh, stdout stderr"
Отправлено pavlinux , 26-Июн-12 01:47 
> непонятно чем Вы руководствовались, когда перенаправление вывода на консоль, отделили
> от той же операции с файлами.

Тема начиналась про две переменные, запутали меня вы тут...



"sh, stdout stderr"
Отправлено LSTemp , 26-Июн-12 02:51 
>> непонятно чем Вы руководствовались, когда перенаправление вывода на консоль, отделили
>> от той же операции с файлами.
> Тема начиналась про две переменные, запутали меня вы тут...

это мы могём. всегда видно, когда подустал человек. и тут мы его на взлете - бах!!! блин.. че это я.... ))))

PS
кстати задачка по определению периода в длинном числе только на шеле вроде от Вас была? очень понравилась.


"sh, stdout stderr"
Отправлено Pahanivo , 26-Июн-12 06:37 
res=`$cmd 1>succ`

и что будет в переменной? :)


"sh, stdout stderr"
Отправлено LSTemp , 28-Июн-12 01:14 
> res=`$cmd 1>succ`
> и что будет в переменной? :)

ничего. в файл весь стандартный вывод попрет. )



"sh, stdout stderr"
Отправлено LSTemp , 28-Июн-12 01:25 
>> res=`$cmd 1>succ`
>> и что будет в переменной? :)
> ничего. в файл весь стандартный вывод попрет. ) зато вывод ошибок попрет на консоль - уже разделение. именно это и хотел показать. просто ненужную в данном случае переменную забыл убрать - каюсь ).

"sh, stdout stderr"
Отправлено Pahanivo , 29-Июн-12 23:01 
>>> res=`$cmd 1>succ`
>>> и что будет в переменной? :)
>> ничего. в файл весь стандартный вывод попрет. ) зато вывод ошибок попрет на консоль - уже разделение. именно это и хотел показать. просто ненужную в данном случае переменную забыл убрать - каюсь ).

падла ... падла ... падлавил (С)


"sh, stdout stderr"
Отправлено pavlinux , 26-Июн-12 23:13 
> PS
> кстати задачка по определению периода в длинном числе только на шеле вроде
> от Вас была? очень понравилась.

Чё, решил?



"sh, stdout stderr"
Отправлено LSTemp , 28-Июн-12 01:20 
>> PS
>> кстати задачка по определению периода в длинном числе только на шеле вроде
>> от Вас была? очень понравилась.
> Чё, решил?

Не. Ссылку как на зло потерял (там же задача в продолжении какой-то темы была - найти сейчас сложно). Когда читал - с дня рождения возвращался - решил на завтра отложить. Сейчас точные условия задачи не вспомню. Линканешь? Мне правда интересно.



"sh, stdout stderr"
Отправлено Аноним , 28-Июн-12 18:45 
>>> PS
>>> кстати задачка по определению периода в длинном числе только на шеле вроде
>>> от Вас была? очень понравилась.
>> Чё, решил?
> Не. Ссылку как на зло потерял (там же задача в продолжении какой-то
> темы была - найти сейчас сложно). Когда читал - с дня
> рождения возвращался - решил на завтра отложить. Сейчас точные условия задачи
> не вспомню. Линканешь? Мне правда интересно.

сиё? http://www.opennet.me/openforum/vsluhforumID9/9467.html
Павлуша тут отжег как надо, да.


"sh, stdout stderr"
Отправлено LSTemp , 29-Июн-12 21:22 
>>>> PS
>>>> кстати задачка по определению периода в длинном числе только на шеле вроде
>>>> от Вас была? очень понравилась.
>>> Чё, решил?
>> Не. Ссылку как на зло потерял (там же задача в продолжении какой-то
>> темы была - найти сейчас сложно). Когда читал - с дня
>> рождения возвращался - решил на завтра отложить. Сейчас точные условия задачи
>> не вспомню. Линканешь? Мне правда интересно.
> сиё? http://www.opennet.me/openforum/vsluhforumID9/9467.html
> Павлуша тут отжег как надо, да.

Оно! Спасибо.



"sh, stdout stderr"
Отправлено Pahanivo , 29-Июн-12 23:02 
парни, вы меня пугаете своими странными фетишами!

"sh, stdout stderr"
Отправлено LSTemp , 30-Июн-12 01:09 
> парни, вы меня пугаете своими странными фетишами!

при чем тут фетишизм? ) я хотел просто мозги в кучу собрать.

2Аноним (еще раз спасибо за ссылку) - ИМХО задача не решаема чисто по мат определению исходных условий.

PS
а так найти:
- период десятичной дроби чисто на bash не проблема.
- к решению второго пункта задачи при реальных реальных условиях я бы подошел с того, что степени 10 в знаменатель ставил для начала (для простоты). деление на bash столбиком уже показали - останется только реализация вычисления интегралов в общем случае)


"sh, stdout stderr"
Отправлено Andrey Mitrofanov , 30-Июн-12 09:29 
> 2Аноним (еще раз спасибо за ссылку) - ИМХО задача не решаема чисто
> по мат определению исходных условий.

Нет. Решаема. //Я б рассказал как, но :D поля этого трактата...

(И делимое-делитель я б ограничил _базовым целым bash-а. Дописывать _на _bash-e gmplib для решения более общей задачи было бы... Хотя... :)Павлины  среди нас.)


"sh, stdout stderr"
Отправлено LSTemp , 03-Июл-12 05:18 
>> 2Аноним (еще раз спасибо за ссылку) - ИМХО задача не решаема чисто
>> по мат определению исходных условий.
> Нет. Решаема. //Я б рассказал как, но :D поля этого трактата...

if поля
then
  трактаРа
else
  echo 'error'
endif

> (И делимое-делитель я б ограничил _базовым целым bash-а. Дописывать _на _bash-e gmplib
> для решения более общей задачи было бы... Хотя... :)Павлины  среди
> нас.)

Сколково по тебе плачет).



"sh, stdout stderr"
Отправлено Аноним , 01-Июл-12 13:17 
> парни, вы меня пугаете своими странными фетишами!

Ну причем тут фитишизм, просто ведь интересное решение задачи, разве нет?

LSTemp, пожалуйста :)


"sh, stdout stderr"
Отправлено LSTemp , 03-Июл-12 04:43 
>> парни, вы меня пугаете своими странными фетишами!
> Ну причем тут фитишизм, просто ведь интересное решение задачи, разве нет?
> LSTemp, пожалуйста :)

ну дальше там уж давайте - в источнике:
http://www.opennet.me/openforum/vsluhforumID9/9467.html#16


"sh, stdout stderr"
Отправлено LSTemp , 26-Июн-12 01:02 
> как вывод с stdout и stderr некой команды записать в переменные?
> что-то одно без проблем:
> so=$(date)
> se=$(date 2>&1)
> но как и stdout и stderr?

для bash так кпримерно проще будет:
temp=`command 2>&1`
[ $? -eq 0 ] && echo "result: $temp" || echo "error: $temp"

анализируем код возврата предыдущей комады и решаем - ошибка или нет. после этого выполняем соотвействующие действия.



"sh, stdout stderr"
Отправлено pavlinux , 26-Июн-12 01:50 
> анализируем код возврата предыдущей комады и решаем - ошибка или нет.


int main(void) {

   write(1, "ERROR\n", 6);
   write(2, "FINE\n", 5);

   return 0;
}

:)


"sh, stdout stderr"
Отправлено LSTemp , 26-Июн-12 02:50 
>> анализируем код возврата предыдущей комады и решаем - ошибка или нет.
>
 
> int main(void) {
>    write(1, "ERROR\n", 6);
>    write(2, "FINE\n", 5);
>    return 0;
> }
>

> :)

)