bash
  • tee
  • 2017-03-07 15 views 1 likes 
    1

    以下の簡単な例では、 "anything"は$ S "変数から" S.gz "ファイルに正しくエコーされますが、変数はパイプストリームからその値を失います:Bash - 変数とファイルへのパイプ

    echo 'anything' | tee >(read S | gzip >S.gz) 
    zcat S.gz 
    echo '$S='"$S" 
    

    それはエコー:

    anything 
    $S= 
    

    意図出力は次のとおりです。

    anything 
    $S=anything 
    

    もう一つの方法は、同じ不幸なOU TPUT:

    echo 'anything' | tee >(read S) | gzip >S.gz 
    zcat S.gz 
    echo '$S='"$S" 
    

    それはエコー:

    anything 
    $S= 
    

    任意のアイデア?

    +0

    あなたparentheticalsはサブシェルを作成して、その外部環境の変数には影響しません。 –

    答えて

    2

    readは、現在のシェルで実行する必要があります。あなたのパイプラインを反転させる必要があります。

    read S < <(echo anything | tee >(gzip - > S.gz)) 
    

    または、bash 4.2以降では、lastpipeオプションを使用します。 (そのジョブの制御を有効にするlastpipe非アクティブにする必要があります。これは、非対話型シェルではデフォルトでオフになって、そしてset +mとインタラクティブシェルでオフにすることができます。)

    shopt -s lastpipe 
    echo anything | tee >(gzip - > S.gz) | read S 
    
    +0

    'shopt'は私のためにうまくいきました(ただしbashie' <<( 'ははるかに判読不能なセクシーです...) – Roger

    関連する問題