zshでファイル記述子を移動する

zshでファイル記述子を移動する

ls 3>&2 2>&1 1>&3-の構文は、ファイル記述子の移動をまったくサポートしていないなど、より制限されたシェルとzsh一致する方法で動作します。標準エラーの場合は、ディレクトリの内容をエクスポートしたり、間違ったファイル記述子番号について文句を言う代わりに、何も印刷しません。ファイル記述子を移動するとはどういう意味ですか?これまで、私はOS X(ホームブレークでインストールされた最新バージョンを使用)でさまざまなシェルのみをテストしました。kshbashdashzsh

まず一時フォルダを作成

$ 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

zshbashまたは、同じ移動ファイル記述子構文はサポートされていませんksh。これは1>&3-、標準出力と標準エラーを次の名前のファイルにリダイレクトすることを意味します3-

$ echo -n '<'; zsh -c 'ls 3>&2 2>&1 1>&3-'; echo '>'
<>
$ ls
3- a b

bashPOSIXシェルと同じ移動ファイル記述子の動作を達成するには、次の手順を実行しますksh

sh -c 'ls 3>&2 2>&1 3>&1 3>&-'

これは1>&3-内部で行われる操作で、ファイルディスクリプタ3をファイルディスクリプタ1にコピーしてからファイルディスクリプタ3を閉じます。bashksh

おすすめ記事