BashからWindowsコマンドを呼び出す
「WSL」は、Windowsバイナリーを直接「WSL」のコマンドライン(Bashなど)から呼び出せるようになりました。ここでは「Bash」から「Windows」コマンドを呼び出すコマンドの実行例を紹介します。
「Linux」から「Windows」バイナリーを実行すると、以下の内容が適用されます。
- Bashと同じワーキングディレクトリーが設定される
- Bashを起動している「bash.exe」と同じ権限が適用される
- Windowsバイナリーは、現在アクティブなWindowsユーザーとして実行される
- CMDからWindowsバイナリーを実行した時と同様に、タスクマネージャーにアプリ(プロセス)が表示される
1.メモ帳を起動する例
ここでは例として、「Bash」からWindowsアプリである「メモ帳」を起動しています。「Bash」から以下のコマンドを実行します。
/mnt/c/Windows/System32/notepad.exe
以下のように「メモ帳」が起動します。
Windowsのプログラムが終了するまで戻らない
Linuxのプラグラムと同じように、Windowsのプログラムが終了するまで「Bash」のプロンプトには戻りません。「WSL」では、WindowsのプログラムをLinuxのプログラムと同じように扱います。
2.ファイルパスを含むコマンドの実行例
ファイルパスを含むコマンドを実行する際、ファイルパスの基準は「WSL」のパスが基準になります。すなわち、「/(VolFs)」が基準になります。
またコマンドを検索するパスリストは、デフォルトで以下のようになっています。
例えば「メモ帳」を起動する際、環境変数「PATH」に「メモ帳」のパスを追加しておけば、パスの指定なしに「メモ帳」の起動が可能になります。
export PATH=$PATH:/mnt/c/Windows/System32
notepad.exe
notepad.exe
3.パイプでWindowsコマンドとLinuxコマンドをつなぐ例
パイプでWindowsコマンドとLinuxコマンドをつなぐ例です。Windowsコマンドの出力結果をLinuxコマンドが受け取り、処理を行います。
ここでは例として、Linuxコマンドの「grep」でフィルタリングを行います。
「Bash」から以下のコマンドを実行します。
ipconfig.exe | grep IPv4 | cut -d: -f2
Windowsコマンドのパス指定を省略するため、「2.」で紹介したPATH環境変数の設定を事前に行っています。
4.パイプでLinuxコマンドとWindowsコマンドをつなぐ例
パイプでLinuxコマンドとWindowsコマンドをつなぐ例です。Linuxコマンドの出力結果をWindowsコマンドが受け取り、処理を行います。
ここでは例として、Windowsコマンドの「findstr」でフィルタリングします。
「Bash」から以下のコマンドを実行します。
ls -la | findstr.exe bash
Windowsコマンドのパス指定を省略するため、「2.」で紹介したPATH環境変数の設定を事前に行っています。
5.Bashからコマンドプロンプトを実行する例
「Bash」から「コマンドプロンプト」を起動してみます。
cmd.exe
「コマンドプロンプト」が起動しました。
Windowsコマンドのパス指定を省略するため、「2.」で紹介したPATH環境変数の設定を事前に行っています。
「exit」すれば「Bash」のプロンプトに戻ります。
BashからWindowsコマンドを呼び出す時の注意事項
「Bash(WSL)」から「Windowsコマンド」を呼び出す時の注意事項です。いくつか制約があるため注意してください。
1.拡張子の指定が必須
必ず実行ファイルの拡張子を指定してください。例えば以下の記述で「メモ帳」を起動することは出来ません。
notepad
以下のように必ず拡張子の指定が必要になります。
notepad.exe
2.大文字小文字の区別
実行ファイルのファイル名は、大文字/小文字を区別します。例えば以下の記述で「メモ帳」を起動することは出来ません。
NOTEPad.EXE
以下のように必ずファイル名の大文字/小文字をあわせて指定する必要があります。
notepad.exe
3.実行可能なファイルでなければならない
実行ファイルは、必ず実行可能なファイルでなければなりません。実行可能ではないファイルを「Bash」から直接起動することは出来ません。
もしコマンドプロンプト経由で実行できるものであれば、以下のように実行することが出来ます。
/mnt/c/Windows/System32/cmd.exe /C 実行したいコマンドや内容
4.パラメーターはそのまま渡される
実行ファイルに指定したパラメーター(オプション)は、その実行ファイルにそのまま渡されます。例えば以下のコマンドを「Bash」から実行すると、「C:\temp\test.txt」ファイルを「メモ帳」で開きます。
notepad.exe "C:\temp\test.txt"
5.VolFS内のファイルはWindowsアプリから編集しないこと
「VolFs」内のファイルはWindowsアプリから編集しないでください。Windowsエクスプローラーから見ると、「%localappdata%\lxss」以下に配置されているファイルのことです。
「Bash(WSL)」から見ると、「/mnt/ドライブレター」以外に配置されているファイルのことです。
6.作業ディレクトリーはWSLの作業ディレクトリーに追従する
デフォルトでは、「WSL」はWindowsバイナリーの作業ディレクトリーを、現在の「WSL」の作業ディレクトリーとして可能な限り維持しようとします。しかし作業ディレクトリーが「VolFs」上のディレクトリーを指す場合は、「WSL」
のインスタンスが生成されたディレクトリーを作業ディレクトリーに設定します。(フォールバック)
作業ディレクトリーのフォールバックの例
上記「5.」の作業ディレクトリーのフォールバックの例です。1.bashの起動
「コマンドプロンプト」の現在の作業ディレクトリーが「C:¥temp」であるとします。この状態で「Bash」を起動すると、「Bash」の作業ディレクトリーは以下のように「/mnt/c/temp」になります。
2.作業ディレクトリーの移動
「cd ~」を実行し、「VolFS」上のディレクトリーである「~(ユーザーのホームフォルダー)」に移動します。作業ディレクトリーは「~(ユーザーのホームフォルダー)」になります。
3.メモ帳の起動と作業ディレクトリーのフォールバック
「メモ帳」を起動してテキストファイルを作成します。「WSL」の作業ディレクトリーは、「~(ユーザーのホームフォルダー)」であり、このディレクトリーは「VolFS」上にあるため、「メモ帳」の作業ディレクトリーは「WSL」を起動した「C:¥temp」に設定されます。
4.ファイルの保存
ファイルを保存しようとすると、作業ディレクトリーである「C:¥temp」フォルダーが表示されます。5.ファイルの検索
「メモ帳」を終了して「3.」で保存したファイルを検索してみます。「Bash」のプロンプトに戻ると、作業ディレクトリーは「~(ユーザーのホームフォルダー)」になっています。
ファイルを検索しても先ほど保存したファイルは見つかりません。
6.コマンドプロンプトに戻る
「exit」を実行して「コマンドプロンプト」に戻ります。以下のように作業ディレクトリーは「C:¥temp」に戻ります。