普段UbuntuやCentOSのシェル環境はbashかzshでの作業が多い私ですが、PowerShellのスクリプトを業務で触ることもありますので、Linuxの作業環境にPowerShellを入れて触ってみました。
インストール
先日リリースされたばかりのPowerShell 7.0.0です。
インストール手順は公式ドキュメントを見るとわかります。
Installing PowerShell on Linux - PowerShell | Microsoft Docs
https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7
Release v7.0.0 Release of PowerShell · PowerShell/PowerShell
https://github.com/PowerShell/PowerShell/releases/tag/v7.0.0
以下の手順でインストールしました。
$ mkdir powershell
$ cd powershell
$ wget https://github.com/PowerShell/PowerShell/releases/download/v7.0.0/powershell-7.0.0-linux-x64.tar.gz
$ tar xvzf powershell-7.0.0-linux-x64.tar.gz
bin
のようなディレクトリがなく、直下に実行バイナリが現れます。このディレクトリを直接PATH
に入れるのも気持ち悪いので、PATH
の通った汎用のbin
にシンボリックリンクを作成しました。こんな感じ。
$ ln -s $HOME/powershell/pwsh $HOME/bin/pwsh
以下で実行できます。
$ pwsh
所感
ほとんどPowerShellを触ったことのない私の感想です。
Linux上のコマンドとの混在とパイプについて
Linux上のコマンドはPowerShellからでも普通に呼び出せます。
> ls | less
ls
はPowerShellではGet-ChildItem
というPowerShellのコマンドのエイリアスであって、Linuxのls
とは違うと聞いてたのですが、LinuxのPowerShellでのls
はLinuxのls
が実行されるようです。Windowsとは違うのかもしれません。
PowerShellのコマンドとLinuxコマンドの混在もできるようです。
> Get-ChildItem | less
> Get-ChildItem | grep foo
PowerShellのパイプは、Linuxのパイプと違ってテキストやバイナリが流れるのではなく、オブジェクトが流れるので、 ls | grep xxx
は次のように書けるようです。
> Get-ChildItem | Where-Object { $_.Name -like "*foo*" }
Where-Object
はフィルタリングするもので、{ ... }
は関数みたいなもので、 $_
は引数か。
この例での $_.Name
のような、 Get-ChildItem
から流れてくるオブジェクトにどんなプロパティやメソッドがあるかを調べるには Get-Member
というのを使う。
> Get-ChildItem | Get-Member
ワンライナー
bashやzshなどからPowerShellをワンライナーとしても使えます。 -c
というオプションを使います。
$ pwsh -c 'Get-ChildItem | Where-Object { $_.Name -like "*foo*" }'
コマンド履歴
コマンド履歴の保存されているファイル(.zsh_history
などに相当するファイル)は $HOME/.local/share/powershell/PSReadLine/ConsoleHost_history.txt
です。
以上。