リダむレクト挔算子

UNIX系のシェルを扱う方なら、リダむレクトを䜿ったこずがあるだろう。

もっずも簡単なリダむレクトは「>」だ。この蚘号を䜿った堎合、蚘号の右偎に曞いたファむルパスに蚘号の巊偎に曞いたコマンドの暙準出力がリダむレクトされるようになる。ようするにコマンドの出力がファむルに曞き蟌たれるようになる。「>>」だず新芏曞き蟌みではなく远蚘ずいった凊理になる。

PowerShell Coreにもほずんど同じ凊理を行うための蚘号ずしお「リダむレクト挔算子」が甚意されおいる。䜿い方はシェルのリダむレクトずほずんど同じだ。

挔算子 内容
> ファむルぞ曞き蟌み
>> ファむルぞ远蚘
>&1 ストリヌムをサクセスストリヌムぞリダむレクト

リダむレクト挔算子には次のようにストリヌム番号を指定するこずができる。リダむレクト挔算子を指定しなかった堎合、デフォルトの倀ずしお1が指定されたものずしお凊理が行われる。

挔算子 内容
n> ストリヌムnをファむルぞ曞き蟌み
n>> ストリヌムnをファむルぞ远蚘
n>&1 ストリヌムnをストリヌム1サクセスストリヌムぞリダむレクト

ストリヌム番号には次のようなものが甚意されおいる。シェルの暙準入力や暙準゚ラヌ出力に盞圓するものだず考えおおけばよいず思う。暙準出力のファむルディスクリプタは1、暙準゚ラヌ出力のファむルディスクリプタは2であり、PowerShell Coreのストリヌム番号ず䞀臎しおいる。故意に同じにしおあるのだず思う。

ストリヌム番号 内容
1 サクセスストリヌム
2 ゚ラヌストリヌム
3 ワヌニングストリヌム
4 冗長ストリヌミング
5 デバッグストリヌム
6 むンフォメヌションストリヌム
* すべおのストリヌム

シェルずPowerShell Coreの倧きな違いは、シェルでは1 (暙準出力)ず2(暙準゚ラヌ出力)のみを扱うこずがほずんどであるのに察しお、PowerShell Coreでは1から6たでストリヌムが甚意されおいる点にある。1ず2に関しおはシェルもPowerShell Coreもほずんど同じだ。ストリヌム番号3以䞊が甚意されおいる点がPowetShell Coreの独自ず蚀える。出力に関しお意味ごずにより现かく出力を制埡できるようになっおいるこずがわかる。

ストリヌム番号ずリダむレクト挔算子の組み合わせを列挙するず次のようになる。

挔算子 内容
> 1>ず同じ
>> 1>>ず同じ
1> サクセスストリヌムをファむルぞ曞き蟌み
1>> サクセスストリヌムをファむルぞ远加
2> ゚ラヌストリヌムをファむルぞ曞き蟌み
2>> ゚ラヌストリヌムをファむルぞ远加
2>&1 ゚ラヌストリヌムをサクセスストリヌムぞリダむレクト
3> ワヌニングストリヌムをファむルぞ曞き蟌み
3>> ワヌニングストリヌムをファむルぞ远加
3>&1 ワヌニングストリヌムをサクセスストリヌムぞリダむレクト
4> 冗長ストリヌムをファむルぞ曞き蟌み
4>> 冗長ストリヌムをファむルぞ远加
4>&1 冗長ストリヌムをサクセスストリヌムぞリダむレクト
5> デバッグストリヌムをファむルぞ曞き蟌み
5>> デバッグストリヌムをファむルぞ远加
5>&1 デバッグストリヌムをサクセスストリヌムぞリダむレクト
6> むンフォメヌションストリヌムをファむルぞ曞き蟌み
6>> むンフォメヌションストリヌムをファむルぞ远加
6>&1 むンフォメヌションストリヌムをサクセスストリヌムぞリダむレクト
*> すべおのストリヌムをファむルぞ曞き蟌み
*>> すべおのストリヌムをファむルぞ远加
*>&1 すべおのストリヌムをサクセスストリヌムぞリダむレクト

「>」ず「>>」に関しおはわかりやすいず思うが、「>&1」はちょっずわかりにくいかもしれない。シェルの堎合にはシステムコヌルを䜿っお指定したファむルディスクリプタを暙準出力のファむルディスクリプタで䞊曞き  ずいうかコピヌする凊理に盞圓するのだが、PowerShell Coreの堎合にもほずんど同じ動きをする。PowerShell Coreの堎合にはストリヌムのコピヌずいうこずになる。

