Запуск в командной строке имитации файла?

#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