Оболочка управляет вводом и выводом запускаемых команд. Команды в оболочке используют, обычно, один поток ввода (STDIN) и два вида потока вывода: стандартный вывод (STDOUT) и стандартный вывод ошибок (STDERR).
STDIN
$ read
Напечатайте любой текст
Стандартный ввод используется для получения данных. (В этом случае мы использовали команду read для получения данных от пользователя)
STDOUT
$ ls file
file
Стандартный вывод используется для «правильного» вывода информации от команды. Например, команда ls, вывела результат своего выполнения на экран.
STDERR
$$ ls anotherfile
ls: невозможно получить доступ к 'anotherfile': Нет такого файла или каталога
Стандартный вывод ошибок используется для вывода ошибок. В примере выше, файла с названием anotherfile не нашлось в текущем каталоге, то данное сообщение попадает в поток ошибок.
STDIN, STDOUT и STDERR это три стандартных потока данных в Linux. В системе они идентифицируются по номерам:
0 — Стандартный ввод
1 — Стандартный вывод
2 — Стандартный поток ошибок
По умолчанию, для STDIN используется клавиатура, а для STDOUT и STDERR используют терминал. Но мы можем перенаправить их туда, куда нам будет необходимо.
Перенаправление вывода команды в другую команду.
Для перенаправления потока вывода с одной команды в другой в оболочке используется вертикальная черта ‘|’. Например, чтобы отсортировать строки в нашем файле в алфавитном порядке, можем перенаправить вывод команды cat в команду sort.
$ cat file.txt | sort
alias - make alias for command
Linux commands
man - manual
whatis - whatis command if you want yo know
Перенаправление вывода команды в файл.
Для перенаправления вывода команды в файл, используется функция оболочки, называемая перенаправлением вывода (output rederection). Просто добавьте символ «>» с именем файла, в который будет перенаправлен вывод:
$ grep alias file.txt > alias.txt (на экране ничего)
$ cat alias.txt
alias - make alias for command
Весь вывод был направлен в файл alias.txt. Если файла куда перенаправляется поток не существует, то он будет создан. Если же он есть, то его содержимое будет перезаписано.
Для того, чтобы добавлять данные в файл вместо того, чтобы перезаписывать его каждый раз, используйте символ «>>«.
$ echo Some text >> alias.txt
$ cat alias.txt
alias - make alias for command
Some text
Перенаправление вывода нескольких команд в один файл
Вы можете перенаправить сразу несколько команд в один файл. Для этого необходимо нужные нам команды заключить в фигурные скобки «{}»
Например,
{ echo "contents of $PWD directory"
> ls
> } > output.txt

Перенаправление ввода.
Кроме перенаправление вывода, есть возможность перенаправления ввода (input redirection), обеспечивающее стандартный ввод из файла, а не, например, с клавиатуры или сканера. Для такого перенаправления используется символ «<» и имя файла, чтобы перенаправить стандартный ввод.
Возьмем к примеру команду wc, которая подсчитывает количество строк, слов и символов в файле. И передадим ей на ввод наш файл
$ wc alias.txt
2 8 41 alias.txt
$ wc < alias.txt
2 8 41
Важным отличием поведения этих двух выводов команд, является то, что в первом случае команда wc получает в качестве аргумента имя файла. Поэтому она находит, открывает и читает содержимое файла на диске. А вот во втором случае команда wc открывается без аргументов, поэтому они считываются со стандартного ввода. Это равносильно тому, что вы просто запустите команду и введете весь текст файла с клавиатуры.
Перенаправление потока ошибок.
Некоторые сообщения, которые мы видим на экране в результате выполнения команд, нельзя перенаправить с помощью «>«. Например, выполним какую-нибудь операцию с несуществующим файлом
$ ls nofile.txt
ls: невозможно получить доступ к 'nofile.txt': Нет такого файла или каталога
Если мы перенаправим это сообщение с помощью стандартного оператора «>«, то сообщение все равно будет выведено на экран. А файл errors все равно останется пустым.
$ ls nofile.txt>errors
ls: невозможно получить доступ к 'nofile.txt': Нет такого файла или каталога
$ cat errors
Команды Linux могут создавать более одного потока вывода. Так вот в дополнению к потоку вывода есть еще и поток вывода ошибок (stderr). Этот поток обычно зарезервирован для сообщений об ошибках. Хоть и попадалось как-то, когда вывод версии приложения отправлялся именно в этот поток.
Оба потока — stdout и stderr на экране одинаково, но по своей сути они разные. И для того, чтобы перенаправить поток ошибок можно с помощью символов «2>«.
$ ls nofile.txt 2> errors
$ cat errors
ls: невозможно получить доступ к 'nofile.txt': Нет такого файла или каталога
Либо вариант с записью сообщений об ошибках в конец файла: «2>>«.
$ ls nofile.txt 2>> errors
$ cat errors
ls: невозможно получить доступ к 'nofile.txt': Нет такого файла или каталога
ls: невозможно получить доступ к 'nofile.txt': Нет такого файла или каталога
А еще можно перенаправить все потоки вывода одним оператором «&>«.
$ echo Этот файл существует > goodfile.txt
$ cat goodfile.txt nofile.txt &> allout
$ cat allout
Этот файл существует
cat: nofile.txt: Нет такого файла или каталога
Перенаправление на сетевой адрес
bash рассматривает некоторые пути как особые и может осуществлять некоторую сетевую работу, отправляя сообщения в /dev/{udp|tcp}/host/port. Bash не может создать сервер, но может инициировать соединение, и прочитать результаты.
Например, давайте отправим простой запрос:
exec 3</dev/tcp/www.google.com/80
printf 'GET / HTTP/1.0\r\n\r\n' >&3
cat <&3
HTTP/1.0 200 OK
Date: Tue, 12 Nov 2024 11:20:30 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Content-Security-Policy-Report-Only: object-src 'none';base-uri 'self';script-src 'nonce-WjzxOO5QFEgkawKYBMD3VQ' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
...
В результате получим страницу www.google.com, установленную по умолчанию
Или, например, следующая команда:
printf 'HI\n' > /dev/udp/192.168.1.1/6666
Отправит сообщение «HI» на порт 6666 по адресу 192.168.1.1
Was this helpful?
0 / 0