The OpenNET Project / Index page

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

Стандартные потоки ввода/вывода в UNIX/Linux

14.07.2009 17:55

В заметке подробно рассматривается, что такое стандартные потоки ввода и вывода, и какие вещи с ними можно делать. Рассматриваются как базовые вопросы использования потоков ввода/вывода, так и тонкости и хитрости, например, почему не работает echo text | read val и ряд других.

  1. Главная ссылка к новости (http://xgu.ru/wiki/stdin...)
Автор новости: xguru
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/22596-stdin
Ключевые слова: stdin, pipe
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (33) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (-), 19:07, 14/07/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    То, что доктор прописал, хорошая статья
     

  • 1.2, Аноним (-), 19:07, 14/07/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    я лучше POSIX[1] почитаю. В этой статье даже не упоминается простой способ избавиться от нежелательного вывода/ввода путем *закрытия* дескриптора. Напр,
        $ ls >&- 2>&-

    А также, что 'команда >&файл' и 'команда1 |& команда2' являются расширением в tcsh, bash, zsh и отсутствует в ash (almquist shell) и posix shell'е.

    [1] http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_1

     
     
  • 2.4, xguru (?), 19:46, 14/07/2009 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >я лучше POSIX[1] почитаю. В этой статье даже не упоминается простой способ
    >избавиться от нежелательного вывода/ввода путем *закрытия* дескриптора. Напр,
    >    $ ls >&- 2>&-
    >
    >А также, что 'команда >&файл' и 'команда1 |& команда2' являются расширением в tcsh, bash, zsh и отсутствует в ash (almquist shell) и posix shell'е.
    >
    >[1] http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_1
    >&- нормальная вещь, спасибо,

    но как по мне, неправильно использовать >&- там, где логичнее использовать > /dev/null

    Сравните

    ls >&-

    и

    ls > /dev/null

     
     
  • 3.6, аноним (?), 19:51, 14/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Это уже дело вкуса. С одной стороны, зачем писать, если можно не писать? Это аргумент за >&-. Ведь devfs может быть вообще не смонтирован (в chroot/jail например). Кроме того, так короче.
    С другой стороны, /dev/null нагляднее и проще понять где /dev/null заменить на не /dev/null.
    Я в общем всецело за /dev/null.
     
     
  • 4.7, xguru (?), 20:01, 14/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >Это уже дело вкуса. С одной стороны, зачем писать, если можно не писать? Это аргумент за >&-. Ведь devfs может быть вообще не смонтирован (в chroot/jail например). Кроме того, так короче.
    >С другой стороны, /dev/null нагляднее и проще понять где /dev/null заменить на
    >не /dev/null.
    >Я в общем всецело за /dev/null.

    Дело не в том даже, а в том, что когда вы используете >&-,
    то в общем случае добавляется ещё одна ошибка в поток:

    $ ls >&-
    ls: write error: Bad file descriptor

     
     
  • 5.10, аноним (?), 22:35, 14/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Нет.

    % ls >&-
    %

     
     
  • 6.13, xguru (?), 22:48, 14/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >Нет.
    >
    >% ls >&-
    >%

    А скажите, пожалуйста, какая ось у вас?

    У меня на GNU/Linux:

    % ls >&-
    ls: write error: Bad file descriptor
    book% bash
    $ ls >&-
    ls: write error: Bad file descriptor


     
     
  • 7.14, Аноним (-), 00:18, 15/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    > $ ls >&-
    > ls: write error: Bad file descriptor

    на FreeBSD все пучком - нет ошибки.
        $ ls >&-
        $
    Linux'у такое поведение с ошибкой можно было б простить, если бы сия функция не была одной из базовых в posix shell'е.

     
     
  • 8.16, Аноним (-), 00:23, 15/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    кроме того это проблема не bash а, а GNU ls ... текст свёрнут, показать
     
     
  • 9.19, anonymous_peer (ok), 03:04, 15/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    А почему это проблема ls Разве не у каждой программы ДОЛЖНЫ быть открыты дескри... текст свёрнут, показать
     
     
  • 10.21, xguru (?), 10:39, 15/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Ну не проблема, а скорее особенность По крайней мере это именно из-за ls ну и ... текст свёрнут, показать
     
     
  • 11.28, anonymous_peer (ok), 18:49, 16/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Ну, это же хорошо Лишняя проверка не повредит, а вот её отсутсвие 8212 потен... текст свёрнут, показать
     
     
  • 12.31, xguru (?), 21:42, 16/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Мне вот интересно, ls и проч вылетает, когда видит, что STDOUT закрыт, или про... текст свёрнут, показать
     
     
  • 13.32, anonymous_peer (ok), 02:21, 17/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Во-первых, что значит 171 вылетает 187 Завершается раньше времени но по со... текст свёрнут, показать
     
  • 7.18, аноним (?), 02:31, 15/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    FreeBSD
     
  • 3.23, Andrey Mitrofanov (?), 12:05, 15/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >Сравните

    $ /bin/echo 'Ага.' >&- && echo "Таки-ага." || echo 'Не-а!'
    /bin/echo: ошибка записи: Bad file descriptor
    Не-а!
    $ /bin/echo 'Ага.' > /dev/null && echo "Таки-ага." || echo 'Не-а!'
    Таки-ага.
    $ _

     
     
  • 4.24, Andrey Mitrofanov (?), 12:28, 15/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    И эти люди запрещают мне^W^Wрассказывают о кроссплатформенности, переносимоти, позиксвейности и не-баш-измости... http:/openforum/vsluhforumID3/47017.html#7

    И ведь каждый раз одно, блин, и то же: "-Вы в шеле? -Нет, мы в шеле! -А, я думал, вы в шеле..."

     
     
  • 5.30, xguru (?), 21:41, 16/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >И эти люди запрещают мне^W^Wрассказывают о кроссплатформенности, переносимоти, позиксвейности и не-баш-измости... http:/openforum/vsluhforumID3/47017.html#7
    >
    >
    >И ведь каждый раз одно, блин, и то же: "-Вы в шеле?
    >-Нет, мы в шеле! -А, я думал, вы в шеле..."

    _ОНИ_ это кто?
    Я, наверное, пропустил какую-то жестокую тему

     

  • 1.3, anonymous_peer (ok), 19:20, 14/07/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Сначала подумал, что элементарщина, но узнал для себя что-то новое. Спасибо.
     
  • 1.5, аноним (?), 19:48, 14/07/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > почему не работает echo text | read val и ряд других

    Один написал бред, другой подхватил. Указанная конструкция замечателно работает:

    % echo text | read var; echo $var
    text

    вероятно имелось в виду (echo text | read var); echo $var

    В общем статья хорошая, но тема скобок совершенно не раскрыта.

     
     
  • 2.8, xguru (?), 20:02, 14/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >> почему не работает echo text | read val и ряд других
    >
    >Один написал бред, другой подхватил. Указанная конструкция замечателно работает:
    >
    >% echo text | read var; echo $var
    >text
    >

    У вас какой shell?

    tcsh?

    В sh/bash это не работает, проверьте, если не лень

    >вероятно имелось в виду (echo text | read var); echo $var
    >
    >В общем статья хорошая, но тема скобок совершенно не раскрыта.

    Тема скобок это да


     
     
  • 3.9, xguru (?), 20:08, 14/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >[оверквотинг удален]
    >>Один написал бред, другой подхватил. Указанная конструкция замечателно работает:
    >>
    >>% echo text | read var; echo $var
    >>text
    >>
    >
    >У вас какой shell?
    >
    >tcsh?
    >

    Хотя однако, какой tcsh, там же read нет.
    Так что таки bash у вас.

    Покажите как работает, пожалуйста

     
     
  • 4.11, аноним (?), 22:36, 14/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >Хотя однако, какой tcsh, там же read нет.
    >Так что таки bash у вас.

    У меня zsh.

     
     
  • 5.12, xguru (?), 22:43, 14/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    В zsh работает, проверил только что.
    Спасибо за поправку
     
  • 4.17, Аноним (-), 00:29, 15/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    > Хотя однако, какой tcsh, там же read нет.

    в tcsh есть $< для чтения значения переменной из стандартного ввода

        > set foo=$<

        blah
        > echo Here is my answer: $foo

        Here is my answer: blah

     
     
  • 5.22, xguru (?), 10:44, 15/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >> Хотя однако, какой tcsh, там же read нет.
    >
    >в tcsh есть $< для чтения значения переменной из стандартного ввода
    >
    >    > set foo=$<
    >
    >    blah
    >    > echo Here is my answer: $foo
    >
    >    Here is my answer: blah

    Это немножечко не то.
    Нужно же было прочитать строку из вывода другого процесса.

    %> echo value | set foo=$<
    %> echo $foo

    %>

    Не выводит.

    Как сделать чтобы работало?

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

     
     
  • 6.26, gegMOPO4 (ok), 17:10, 15/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    foo=$(echo value|head -n 1)
     
     
  • 7.27, Аноним (-), 20:10, 15/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    > foo=$(echo value|head -n 1)

    в случае tcsh скорее
        > set foo='echo value'

     
     
  • 8.29, xguru (?), 21:39, 16/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Не, ребята, это всё не то нужно чтобы read читал только одну строку, а остально... текст свёрнут, показать
     
  • 2.15, Аноним (-), 00:22, 15/07/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >> почему не работает echo text | read val и ряд других
    >
    >Один написал бред, другой подхватил. Указанная конструкция замечателно работает:

         Note that unlike some other shells, sh executes each process in the pipe‐
         line as a child of the sh process.  Shell built‐in commands are the
         exception to this rule.  They are executed in the current shell, although
         they do not affect its environment when used in pipelines.

    т.е. команды в конвеере (каналы) не влияют на окружение, в коем они запущены. Кстати, как правильно имплементировать конвееры не оговорено в POSIX. Так что zsh себя тоже правильно ведет.

     

  • 1.25, Блуд (ok), 16:02, 15/07/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Спасибо, очень полезно. Большинство знал, но некоторые моменты облегчат работу в дальнейшем.
     
  • 1.33, 42 (?), 11:53, 20/11/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Merci, очень полезная статья.
     
     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



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

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