#bash #command-line #pipe
#bash #командная строка #передача
Вопрос:
Я уже видел этот метод раньше, но не знаю, как он называется, и забыл точный синтаксис. Допустим, мне нужно передать файл в программу типа: command < input-file. Однако я хочу напрямую передать эти строки входного файла в команду без промежуточного входного файла. Это выглядит примерно так, но не работает:
command < $(file-line1; file-line2; file-line3)
Может кто-нибудь сказать мне, как это называется и как это сделать?
Комментарии:
1. Учитывая дикие вариации в ответах, которые только что появились, я думаю, можно с уверенностью сказать, что ваш вопрос не совсем ясен…
2. Я тоже не помнил, как это называется. Но в моем запросе Google использовались слова, похожие на слова в заголовке и теле этого поста. Итак, это был первый удар для меня.
Ответ №1:
Это называется Process Substitution
command < <(printf "%sn" "file-line1" "file-line2" "file-line3")
С учетом вышесказанного, command
будет казаться, что вводится файл с именем, очень похожим на /dev/fd/XX
, где ‘XX’ — это некоторое число. Как вы упомянули, это временный файл (фактически файловый дескриптор), но он будет содержать 3 строки, которые вы передали в printf
команду.
Ответ №2:
Вот строка.
command <<< $'line 1nline 2nline 3n'
Или heredoc.
command << EOF
line 1
line 2
line 3
EOF
Комментарии:
1. Обратите внимание, что они
herestrings
являютсяbashisms
, то есть не совместимы с POSIX;heredocs
совместимы и должны работать везде. ( mywiki. wooledge.org/Bashism )
Ответ №3:
Я думаю, вы имеете в виду «документ здесь». Вот так
#!/bin/sh
cat <<EOF
This is
the
lines.
EOF
Ответ №4:
Как насчет:
cat myfile.txt | head -n3 | command