Введение
Одной из возможностей командной строки 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 ~ $