The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
sh, stdout stderr, !*! Аноним, 19-Июн-12, 19:30  [смотреть все]
как вывод с stdout и stderr некой команды записать в переменные?

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

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

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

  • sh, stdout stderr, !*! ACCA, 20:35 , 19-Июн-12 (2)
    > se=$(date 2>&1)

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

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

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

      • sh, stdout stderr, !*! Andrey Mitrofanov, 09:35 , 20-Июн-12 (5)
        >>> 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, !*! Аноним, 10:42 , 20-Июн-12 (6)
          >>>> 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, 13:31 , 21-Июн-12 (7)
            >>> 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, !*! Аноним, 20:05 , 21-Июн-12 (8)
              >>>> 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, 16:03 , 22-Июн-12 (10)
                >>>> ( и ) лишние.

                :>

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

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

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

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

  • sh, stdout stderr, !*! pavlinux, 06:23 , 22-Июн-12 (9)
    > как вывод с stdout и stderr некой команды записать в переменные?

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

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

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

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

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

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

        • sh, stdout stderr, !*! Pahanivo, 11:38 , 24-Июн-12 (14)
          > В два файла - нельзя!

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

        • sh, stdout stderr, !*! Аноним, 12:02 , 24-Июн-12 (15)
          > В два файла - нельзя!

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

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

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

        • sh, stdout stderr, !*! LSTemp, 01:28 , 26-Июн-12 (20)
          >>>> как вывод с 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, 01:47 , 26-Июн-12 (21)
            > непонятно чем Вы руководствовались, когда перенаправление вывода на консоль, отделили
            > от той же операции с файлами.

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


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

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

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

              • sh, stdout stderr, !*! Pahanivo, 06:37 , 26-Июн-12 (25)
                res=`$cmd 1>succ`

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

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

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


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

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

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

                Чё, решил?


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

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


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

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

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

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


                      • sh, stdout stderr, !*! Pahanivo, 23:02 , 29-Июн-12 (33)
                        парни, вы меня пугаете своими странными фетишами!
                        • sh, stdout stderr, !*! LSTemp, 01:09 , 30-Июн-12 (34)
                          > парни, вы меня пугаете своими странными фетишами!

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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





Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру