GNU/Linux >> Linux の 問題 >  >> Linux

パイプラインのセクションを完全に「パススルー」するように指定する方法は?

かなり大きなパイプラインを介してデータをストリーミングすることでデータを処理するスクリプトがあります。パイプラインのいくつかのセクションは、実際には、いくつかの外部パラメーターに基づいて異なることを行う「スイッチボード」機能です。考案された例を以下に示します。

#! /bin/bash

switchboard() {
    # Select the appropriate command depending on input.
    case "$1" in
        1)
            sort
            ;;
        2)
            awk '{ print $5 }' | sort
            ;;
        *)
            cat  # <= Is there something more optimal here?
            ;;
    esac
}

# The data processing pipeline.
<"$1" tr '[:upper:]' '[:lower:]' | switchboard "$2" | head -n 10

「配電盤」機能では、フォールバックはcatを使用することだけです。 入力を出力に直接送信します。これは問題なく機能しますが、私のパイプラインには多くの「配電盤」がある可能性があり、何もしないcatを大量に作成することは避けたいと思います。 可能であれば処理します。

パイプラインの特定のセクションがサブプロセスを使用せずにSTDOUTをSTDINに直接接続するように指定するために使用できるbash組み込み(または代替)のようなものはありますか? (:を試しました しかし、それはデータを食べただけです)または、cat これが問題にならないほど少量のリソースを使用しますか?

承認された回答:

まず、さらに別のcatの使用 それほど大きな違いはないので、気にする必要はありません。

次に、パイプラインを構成するコマンドは、外部コマンドであるか組み込みコマンドであるかに関係なく、とにかく別々のプロセスで実行されます。

$ a=0
$ a=1 | a=2 | a=3
$ echo $a
0

正確な問題については、「stdin」を「stdout」に単純に接続することはできません。シェルにnopがあったとしても パイプラインで使用すると折りたたまれるビルトイン(例:| nop | -> | )、シェルは、パイプラインを設定するときに、「スイッチボード」がnopに切り替わるかどうかを事前に知る方法がありません。 awkの代わりに またはsort

パイプラインを自分で構築し、evalを呼び出して実行することで、「配電盤」と同じ効果を実現することもできます。例:

  $ cat test.shtype =`file -zi" $ 1 "` case $ type in * application / gzip *)mycat ='zcat "$ 1"';; *)mycat ='cat "$ 1"';; esaccase $ type in * charset =utf-16le *)mycat ="$ mycat | iconv -f utf16le";; esac#blueesc =`printf'のコメントを強調表示
Linux
  1. Linuxを学ぶための10の記事

  2. CFS:Linuxでの完全に公正なプロセススケジューリング

  3. ファイルをインプレースで変更する方法は?

  1. Linuxで元に戻すことはできますか?

  2. パイプ全体でXargsを使用する方法はありませんか?

  3. フォルダを「tail-f」する方法??

  1. ELF ファイルのヘッダー

  2. 列ごとに「ユニーク」にする方法はありますか?

  3. r linuxを完全にアンインストールする