ls 3>&2 2>&1 1>&3-
の構文は、ファイル記述子の移動をまったくサポートしていないなど、より制限されたシェルとzsh
一致する方法で動作します。標準エラーの場合は、ディレクトリの内容をエクスポートしたり、間違ったファイル記述子番号について文句を言う代わりに、何も印刷しません。ファイル記述子を移動するとはどういう意味ですか?これまで、私はOS X(ホームブレークでインストールされた最新バージョンを使用)でさまざまなシェルのみをテストしました。ksh
bash
dash
zsh
まず一時フォルダを作成
$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch a
$ touch b
ls 3>&2 2>&1 1>&3-
次に、とを実行すると、両方がbash
ファイルksh
記述子の移動をサポートします。
$ bash -c 'ls 3>&2 2>&1 1>&3-'
a b
$ bash --version | head -n 1
GNU bash, version 4.4.5(1)-release (x86_64-apple-darwin15.6.0)
ksh
次のような動作
$ ksh -c 'ls 3>&2 2>&1 1>&3-'
a b
$ ksh --version
version sh (AT&T Research) 93u+ 2012-08-01
dash
この構文をサポートしないシェルの例です。1>&3-
誤った形式のレプリカとして解釈されます。
$ dash -c 'ls 3>&2 2>&1 1>&3-'
ダッシュ:1:構文エラー:無効なfd番号
zsh
、奇妙なことに何も印刷されません。
$ echo -n '<'; zsh -c 'ls 3>&2 2>&1 1>&3-'; echo '>'
<>
$ zsh --version
zsh 5.2 (x86_64-apple-darwin15.4.0)
zsh
デフォルトのコピーとシャットダウンが実行される順序は、とはbash
異なりますかksh
?この機能の実装にエラーがありますか?
ベストアンサー1
zsh
bash
または、同じ移動ファイル記述子構文はサポートされていませんksh
。これは1>&3-
、標準出力と標準エラーを次の名前のファイルにリダイレクトすることを意味します3-
。
$ echo -n '<'; zsh -c 'ls 3>&2 2>&1 1>&3-'; echo '>'
<>
$ ls
3- a b
bash
POSIXシェルと同じ移動ファイル記述子の動作を達成するには、次の手順を実行しますksh
。
sh -c 'ls 3>&2 2>&1 3>&1 3>&-'
これは1>&3-
内部で行われる操作で、ファイルディスクリプタ3をファイルディスクリプタ1にコピーしてからファイルディスクリプタ3を閉じます。bash
ksh