Перенаправление ввода-вывода Linux

Введение

Одной из возможностей командной строки Unix является использование перенаправления ввода/вывода и каналов. В этом сеансе мы рассмотрели перенаправление потоков ввода, вывода и ошибок.

stdin, stdout и stderr

Оболочка bash имеет три основных потока; он принимает входные данные из stdin (поток 0), он отправляет выходные данные на stdout (поток 1) и отправляет сообщения об ошибках на stderr (поток 2).

Клавиатура часто используется как stdin, тогда как stdout и stderr переходят на дисплей. Это может сбивать с толку новых пользователей Linux, потому что нет очевидного способа распознать stdout из stderr. Опытные пользователи знают, что отделение вывода от ошибок может быть очень полезным.

В следующих разделах будет объяснено, как перенаправить эти потоки.

перенаправление вывода

stdout (>)

stdout может быть перенаправлен со знаком «больше». При сканировании строки оболочка увидит знак> и очистит файл.

Обозначение> фактически является сокращением 1> (stdout упоминается как поток 1).

  datasoft @ datasoft-linux ~/test10 $ echo Сегодня лето! Сегодня лето!  datasoft @ datasoft-linux ~/test10 $ echo Сегодня лето!  > summer.txt datasoft @ datasoft-linux ~/test10 $ cat summer.txt Сегодня лето!  datasoft @ datasoft-linux ~/test10 $  

Обратите внимание, что оболочка bash эффективно удаляет перенаправление из командной строки до выполнения аргумента 0. Это означает, что в случае этой команды:

  datasoft @ datasoft-linux ~/test10 $ echo Hei> welcome.txt  

оболочка считает только два аргумента (echo = аргумент 0, hello = аргумент 1). Перенаправление удаляется перед подсчетом аргументов.

выходной файл стирается

При сканировании строки оболочка увидит знак> и очистит файл! Поскольку это происходит до разрешения аргумента 0, это означает, что даже в случае сбоя команды файл будет очищен!

  datasoft @ datasoft-linux ~/test10 $ cat summer.txt  лето сегодня!  datasoft @ datasoft-linux ~/test10 $ zcho Сегодня лето!  > summer.txtНет команды 'zcho', вы имели в виду: Команда 'echo' из пакета 'coreutils' (main) zcho: command not found datasoft @ datasoft-linux ~/test10 $ cat summer.txt datasoft @ datasoft-linux ~ /test10 $  

noclobber

Удаление файла при использовании> можно предотвратить, установив параметр noclobber.

  datasoft @ datasoft-linux ~/test10 $ cat summer.txt datasoft @ datasoft-linux ~/test10 $ set -o noclobber datasoft @ datasoft-linux ~/test10 $ echo  Сегодня холодно!  > summer.txtbash: лето. txt: невозможно перезаписать существующий файл datasoft @ datasoft-linux ~/test10 $ set + o noclobber datasoft @ datasoft-linux ~/test10 $  

с заменой noclobber

noclobber может быть отменен с помощью> |.

  datasoft @ datasoft-linux ~/test10 $ set -o noclobber datasoft @ datasoft  -linux ~/test10 $ echo Сегодня лето!  > summer.txtbash: summer.txt: невозможно перезаписать существующий файл datasoft @ datasoft-linux ~/test10 $ echo Сегодня лето!  > | summer.txt datasoft @ datasoft-linux ~/test10 $ cat summer.txt Сегодня лето!  datasoft @ datasoft-linux ~/test10 $  

append (>>)

Используйте >> для добавления вывод в файл.

  datasoft @ datasoft-linux ~/test10 $ echo Сегодня лето!  > summer.txtbash: summer.txt: невозможно перезаписать существующий файл datasoft @ datasoft-linux ~/test10 $ cat summer.txt Сегодня лето!  datasoft @ datasoft-linux ~/test10 $ echo Где жаркое лето?  >> summer.txt datasoft @ datasoft-linux ~/test10 $ cat summer.txt Сегодня лето! Где жаркое лето?  datasoft @ datasoft-linux ~/test10 $  

перенаправление ошибок

2> stderr

Перенаправление stderr выполняется с помощью 2>. Это может быть очень полезно для предотвращения загромождения экрана сообщениями об ошибках.

На снимке экрана ниже показано перенаправление stdout в файл и stderr в/dev/null. Writing1> совпадает с>.

  datasoft @ datasoft-linux ~/test10 $ find/> allfiles.txt 2>/dev/null datasoft @ datasoft-linux ~/ test10 $  

2> & 1

Чтобы перенаправить и stdout, и stderr в один и тот же файл, используйте 2> & 1.

  datasoft @ datasoft-linux ~/test10 $ find/> allfiles_and_error.txt 2> & 1  

Обратите внимание, что порядок перенаправления значительны. Например, команда

  ls> dirlist 2> & 1  

направляет как стандартный вывод (дескриптор файла 1), так и стандартную ошибку (дескриптор файла 2) в dirlist, тогда как команда

 

направляет только стандартный вывод в файл dirlist, потому что стандартная ошибка сделала копию стандартного вывода раньше стандартный вывод был перенаправлен на dirlist.

перенаправление вывода и каналы

По умолчанию вы не можете использовать grep внутри stderr при использовании каналов в командной строке, потому что передается только стандартный вывод.

  datasoft @ datasoft-linux ~/test10 $ rm file35 file = 10 |  grep testrm: невозможно удалить 'file35': нет такого файла или каталогаrm: невозможно удалить 'file = 10': нет такого файла или каталога datasoft @ datasoft-linux ~/test10 $ rm file10 |  grep.txt  

