PowerShellとUnixシェル


13

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

そのため、Powershellには、シェルスクリプトと同様に、配管とコマンドレットが含まれているようです。しかし、私はまだそれを試していません(Windowsではありません)、それで私は間違っているかもしれません。

だから私の質問は:PowershellはUnixのシェルに似ているのか、それともコンセプトが違うのか?
後者の場合:概念はどの点で異なりますか?


2
この質問はすでにStackOverflowで聞かれています。 stackoverflow.com/questions/573623/powershell-vs-unix-shells
Richard

回答:


18

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シェルユーザーを念頭に置いて設計されているように思われるので、多くの言語スタイルは似ています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.