Как наверняка знают многие из нас, всегда полезно, чтобы ваша программа принимала ввод 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
или что-то в этом роде. Я бы подумал, что это довольно распространенная проблема, но мои поиски ничего не поднимают. Это означает, что я либо недостаточно усердно ищу, либо упускаю что-то довольно очевидное.
Если для достижения этого не существует надлежащего пути (TM), возможно ли определить удобный синтаксис? Сказать, foo x |> baz | rev
где |>
в значительной степени прямо переводится на мой сценарий.
PS: я знаю, что мой / script / очень хрупкий и наивный (например, выход из не-0); не стесняйтесь размещать лучшие.