Как многие из нас наверняка знают, это хорошая идея, чтобы ваша программа принимала ввод stdin. Очень многие программы допускают такую среду * nix. Это позволяет нам делать классные вещи, такие как echo "foo" | less
Довольно часто можно найти этот cat barfile | baz
логически эквивалентен baz barfile
как за кулисами он все равно просто читает строки.
В настоящее время существует намного больше программ, по которым невозможно передать по умолчанию. У некоторых программ есть флаг, который все еще учитывает поведение, упомянутое выше, но многие не делают.
Теперь мой вопрос: существует ли временный файловый канал?
Теперь, с моей буквально несуществующей способностью писать Bash и около 5 минут в Google, я придумал это
#!/bin/bash
if [ $# -ne 2 ]; then exit 1; fi
f=$(mktemp)
($1) > $f
if [ $? -eq 0 ]; then ($2 $f); else exit $?; fi
rm $f
Вызывая этот fpipe, мы можем сделать что-то вроде fpipe 'wget -O- www.example.com' baz
где baz - это программа, в которую мы не можем передать, но можем сделать baz file
.
Мой вопрос: как мы можем добиться большего успеха? Я подозреваю, что, обладая большим знанием Bash, переписать приведенный выше скрипт для получения любого количества аргументов будет довольно тривиально (так что мы можем делать такие вещи, как fpipe 'foo x' bar baz
где с помощью конвейера мы можем сделать что-то вроде foo x | bar | baz
. Бах, мы могли бы, вероятно, смешать их и получить такие вещи, как fpipe 'wget -O- www.example.org | rev' baz
.
Существует ли существующая конструкция, которая достигает этого? Мне кажется, я видел конструкцию вида foo x > bar < baz
или что-то в этом роде. Я бы подумал, что это довольно распространенная проблема, но мои поиски ничего не поднимают. Это означает, что я либо недостаточно усердно занимаюсь поиском, либо упускаю что-то довольно очевидное.
Если для этого не существует «Правильного пути», можно ли определить удобный синтаксис? Скажем, foo x |> baz | rev
где |>
значительной степени напрямую переводится в мой скрипт.
PS: я знаю, что мой /script / очень хрупкий и наивный (например, выход из не 0); не стесняйтесь размещать лучшее.