1. ホーム
  2. bash

[解決済み] bashで&>は何をするのですか?

2023-06-04 17:37:39

質問

という名前の空っぽのファイルがいつもできてしまうのが不思議だったので、pre-commit hookを見ていて、以下の行を発見しました。 1 という名前の空っぽのファイルがコミットされた後、私のディレクトリにできるのが不思議だったからです。

git status 2&>1 > /dev/null

という書き方が意図されていたと思いますので、修正しました。

git status 2>&1 > /dev/null

しかし、以下の構文が具体的に何をするのかが気になったので、manページを調べてみました。

git status 2&>1

以下はマニュアルページです。

  Redirecting Standard Output and Standard Error
      This  construct allows both the standard output (file descriptor 1) and
      the standard error output (file descriptor 2) to be redirected  to  the
      file whose name is the expansion of word.

      There  are  two  formats  for  redirecting standard output and standard
      error:

             &>word
      and
             >&word

      Of the two forms, the first is preferred.  This is semantically equiva‐
      lent to

             >word 2>&1

しかし、このマニュアルページでは、この2つが同等であることを示唆していますが、そうではなさそうです。

どなたか、man ページを明確にして、この構文で何が起こっているのかを正確に説明していただけませんか。

どのように解決するのですか?

ここで使っている演算子は

  • > 構文 ファイル記述子 opt > ファイル名
  • >& 構文 ファイル記述子 opt >& ファイル記述子
  • &> 構文 &> ファイル名

ファイルディスクリプタが省略された場合、デフォルトは 0 (stdin)で入力、または 1 (stdout)で出力します。 2 はstderrを意味する。

ということで、あります。

  • >name 意味 1>name -- stdout をファイルにリダイレクトする name
  • &>name というのは 1>name 2>name -- stdout と stderr をファイルにリダイレクトします。 name (ただし name は一度しか開かれないので、もしあなたが実際に 1>name 2>name を開こうとします。 name を 2 回開こうとし、おそらく誤動作します)。

ということは、あなたが git status 2&>1 と書くと、次のようになります。 git status 2 1>1 2>1 のように、すなわち

  • 最初の 2 への引数として渡されます。 git status .
  • という名前のファイルにリダイレクトされます。 1 (という名前のファイルにリダイレクトされます(ファイルディスクリプタ1ではありません)。
  • という名前のファイルにリダイレクトされます。 1

このコマンドは、実際には 1 というファイルを作成し、その中身は git status 2 -- というファイルの状態です。 2 というファイルを実際に追跡していないと仮定すると、おそらく "ブランチは最新、コミットするものはなし、作業ディレクトリはクリーンです" となります。 2 .