2016-10-03 3 views
1

以下の2つのケースの間に出力の違いが分かる理由はありますか?WindowsとOS Xの実装間で、PowerShellエイリアス 'ls'と 'dir'の動作が異なる理由はありますか?

エイリアスlsの出力は、OSXのエイリアスdirの出力と異なります。例のように

dir ./*.txt | foreach {Get-Content $_ -Head 1; Get-Content $_ -Tail 1} 

作品:Help Get-Content -ExamplesのためのPowerShellのヘルプに示す例では。しかし、dir場合lsに置き換えられます。

ls ./*.txt | foreach {Get-Content $_ -Head 1; Get-Content $_ -Tail 1} 

エラーが返されます。

LS:./*.txt:そのようなファイルやディレクトリ

どちらも上記の例をWindows 10のPowerShell v5でも同じ結果が得られます。

この観測はバグですか?

答えて

1

エイリアスが外部コマンドよりも優先されるにもかかわらず、/bin/ls/usr/bin/ls?)というコマンドをPowerShellエイリアスlsではなく呼び出すように見えます。エイリアスが実際に定義されていることを確認します。

Get-Alias -Name ls 
1

、が意図的にクロスプラットフォーム版の外に残っていた標準Unixユーティリティにちなんで名づけられWindows専用版で別名で、内蔵しないようにそれらをシャドウ(オーバーライド)します。

注:これは、PowerShellのコア5月v6.0.0-alpha.10の真ですが、この設計上の決定は論争を集めている - 議論hereを見つけます。
外部のユーティリティを呼び出すときにPowerShellがグロビングを実行しないということは、例えばls *.txtのようなものがBashのように動作しないことです。

はこのように、Windowsのネイティブ版に組み込まれたエイリアスlsは、標準ユーティリティ/bin/lsが優先すべきので、Linuxの& MacOSのエディションに組み込まれてないです。これとは対照的に

dir - 任意の標準的なUnixユーティリティ名と競合しないように起因する - 内蔵のエイリアス内のすべてのエディションである(およびWindows上として、Get-ChildItemを参照)。 PowerShellは、Unixの背景から来る人に会釈したように(Get-Content用)(Get-ChildItem用)lscatとしてエイリアスを追加して、Windows専用

たとき。
Windowsでは、これらのコマンド名にはあらかじめ定義された意味はありませんが、Unixライクなシステムでは標準ユーティリティ(CLI)をシャドーするため、予期しない動作が発生する可能性があります。代わりに、エイリアスの完全なコマンドレット名を使用して

  • 安全、ポータブルなアプローチはに固執することです。

  • 、および/またはlsまたはdirのようなレガシーコマンド名ではなく、コマンドレットの名前のみに基づくエイリアスを使用してください。

PowerShellは、承認されたエイリアスの接頭辞に承認された各動詞(のようなGet-Copy-)をマッピング、コマンドレット名由来エイリアスの命名規則がある(たとえば、gcpなど) - https://msdn.microsoft.com/en-us/library/ms714428(v=vs.85).aspxを参照してください。

与えられたコマンド名が何を指しているのか疑問がある場合は、Get-Command <name>(またはgcm <name>)を使用してください。

関連する問題