PowerShell と Unix シェル

PowerShell と Unix シェル

PowerShell の機能についていくつか聞いたことがあります。その一部は Unix シェルの典型的な機能のようです。

つまり、Powershell には、シェル スクリプトに似たパイプとコマンドレットが含まれているようです。ただし、まだ試していないので (Windows ではない)、間違っている可能性があります。

そこで質問です。Powershell は Unix シェルに似ていますか、それとも概念が異なりますか?
後者の場合、概念が異なるのはどの点ですか?

答え1

PowerShell は表面的には Unix シェルに似ています。PowerShell には、ls、rm、cp、mv など、Unix でよく使用されるコマンドの多くにエイリアスがあります。ただし、エイリアスの背後にあるコマンドレットの動作はまったく異なります。

*nix シェルではすべてがテキストベースなので、あるコマンドの出力を別のコマンドにパイプすることができますが、受信プログラムはパイプラインからのテキストを解析/解釈する方法を知っている必要があります。これが PowerShell と *nix シェルの主な違いです... PowerShell では、すべて渡されるのはオブジェクトです。

その結果、あるコマンドから別のコマンドへのパイプ処理は、単に stdout を stdin にパイプ処理するだけではありません。完全な .net オブジェクトを受信者にパイプ処理します。したがって、受信者は、そのタイプのオブジェクトの処理方法を知っているだけで済みます。テキストの解析を実装する必要はありませんが、入力オブジェクトのメソッドとプロパティ (メンバー) を呼び出す方法を理解する必要があります。

*nix コマンドライン プログラムでは、stdin から読み取り、別のプログラムが生成したテキストからその情報を解析するコードを記述します。PowerShell では、次の操作を行います。

function changeName($myObject)
{
    if ($myObject.GetType() -eq [MyType])
    {
        #print the current name to screen
        $myObject.Name
        #change string in the 'name' property
        $myObject.Name = "NewName"
    }
    return $myObject
}

このコードをコマンドラインで呼び出すと、次のようになります。

PS> $myObject = New-Object MyType -arg "OriginalName"
PS> $myObject = changeName $myNewObject
OriginalName
PS> $myObject.Name
NewName

パイプ メカニズムを使用して上記と同じことを行うこともできますが、ここではテキストではなくオブジェクトを渡しているという大きな違いがわかります。

PS> $myObject = New-Object MyType -arg "OriginalName" | changeName
OriginalName
PS> $myObject.Name
NewName

この大きな違いを忘れると、他にも表面的な類似点はあると思いますが、ほとんどは構文上のものです。PowerShell 構文は *nix シェル ユーザーを念頭に置いて設計されているようなので、言語スタイルの多くは似ています。

関連情報