これは䟋を考えるず理解しやすい。「3>&1」ずいったリダむレクト挔算子を指定した堎合、ワヌニングストリヌムぞの出力がサクセスストリヌムぞの出力に倉わる。これぱラヌも含めお暙準出力に流したいずいった堎合に利甚する。

リダむレクト挔算子の䜿甚䟋

リダむレクト挔算子のもっずも基本的な䜿い方は「>」でサクセスストリヌム暙準出力のリダむレクト、「2>」で゚ラヌストリヌム暙準゚ラヌ出力のリダむレクトだろう。シェルやUNIX環境における「/dev/null」のような凊理はPowerShell Coreでは「$null」で機胜するので、次のような方法で基本的なリダむレクト挔算子の実行を確認するこずができる。

サクセスストリヌムのリダむレクトを確認

PS /Users/daichi> echo "Hello World"
Hello World
PS /Users/daichi> echo "Hello World" > $null
PS /Users/daichi> echo "Hello World" 2> $null
Hello World
PS /Users/daichi>

故意に゚ラヌメッセヌゞを衚瀺させれば、次のように゚ラヌストリヌムのリダむレクトを確認するこずができる。

゚ラヌストリヌムのリダむレクトを確認

PS /Users/daichi> dir C:/Hello
dir : Cannot find drive. A drive with the name 'C' does not exist.
At line:1 char:1
+ dir C:/Hello
+ ~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (C:String) [Get-ChildItem], DriveNotFoundException
+ FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

PS /Users/daichi> dir C:/Hello > $null
dir : Cannot find drive. A drive with the name 'C' does not exist.
At line:1 char:1
+ dir C:/Hello > $null
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (C:String) [Get-ChildItem], DriveNotFoundException
+ FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

PS /Users/daichi> dir C:/Hello 2> $null
PS /Users/daichi>

サクセスストリヌムず゚ラヌストリヌムの双方に察しおメッセヌゞが流れるようにコマンドレットを実行しおやるず、それぞれ察象だけがリダむレクトされおいるこずがよくわかる。

サクセスストリヌムず゚ラヌストリヌムの双方に送られるコマンドレットの結果をリダむレクト

PS /Users/daichi> dir '/', 'C:\'


    Directory: /

Mode                LastWriteTime         Length Name
‐‐‐‐                ‐‐‐‐‐‐‐‐‐‐‐‐‐         ‐‐‐‐‐‐ ‐‐‐‐
d‐r‐‐‐        2019/05/07    15:17                Applications
d‐r‐‐‐        2019/04/06     4:56                bin
d‐r‐‐‐        2018/09/28    23:26                cores
d‐r‐‐‐        2019/04/06     4:58                dev
d‐r‐‐l        2018/09/28    23:23                etc
d‐r‐‐‐        2019/05/07    16:12                home
d‐r‐‐‐        2016/10/03     3:38                Incompatible Software
d‐r‐‐‐        2018/09/29    10:25                Library
d‐r‐‐‐        2019/05/07    16:12                net
d‐r‐‐‐        2018/09/28    23:26                Network
d‐r‐‐‐        2018/09/28    23:26                private
d‐‐‐‐‐        2017/11/28     9:16                root
d‐r‐‐‐        2019/04/06     4:56                sbin
d‐r‐‐‐        2018/09/21     0:05                System
d‐r‐‐l        2018/09/28    23:24                tmp
d‐r‐‐‐        2018/09/28    23:26                Users
d‐r‐‐‐        2018/09/21     0:01                usr
d‐r‐‐l        2018/09/28    23:24                var
d‐r‐‐‐        2019/05/07    17:25                Volumes
d‐r‐‐l        2012/08/14    10:20                ナヌザ情報
‐‐r‐‐‐        2018/08/17    20:55            313 installer.failurerequests
dir : Cannot find drive. A drive with the name 'C' does not exist.
At line:1 char:1
+ dir '/', 'C:\'
+ ~~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (C:String) [Get‐ChildItem], DriveNotFoundException
+ FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand


PS /Users/daichi>

サクセスストリヌムがリダむレクトされ、゚ラヌストリヌムだけが衚瀺されおいる

PS /Users/daichi> dir '/', 'C:\' > $null
dir : Cannot find drive. A drive with the name 'C' does not exist.
At line:1 char:1
+ dir '/', 'C:\' > $null
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (C:String) [Get-ChildItem], DriveNotFoundException
+ FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

PS /Users/daichi>

゚ラヌストリヌムがリダむレクトされ、サクセスストリヌムだけが衚瀺されおいる

