Допустим, у меня есть сценарий, который я хочу передать по конвейеру другой команде или перенаправить в файл ( sh
для примера приведен конвейер ). Предположим, что я использую Bash.
Я мог бы сделать это используя echo
:
echo "touch somefile
echo foo > somefile" | sh
Я также мог бы сделать почти то же самое, используя cat
:
cat << EOF
touch somefile
echo foo > somefile
EOF
Но если я заменю «EOF» на «EOF | sh», он просто подумает, что это часть heredoc.
Как я могу сделать так, чтобы cat
выводить текст из стандартного ввода, а затем направить его в произвольное место?
shell
io-redirection
cat
here-document
strugee
источник
источник
touch
разве там, что именно вы хотите? просто прочитать входной файл и перенаправить на другой с помощью stdout?echo
- мне было интересно, что будет использовать эквивалент этогоcat
.sh
сценария из нескольких строк и передача его напрямуюsh
. Я обнаружил, что ваш Q ищет передачу текстового вывода нескольких команд, включая документ HERE, непосредственно в команду. Вот что делает ответ Эша во втором примере.Ответы:
Есть несколько способов сделать это. Самое простое, вероятно, это:
Другой, который на мой взгляд более приятный синтаксис:
Это работает также, но без вложенной оболочки:
Больше вариаций:
Или же:
Кстати, я ожидаю, что использование
cat
в вашем вопросе является заполнителем для чего-то еще. Если нет, возьмите это, как это:Что можно упростить до этого:
или же:
Перенаправление вывода вместо трубопровода
Использование,
cat
чтобы получить эквивалентecho test > out
:Несколько Здесь Документов
Это производит вывод:
Вот что происходит:
( ... )
и запускает вложенные команды в подоболочке.cat <&3
Говорит , чтобы запустить кошку с дескриптором файла (FD) 0 (STDIN) , переадресованные с дескриптором 3; Другими словами, отследите ввод от fd 3.(...)
запуском оболочка видит два перенаправленных здесь документа и заменяет fd 0 (<<EOF
) и fd 3 (3<<EOF2
) на стороне чтения каналовисточник
(cat; echo ---; exec <&3; cat) <<EOF 3<<EOF2 >out
и затем ввести эту команду, используя два блока здесь подряд.cat
эквивалентноecho test > out
использованию heredoc. Принимая во внимание, что ваш данный пример добавил перенаправление в конце канала.Я просто хочу отметить, что использование
meow
так же, как иEOF
.Этот скрипт будет добавлять
Meow!
в файл с именемcat
:Сохраните как
cats
и сделайте его исполняемымchmod +x cats
, затем запустите его./cats
:Объяснение:
cat <<meow
является здесь документ синтаксис. Он инструктирует сценарий подобрать блок текста, который следует за этой строкой, пока не встретит строкуmeow
. Затем содержимое будет выводиться (или передаваться по каналу).>> cat
трубы в файл с именемcat
.>
вместо>>
будет перезаписывать файл вместо добавления к нему.Meow!
это содержимое документа здесь .meow
является конечным маркером для документа здесь . Содержание, с использованием>>
, добавленоcat
.Трубопровод как в стандартный вывод, так и в файл:
Для выполнения требуемого трубопровода документ здесь не требуется.
cat
не может как выводить текст, так и передавать текст, ноtee
идеально подходит для того, что вы просите:Это будет выводить строку
echo
и записыватьecho
в файл с именемtee
.Вы также можете передать вывод
cat
, если это является частью требования, либо с помощью:Или просто:
Содержание файла:
источник
>
не создает трубы, как подразумевает ваша последняя пуля.>
может создавать каналы в томzsh
случае, когда один и тот же fd перенаправляется несколько раз, как вecho foo >&1 > tee
илиecho foo > tee | cat
, гдеzsh
реализует внутреннее,tee
чтобы передать выходные данныеecho
обоимcat
иtee
файлу.