“2>&1″を使わずに標準出力と標準エラー出力を同じファイルに出力する

Bash

はじめに

標準出力と標準エラー出力を同じファイルに出力する方法について、標準的な方法である「2>&1」を使わずに簡潔に記述する方法を紹介します。
この記事では、その方法を解説します。
また、実際に検証した結果も紹介します。

検証環境

$ uname -moi
aarch64 aarch64 GNU/Linux

$ head -n 3 /etc/os-release
PRETTY_NAME="Ubuntu 22.10"
NAME="Ubuntu"
VERSION_ID="22.10"

$ bash -version | head -n 1
GNU bash, バージョン 5.2.2(1)-release (aarch64-unknown-linux-gnu)

実際に検証したスクリプト

次のようなスクリプトを用意しました。

#!/bin/bash

echo "Hello World to stdout"
echo "Hello World to stderr" >&2

実行すると次のようになります。

$ ./main.sh
Hello World to stdout
Hello World to stderr

見ただけではわかりにくいですが、 "Hello World to stdout" は標準出力、 "Hello World to stderr" は標準エラー出力となっています。

">" で標準出力をファイルに出力する方法

標準出力をファイルに出力する方法として、「>」を使う方法があります。

次のように記述します。
実行した結果、標準エラー出力のみが出力されています。

$ ./main.sh > out.log
Hello World to stderr

作成された out.log ファイルの内容は以下のようになっています。

$ cat out.log
Hello World to stdout

"2>" で標準エラー出力をファイルに出力する方法

標準エラー出力をファイルに出力する方法として、「2>」を使う方法があります。

次のように記述します。
実行した結果、標準出力のみが出力されています。

$ ./main.sh 2> err.log
Hello World to stdout

作成された err.log ファイルの内容は以下のようになっています。

$ cat err.log
Hello World to stderr

標準出力と標準エラー出力を同じファイルに出力する方法

標準出力と標準エラー出力を同じファイルに出力する方法として、「>」と「2>&1」を組み合わせる方法があります。

次のように記述します。実行した結果、ターミナル上には何も出力されません。

$ ./main.sh > out.log 2>&1

作成された out.log ファイルの内容は以下のようになっています。

$ cat out.log
Hello World to stdout
Hello World to stderr

このような記述をすることが多いと思います。実際、僕は今までこのケースのスクリプトばかり見ました。

[今回のエントリの本題] "2>&1" を使わずに簡潔に実現する方法

標準出力と標準エラー出力を同じファイルに出力する方法として、「&>」を使う方法があります。

次のように記述します。
実行した結果、ターミナル上には何も出力されません。

$ ./main.sh &> out.log

実行すると次のようになります。

$ cat out.log
Hello World to stdout
Hello World to stderr

ひとこと

> 2>&1 が記述の順序をきをつけないといけなかったりと呪文のようでわかりにくいのですが、 &> が使える環境であれば簡潔に記述できます。

Bash