кодесурса
«Linux

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

script1adsense2code
script1adsense3code

Вступление

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


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code