С помощью 2> & 1 вы можете заставить stderr перейти на стандартный вывод. Это позволяет следующей команде в трубе воздействовать на оба потока..

  datasoft @ datasoft-linux ~/test10 $ rm file35 file10 file101 2> & 1 1> & 2 |  grep file35rm: невозможно удалить 'file35': нет такого файла или каталога datasoft @ datasoft-linux ~/test10 $  

Вы не можете использовать одновременно 1> & 2 и 2> & 1 для переключения stdout и stderr.

  datasoft @ datasoft-linux/$ rm file35 file10 file101 2> & 1 1> & 2 |  grep file35rm: невозможно удалить 'file35': нет такого файла или каталога datasoft @ datasoft-linux/$ echo file35 2> & 1 1> & 2 |  sed 's/file35/FILE35/' FILE35  

Вам нужен третий поток для переключения stdout и stderr после символа вертикальной черты.

  datasoft @ datasoft-linux/$ echo file35 2> & 1 1> & 2 |  sed 's/file35/FILE35/' FILE35 datasoft @ datasoft-linux/$ echo file35 3> & 1 1> & 2 2> & 3 |  sed 's/file35/FILE35/' file35file35sed: невозможно прочитать файл35: нет такого файла или каталога datasoft @ datasoft-linux/$  

, соединяющий stdout и stderr

Конструкция &> поместит и stdout, и stderr в один поток (в файл).

  datasoft @ datasoft  -linux ~ $ cd test10 datasoft @ datasoft-linux ~/test10 $ rm file35 &> out_and_err datasoft @ datasoft-linux ~/test10 $ cat out_and_errrm: невозможно удалить 'file35': нет такого файла или каталога datasoft @ datasoft-linux ~/ test10 $ echo file35 &> out_and_errbash: out_and_err: невозможно перезаписать существующий файл datasoft @ datasoft-linux ~/test10 $  

перенаправление ввода

stdin (

Перенаправление stdin выполняется с помощью

  datasoft @ datasoft  -linux ~ $ cat  

Документ здесь (иногда называемый здесь-is- документ) — это способ добавления ввода до тех пор, пока не будет установлена ​​определенная последовательность (обычно EOF). столкнулся. Маркер EOF можно ввести буквально или вызвать с помощью Ctrl-D.

проверьте приведенный ниже код

  datasoft @ datasoft-linux ~ $ cat mno.txt> Как вас зовут?> Меня зовут prasanta.> EOFbash: mno.txt: невозможно перезаписать существующий файл datasoft @ datasoft-linux ~ $ cat mno.txtКак вас зовут?  Меня зовут прасанта.  datasoft @ datasoft-linux ~ $ cat mno.txt> Как вас зовут?> prasanta> ^ C datasoft @ datasoft-linux ~ $ cat mno.txt Как вас зовут? Меня зовут прасанта.  datasoft @ datasoft-linux ~ $  

Строка здесь может использоваться для напрямую передавать строки команде. Результат такой же, как и при использовании эхо-строки | (но у вас работает на один процесс меньше).

См. rfc 3548 для получения дополнительной информации о base64.

  datasoft @ datasoft-linux ~ $  base64  

запутанное перенаправление

Оболочка просканирует всю строку перед применением перенаправление. Следующая командная строка очень удобочитаема и верна.

  datasoft @ datasoft-linux ~ $ cat mno.txt> summer.txt 2> error.txt  

Но этот тоже правильный, но менее читаемый.

  datasoft @ datasoft-linux ~ $ 2> error.txt cat mno.txt> summer  .txt  

Даже это прекрасно понимает оболочка.

  datasoft @ datasoft-linux ~ $ summer.txt 2  > error.txt  

быстрая очистка файла

Итак, каков самый быстрый способ очистить файл?

  datasoft @ datasoft-linux ~ $> foo  

И каков самый быстрый способ очистить файл, когда опция noclobber установить?

  datasoft @ datasoft-linux ~ $> | barbash: синтаксическая ошибка возле неожиданного токена `| ' 

Упражнение, практика и решение:

1. Активируйте параметр оболочки noclobber.

Код:

  set -o noclobberset  -C  

2. Убедитесь, что noclobber активен, повторив команду ls в/etc/с перенаправлением вывода в файл.

  ls/etc> etc.txtls/etc> etctxt (не должно работать)  

3. Какой символ представляет параметр noclobber при перечислении всех параметров оболочки?

Код :

  echo $ - (noclobber отображается как C)  

4. Отключить параметр noclobber.

Код:

  set + o noclobber   

5. Убедитесь, что на одном компьютере открыты две оболочки. Создайте пустой файл tailing.txt. Затем введите tail -f tailing.txt. Используйте вторую оболочку, чтобы добавить строку текста в этот файл. Убедитесь, что первая оболочка отображает эту строку.

Код:

  datasoft @ datasoft-linux ~ $> tailing.txtdatasoft @ datasoft-linux ~ $ tail -f tailing.txthelloworld в другой оболочке: datasoft @ datasoft-linux ~ $ echo hello >> tailing.txtdatasoft @ datasoft  -linux ~ $ echo world >> tailing.txt  

6. Создайте файл, содержащий имена пяти человек. Используйте cat и перенаправление вывода для создания файла и используйте документ here для завершения ввода.

Код:

  datasoft @ datasoft-linux ~ $ cat> tennis.txt  Justine Henin> Venus Williams> Serena Williams> Martina Hingis> Kim Clijsters> acedatasoft @ datasoft-linux ~ $ cat tennis.txtJustine HeninVenus WilliamsSerena WilliamsMartina HingisatasKim Clijsoft @  datasoft-linux ~ $  

Оцените статью
nanomode.ru
Добавить комментарий