Перенаправление ввода / вывода в Linux
Вступление
Одной из возможностей командной строки Unix является использование перенаправления ввода / вывода и каналов. В этом сеансе мы рассмотрели перенаправление потоков ввода, вывода и ошибок.
стандартный ввод, стандартный вывод и стандартный вывод
Оболочка bash имеет три основных потока; он принимает входные данные из stdin (поток 0), отправляет выходные данные в stdout (поток 1) и отправляет сообщения об ошибках в stderr (поток 2).
Клавиатура часто выступает в роли стандартного ввода, тогда как стандартный вывод и стандартный вывод выводятся на дисплей. Это может сбить с толку новых пользователей Linux, потому что нет очевидного способа распознать стандартный вывод из stderr. Опытные пользователи знают, что отделение вывода от ошибок может быть очень полезным.
В следующих разделах объясняется, как перенаправить эти потоки.
перенаправление вывода
стандартный вывод (>)
stdout может быть перенаправлен со знаком больше чем. При сканировании строки оболочка увидит знак> и очистит файл.
Нотация> фактически является аббревиатурой 1> (stdout называется потоком 1).
datasoft @ datasoft-linux ~/test10$ echo It is summer today!
It is summer today!
datasoft @ datasoft-linux ~/test10$ echo It is summer today! > summer.txt
datasoft @ datasoft-linux ~/test10$ cat summer.txt
It is summer today!
datasoft @ datasoft-linux ~/test10$
Обратите внимание, что оболочка bash эффективно удаляет перенаправление из командной строки перед выполнением аргумента 0. Это означает, что в случае этой команды:
datasoft @ datasoft-linux ~/test10$ echo Hei > greeting.txt
оболочка считает только два аргумента (echo = аргумент 0, hello = аргумент 1). Перенаправление удаляется до подсчета аргументов.
выходной файл удален
При сканировании строки оболочка увидит знак> и очистит файл! Так как это происходит до разрешения аргумента 0, это означает, что даже в случае сбоя команды файл будет очищен!
datasoft @ datasoft-linux ~/test10$ cat summer.txt
It is summer today!
datasoft @ datasoft-linux ~/test10$ zcho It is summer today! > summer.txt
No command 'zcho' found, did you mean:
Command 'echo' from package '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 It is cold today! > summer.txt
bash: summer.txt: cannot overwrite existing file
datasoft @ datasoft-linux ~/test10$ set +o noclobber
datasoft @ datasoft-linux ~/test10$
господствующий ноклоббер
Ноклоббер может быть отменен с помощью> |.
datasoft @ datasoft-linux ~/test10$ set -o noclobber
datasoft @ datasoft-linux ~/test10$ echo It is summer today! > summer.txt
bash: summer.txt: cannot overwrite existing file
datasoft @ datasoft-linux ~/test10$ echo It is summer today! >|summer.txt
datasoft @ datasoft-linux ~/test10$ cat summer.txt
It is summer today!
datasoft @ datasoft-linux ~/test10$
добавить (>>)
Используйте >>, чтобы добавить вывод в файл.
datasoft @ datasoft-linux ~/test10$ echo It is summer today! > summer.txt
bash: summer.txt: cannot overwrite existing file
datasoft @ datasoft-linux ~/test10$ cat summer.txt
It is summer today!
datasoft @ datasoft-linux ~/test10$ echo Where is the hot summer ? >> summer.txt
datasoft @ datasoft-linux ~/test10$ cat summer.txt
It is summer today!
Where is the hot summer ?
datasoft @ datasoft-linux ~/test10$
перенаправление ошибок
2> stderr
Перенаправление stderr выполняется с помощью 2>. Это может быть очень полезно для предотвращения появления на экране сообщений об ошибках.
На приведенном ниже снимке экрана показано перенаправление stdout в файл и stderr в / dev / null. Запись 1> такая же, как>.
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 при использовании каналов в командной строке, потому что передается только stdout.
datasoft @ datasoft-linux ~/test10$ rm file35 file=10 | grep test
rm: cannot remove 'file35': No such file or directory
rm: cannot remove 'file=10': No such file or directory
datasoft @ datasoft-linux ~/test10$ rm file10 | grep.txt
С 2> & 1 вы можете заставить stderr перейти на стандартный вывод. Это позволяет следующей команде в канале действовать на оба потока.
datasoft @ datasoft-linux ~/test10$ rm file35 file10 file101 2>&1 1>&2 | grep file35
rm: cannot remove 'file35': No such file or directory
datasoft @ datasoft-linux ~/test10$
Вы не можете использовать 1> & 2 и 2> & 1 для переключения stdout и stderr.
datasoft @ datasoft-linux /$ rm file35 file10 file101 2>&1 1>&2 | grep file35
rm: cannot remove 'file35': No such file or directory
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/' file35
file35
sed: can't read file35: No such file or directory
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_err
rm: cannot remove 'file35': No such file or directory
datasoft @ datasoft-linux ~/test10$ echo file35 &> out_and_err
bash: out_and_err: cannot overwrite existing file
datasoft @ datasoft-linux ~/test10$
перенаправление ввода
STDIN (<)
Перенаправление стандартного ввода выполняется с помощью <(сокращение от 0 <).
datasoft @ datasoft-linux ~$ cat < mno.txt
What is your name?
My name is prasanta.
datasoft @ datasoft-linux ~$ tr 'onetw' 'onezz' < mno.txt
Whaz is your name?
My name is prasanza.
datasoft @ datasoft-linux ~$
<< здесь документ
Документ here (иногда называемый here-is-document) - это способ добавления ввода до тех пор, пока не встретится определенная последовательность (обычно EOF). Маркер EOF можно вводить буквально или вызывать с помощью Ctrl-D.
проверьте код ниже
datasoft @ datasoft-linux ~$ cat < mno.txt
> What is your name?
> My name is prasanta.
> EOF
bash: mno.txt: cannot overwrite existing file
datasoft @ datasoft-linux ~$ cat mno.txt
What is your name?
My name is prasanta.
datasoft @ datasoft-linux ~$ cat < mno.txt
> What's your name?
> prasanta
> ^C
datasoft @ datasoft-linux ~$ cat mno.txt
What is your name?
My name is prasanta.
datasoft @ datasoft-linux ~$
<<< здесь строка
Строка here может использоваться для прямой передачи строк в команду. Результат такой же, как при использовании echo string | команда (но у вас работает на один процесс меньше).
См. Rfc 3548 для получения дополнительной информации о base64.
datasoft @ datasoft-linux ~$ base64 <<< linux-training.be
bGludXgtdHJhaW5pbmcuYmUK
datasoft @ datasoft-linux ~$ base64 -d <<< bGludXgtdHJhaW5pbmcuYmUK
linux-training.be
datasoft @ datasoft-linux ~$
сбивающее с толку перенаправление
Оболочка просканирует всю строку перед применением перенаправления. Следующая командная строка очень удобочитаема и корректна.
datasoft @ datasoft-linux ~$ cat mno.txt > summer.txt 2> wrong.txt
Но этот тоже правильный, но менее читаемый.
datasoft @ datasoft-linux ~$ 2> wrong.txt cat mno.txt > summer.txt
Даже это отлично поймет оболочка.
datasoft @ datasoft-linux ~$ < mno.txt > summer.txt 2> wrong.txt
быстрая очистка файла
Так какой же самый быстрый способ очистить файл?
datasoft @ datasoft-linux ~$ >foo
И какой самый быстрый способ очистить файл, если установлена опция noclobber?
datasoft @ datasoft-linux ~$ > |bar
bash: syntax error near unexpected token `|'
Упражнение, практика и решение:
1. Активируйте опцию оболочки noclobber.
Код:
set -o noclobber
set -C
2. Убедитесь, что noclobber активен, повторив команду ls в / etc / с перенаправленным выводом в файл.
Код:
ls /etc > etc.txt
ls /etc > etc.txt (should not work)
3. При перечислении всех параметров оболочки, какой символ представляет параметр noclobber?
Код:
echo $- (noclobber is visible as C)
4. Отключите опцию noclobber.
Код:
set +o noclobber
5. Убедитесь, что на одном компьютере открыты две оболочки. Создайте пустой файл tailing.txt. Затем введите tail -f tailing.txt. Используйте вторую оболочку, чтобы добавить строку текста в этот файл. Убедитесь, что первая оболочка отображает эту строку.
Код:
datasoft @ datasoft-linux ~$ > tailing.txt
datasoft @ datasoft-linux ~$ tail -f tailing.txt
hello
world
in the other shell:
datasoft @ datasoft-linux ~$ echo hello >> tailing.txt
datasoft @ datasoft-linux ~$ echo world >> tailing.txt
6. Создайте файл, содержащий имена пяти человек. Используйте cat и перенаправление вывода, чтобы создать файл, и используйте здесь документ, чтобы завершить ввод.
Код:
datasoft @ datasoft-linux ~$ cat > tennis.txt << ace
> Justine Henin
> Venus Williams
> Serena Williams
> Martina Hingis
> Kim Clijsters
> ace
datasoft @ datasoft-linux ~$ cat tennis.txt
Justine Henin
Venus Williams
Serena Williams
Martina Hingis
Kim Clijsters
datasoft @ datasoft-linux ~$
Предыдущая: Глобализация файлов Linux
Далее: Linux - Фильтры
Новый контент: Composer: менеджер зависимостей для PHP , R программирования