プロセス置換を使って複数のパイプを受け取る,あるいは一時ファイルを節約する方法

スポンサード リンク
LINEで送る
Pocket

コマンドの実行結果を他のコマンドに渡したいとき,普通はパイプを使って渡す。

 ~ $ paste --help | nl
     1  Usage: paste [OPTION]... [FILE]...
     2  Write lines consisting of the sequentially corresponding lines from
     3  each FILE, separated by TABs, to standard output.
     4  With no FILE, or when FILE is -, read standard input.

     5  Mandatory arguments to long options are mandatory for short options too.
     6    -d, --delimiters=LIST   reuse characters from LIST instead of TABs
     7    -s, --serial            paste one file at a time instead of in parallel
     8        --help     display this help and exit
     9        --version  output version information and exit

    10  Report bugs to <bug-coreutils@gnu.org>.

渡したい実行結果が1つだけならこれで良いのだが,2つ以上渡したいときはどうしたらいいだろうか。

1つの方法は適当なファイルへのリダイレクトだろう。

 ~ $ seq 1 15 > tmp.txt 
 ~ $ paste --help | paste tmp.txt -
1       Usage: paste [OPTION]... [FILE]...
2       Write lines consisting of the sequentially corresponding lines from
3       each FILE, separated by TABs, to standard output.
4       With no FILE, or when FILE is -, read standard input.
5
6       Mandatory arguments to long options are mandatory for short options too.
7         -d, --delimiters=LIST   reuse characters from LIST instead of TABs
8         -s, --serial            paste one file at a time instead of in parallel
9             --help     display this help and exit
10            --version  output version information and exit
11
12      Report bugs to <bug-coreutils@gnu.org>.
13
14
15

だが,ファイル入出力の発生は速度面で好ましくないし,掃除も面倒だ。

ということで,bashやzshには便利なプロセス置換という機能がある。hogeの実行結果を受け取るときは <(hoge)で,hogeに渡すときは >(hoge)となる。

 ~ $ paste <(seq 1 15) <(paste --help)
1       Usage: paste [OPTION]... [FILE]...
2       Write lines consisting of the sequentially corresponding lines from
3       each FILE, separated by TABs, to standard output.
4       With no FILE, or when FILE is -, read standard input.
5
6       Mandatory arguments to long options are mandatory for short options too.
7         -d, --delimiters=LIST   reuse characters from LIST instead of TABs
8         -s, --serial            paste one file at a time instead of in parallel
9             --help     display this help and exit
10            --version  output version information and exit
11
12      Report bugs to <bug-coreutils@gnu.org>.
13
14
15

また,zshならリダイレクト先は複数記述できるので,パイプ先の二分割もできる。

 ~ $ paste <(seq 1 15) <(paste --help) > >(wc -l)  > >(nl) 
     1  1       Usage: paste [OPTION]... [FILE]...
     2  2       Write lines consisting of the sequentially corresponding lines from
     3  3       each FILE, separated by TABs, to standard output.
     4  4       With no FILE, or when FILE is -, read standard input.
     5  5
     6  6       Mandatory arguments to long options are mandatory for short options too.
     7  7         -d, --delimiters=LIST   reuse characters from LIST instead of TABs
     8  8         -s, --serial            paste one file at a time instead of in parallel
     9  9             --help     display this help and exit
    10  10            --version  output version information and exit
    11  11
    12  12      Report bugs to <bug-coreutils@gnu.org>.
    13  13
    14  14
    15  15
15

マニアックだけれども,知っているとエレガントなコードが書けそうだ。

関連する記事

LINEで送る
Pocket



カテゴリー: コマンドメモ パーマリンク

コメントを残す

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
また,TeX の記法で数式を入力する場合は [latexpage] とコメントの最初に入力してください(QuickLaTeX の機能です)。
例: [latexpage] $\frac{1}{2}$

ERROR: si-captcha.php plugin: GD image support not detected in PHP!

Contact your web host and ask them to enable GD image support for PHP.

ERROR: si-captcha.php plugin: imagepng function not detected in PHP!

Contact your web host and ask them to enable imagepng for PHP.