普段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 です。
以上。