В некоторых случаях полезно перенаправить стандартный ввод STDIN, чтобы он поступал из файла, а не с клавиатуры. Выполнить данную задачу мы можем, используя оператор '<'.
Например, команда tr принимает данные от пользователя (через клавиатуру), чтобы выполнить преобразование всех символов нижнего регистра в верхний:
$ tr 'a-z' 'A-Z'
hello
HELLO
Команда не получает файл в качестве аргумента. Чтобы все-таки скормить ей статический поток данных, можно использовать то самое перенаправление STDIN:
$ cat animals.txt
1 retriever
2 badger
$ tr 'a-z' 'A-Z' < animals.txt
1 RETRIEVER
2 BADGER
Оператор '<<' heredoc
Оператор '<<' дает возможность перенаправлять многострочный поток данных (массив строк) на вход программе:
$ cat << EOF
> Сurrent user: $(whoami)
> Status: sysadmin
> EOF
Сurrent user: parallels
Status: sysadmin
Может быть удобно, если нужно передать текстовые данные прямо в команду без использования файлов - допустим, в скриптах оболочки для задач автоматизации.
Как работает "heredoc"
После оператора указывается метка (произвольное слово), которая обозначает начало и конец текста.
Все строки между метками считаются входными данными для команды. Когда оболочка повторно встречает слово, которое шло сразу за '<<', ввод завершается:
$ cat << EOF > config.conf
[settings]
host=localhost
port=8080
debug=true
EOF
В примере выше мы отправили команде cat на вход (STDIN) массив строк, вывод (STDOUT) которых перенаправили в конфиг.
Еще одним полезным примером может быть передача SQL-запросов в БД через ручной ввод:
$ mysql -u root -p << EOF
CREATE DATABASE my_database;
USE my_database;
...
EOF
LinuxCamp
