0

私が書こうとしているシェルスクリプトは

  1. tarball と stdout をダウンロードしtarて解凍します
  2. 同時に、stderr で見つかった http ヘッダーを解析します
  3. #2 の解析結果を変数に設定します。

#1の場合:

$ wget -Sq -O- "https://api.github.com/repos/est/est/tarball/master" | tar -zmxf -

サーバーの応答を stderr に表示するオプションを有効にし-Sました。文字列 commit hash のヘッダーを少し解析し、変数に設定したいと思います。$rev

$ rev=$(wget -Sq -O /dev/null "https://api.github.com/repos/est/est/tarball/master" 2>&1 | grep "Content-Disposition:" | tail -1 | awk 'match($0, /filename=.+\-([a-zA-Z0-9]+)\./, f){ print f[1] }')
$ echo $rev
dacd56e

基本的に、私はできるシェルスクリプトが欲しい

  1. stdout をコマンドにパイプし、stderr を別のコマンドにパイプする
  2. stderr を解析し、出力を変数として設定します
  3. 一時ファイルを作成しない

#1 https://stackoverflow.com/a/9217228/41948の場合

#2については、答えreadコマンドであることがわかりましたが、残念ながら変数はサブシェルでしか見つかりません。

readでは、コマンド サブシェルで見つかった変数を親シェルに渡すにはどうすればよいでしょうか。

または、このようなシェルスクリプトをどのように書くのですか?

4

1 に答える 1

1

くそー私は醜い答えを自分で見つけるために試行錯誤しなければなりません:

rev=$(wget -Sq -O- $url 2> >( 
    grep "Content-Disposition:" | 
    tail -1 | 
    awk 'match($0, /filename=.+\-([a-zA-Z0-9]+)\./, f){ print f[1] }'
    ) > >(
    tar -C $www_dir --strip=1 -zmxf -
    ))
于 2013-03-01T02:50:09.620 に答える