13

グーグルやダックダックゴーで登録されないため、特定の言語構成を理解するのに苦労することがよくあります。少し実験すれば、それを理解するのは簡単なことがよくありますが、私はこれを理解していません。

私はよくbashスクリプトのようなものを2>&1目にします。3>&-これはある種のリダイレクトであることを私は知っています。1はstdoutで、2はstderrorです。3はおそらくカスタムです。しかし、マイナスは何ですか?

また、出力をログに記録したいが、画面にも表示したいスクリプトがあります。私はexec > >(tee $LOGFILE); exec 2>&1そのために使用します。できます。しかし、このスクリプトをバッシュトラップすると、プロンプトで入力できなくなることがあります。出力は。の後に非表示になりCtrl+Cます。カスタムチャネルとマイナス記号を使用してこれを修正できますか、それとも無関係ですか?

4

2 に答える 2

11
  1. 2>&1stderrがstdoutにリダイレクトされることを意味します
  2. 3>&-書き込み用に開かれたファイル記述子3(stdoutと同じ)が閉じられていることを意味します。

ここでリダイレクトのその他の例を見ることができます

  1. 質問3については、これは良いリンクだと思います。
于 2012-12-28T09:15:00.777 に答える
4

ファイル記述子番号3を閉じます(3>&-おそらく以前にで開かれています3>filename)。

ファイル記述子2(stderr)の2>&1出力をファイル記述子1(stdout)と同じ宛先にリダイレクトします。これはdup2()syscallと呼ばれます。

ファイル記述子のリダイレクトの詳細については、bashのマンページ( `man bash)を参照してください。それらは密集していますが素晴らしいです。

あなたのスクリプトのために、私はそれをそのようにします:

#!/bin/bash
if [[ -z $recursive_call ]]; then
  recursive_call=1
  export recursive_call
  "$0" "$@" | tee filename
  exit
fi
# rest of the script goes there

ただし、スクリプトから終了コードは失われます。bashにはそれを取得する方法があると思いますが、今は思い出せません。

于 2012-12-28T09:16:32.347 に答える