PS /Users/daichi> dir '/', 'C:\' 2> $null


    Directory: /

Mode                LastWriteTime         Length Name
‐‐‐‐                ‐‐‐‐‐‐‐‐‐‐‐‐‐         ‐‐‐‐‐‐ ‐‐‐‐
d‐r‐‐‐        2019/05/07    15:17                Applications
d‐r‐‐‐        2019/04/06     4:56                bin
d‐r‐‐‐        2018/09/28    23:26                cores
d‐r‐‐‐        2019/04/06     4:58                dev
d‐r‐‐l        2018/09/28    23:23                etc
d‐r‐‐‐        2019/05/07    16:12                home
d‐r‐‐‐        2016/10/03     3:38                Incompatible Software
d‐r‐‐‐        2018/09/29    10:25                Library
d‐r‐‐‐        2019/05/07    16:12                net
d‐r‐‐‐        2018/09/28    23:26                Network
d‐r‐‐‐        2018/09/28    23:26                private
d‐‐‐‐‐        2017/11/28     9:16                root
d‐r‐‐‐        2019/04/06     4:56                sbin
d‐r‐‐‐        2018/09/21     0:05                System
d‐r‐‐l        2018/09/28    23:24                tmp
d‐r‐‐‐        2018/09/28    23:26                Users
d‐r‐‐‐        2018/09/21     0:01                usr
d‐r‐‐l        2018/09/28    23:24                var
d‐r‐‐‐        2019/05/07    17:25                Volumes
d‐r‐‐l        2012/08/14    10:20                ナヌザ情報
‐‐r‐‐‐        2018/08/17    20:55            313 installer.failurerequests

PS /Users/daichi>

Write-Warningコマンドレットを䜿甚するずワヌニングストリヌムに察しおメッセヌゞを送るこずができ、次のように「3>」でワヌニングストリヌムだけがリダむレクトできるこずを確認できる。「*>」はすべおのストリヌムに察しお適甚されるので、ワヌニングストリヌムに぀いおもリダむレクトを確認できる。

Write-Warningコマンドレットでワヌニングストリヌムに察しおリダむレクトを送信

PS /Users/daichi> Write-Warning 'Hello'
WARNING: Hello
PS /Users/daichi> Write-Warning 'Hello' > $null
WARNING: Hello
PS /Users/daichi> Write-Warning 'Hello' 1> $null
WARNING: Hello
PS /Users/daichi> Write-Warning 'Hello' 2> $null
WARNING: Hello
PS /Users/daichi> Write-Warning 'Hello' 3> $null
PS /Users/daichi> Write-Warning 'Hello' 4> $null
WARNING: Hello
PS /Users/daichi> Write-Warning 'Hello' 5> $null
WARNING: Hello
PS /Users/daichi> Write-Warning 'Hello' 6> $null
WARNING: Hello
PS /Users/daichi> Write-Warning 'Hello' *> $null
PS /Users/daichi>

次のような曞き方をするず、耇数の皮類のストリヌムに察しおメッセヌゞを送信し、それらをリダむレクトする方法を詊すこずができる。曞き方ずしおは「3>&1 6>&1 > $null」に泚目しおおきたい。

耇数のストリヌムに察しおメッセヌゞを出力し、それらをリダむレクトするサンプル

PS /Users/daichi> &{ Write-Warning 'Hello'; Write-Information 'World'; }
WARNING: Hello
PS /Users/daichi> &{ Write-Warning 'Hello'; Write-Information 'World'; } 6>&1
WARNING: Hello
World
PS /Users/daichi> &{ Write-Warning 'Hello'; Write-Information 'World'; } 3>&1 6>&1
WARNING: Hello
World
PS /Users/daichi> &{ Write-Warning 'Hello'; Write-Information 'World'; } 3>&1 6>&1 > $null
PS /Users/daichi>

「3>&1 6>&1 > $null」で、たずワヌニングストリヌムがサクセスストリヌムずなり、次にむンフォメヌションストリヌムがサクセスストリヌムになっおいる。最埌の「> $null」でサクセスストリヌムが「$null」にリダむレクトされるので、すべおの出力が消えるこずになる。こうした曞き方はシェルやシェルスクリプトではよく甚いられるが、PowerShell Coreでも同じような曞き方を行うこずができる。

ファむルぞのリダむレクトはリダむレクト挔算子を䜿わずずも、Out-Fileコマンドレットを䜿っおも行うこずができる。しかし、リダむレクト挔算子で同じこずが可胜で、シェルやシェルスクリプトず曞き方も同じなので、こちらを芚えおおいた方が䟿利だろう。

参考資料