Windows および Linux ファイル システム間での作業
Windows と Linux のファイル システム間で作業する場合は、注意すべき多数の考慮事項があります。 このガイドには、そのいくつかについての説明と、Windows および Linux ベースのコマンドを混在させる相互運用性のサポートに関するいくつかの例が含まれています。
ファイル システム間のファイル ストレージとパフォーマンス
特殊な理由がない限り、複数のオペレーティング システム間でファイルを操作しないことをお勧めします。 Linux コマンド ライン (Ubuntu、OpenSUSE など) で作業している場合、最速のパフォーマンス速度を実現するには、ファイルを WSL ファイル システムに格納します。 Windows コマンド ライン (PowerShell、コマンド プロンプト) で作業している場合、ファイルを Windows ファイル システムに格納してください。
たとえば、WSL プロジェクト ファイルを格納する場合は、次のとおりです。
- Linux ファイル システムのルート ディレクトリを使用します:
/home/<user name>/Project
- Windows ファイル システムのルート ディレクトリは使用しません:
/mnt/c/Users/<user name>/Project$
またはC:\Users\<user name>\Project
WSL コマンド ラインのファイル パスに /mnt/
が含まれている場合は、マウントされたドライブから作業していることを意味します。 したがって、Windows ファイルシステムの C:/ ドライブ (C:\Users\<user name>\Project
) は、マウントされているとき、WSL コマンド ラインで次のようになります: /mnt/c/Users/<user name>/Project$
。 マウントされたドライブにプロジェクト ファイルを格納することは可能ですが、\\wsl$
ドライブに直接格納すれば、パフォーマンス速度が向上します。
Windows エクスプローラーで現在のディレクトリを表示する
ファイルが格納されているディレクトリを表示するには、次を使用して、コマンド ラインから Windows エクスプローラーを開きます。
explorer.exe .
または、コマンド powershell.exe /c start .
を使用することもできます。現在のディレクトリを開くため、コマンドの最後に必ずピリオドを追加してください。
Windows エクスプローラーで、使用可能なすべての Linux ディストリビューションとそれらのルート ファイル システムを表示するには、アドレス バーに次のように入力します: \\wsl$
ファイル名とディレクトリの大文字と小文字の区別
大文字と小文字の区別により、ファイル名またはディレクトリで大文字 (FOO.txt) と小文字 (foo.txt) が別々に処理される (大文字と小文字を区別する) か、同等に処理される (大文字と小文字を区別しない) かが決まります。 Windows と Linux のファイル システムでは、大文字と小文字の区別が異なる方法で処理されます。Windows では大文字と小文字が区別されず、Linux では大文字と小文字が区別されます。 大文字と小文字の区別を調整する方法 (特に WSL を使用してディスクをマウントする場合) の詳細については、「大文字と小文字の区別を調整する」のハウツー記事を参照してください。
Windows と Linux コマンド間の相互運用性
Windows と Linux のツールとコマンドは、WSL では同じように使用できます。
- Windows ツール (つまり、notepad.exe) を Linux コマンド ライン (つまり、Ubuntu) から実行する。
- Linux ツール (つまり、grep) を Windows コマンド ライン (つまり、PowerShell) から実行する。
- Linux と Windows の間で環境変数を共有する。 (ビルド 17063 以降)
Windows コマンド ラインからの Linux ツールの実行
wsl <command>
(または wsl.exe <command>
) を使用して、Windows コマンド プロンプト (CMD) または PowerShell から Linux バイナリを実行します。
たとえば、次のように入力します。
C:\temp> wsl ls -la
<- contents of C:\temp ->
この方法で起動されるバイナリには、次の特性があります。
- 現在の CMD または PowerShell プロンプトと同じ作業ディレクトリを使用します。
- WSL の既定のユーザーとして実行されます。
- 呼び出し元のプロセスおよびターミナルと同じ Windows 管理者権限を持ちます。
wsl
(または wsl.exe
) に続く Linux コマンドは、WSL での任意のコマンド実行と同様に処理されます。 sudo、パイプ処理、ファイル リダイレクトなどが機能します。
sudo を使用して既定の Linux ディストリビューションを更新する例:
C:\temp> wsl sudo apt-get update
このコマンドを実行すると、既定の Linux ディストリビューションのユーザー名が一覧表示され、パスワードの入力を求められます。 パスワードを正しく入力すると、ディストリビューションによって更新プログラムがダウンロードされます。
Linux と Windows のコマンドを組み合わせて使用する
PowerShell を使用して Linux と Windows のコマンドを組み合わせて使用するいくつかの例を次に示します。
Linux コマンド ls -la
を使用してファイルを一覧表示し、PowerShell コマンド findstr
を使用して "git" を含む単語の結果をフィルター処理するには、次のようにコマンドを組み合わせます。
wsl ls -la | findstr "git"
Linux コマンド dir
を使用してファイルを一覧表示し、PowerShell コマンド grep
を使用して "git" を含む単語の結果をフィルター処理するには、次のようにコマンドを組み合わせます。
C:\temp> dir | wsl grep git
Linux コマンド ls -la
を使用してファイルを一覧表示し、PowerShell コマンド > out.txt
を使用してその一覧を "out.txt" という名前のテキスト ファイルに出力するには、次のようにコマンドを組み合わせます。
C:\temp> wsl ls -la > out.txt
wsl.exe
に渡されるコマンドは、変更なしで WSL プロセスに転送されます。 ファイル パスは WSL 形式で指定する必要があります。
PowerShell を使用して、Linux コマンド ls -la
を使用して /proc/cpuinfo
Linux ファイル システム パス内のファイルを一覧表示するには、次のようにします。
C:\temp> wsl ls -la /proc/cpuinfo
PowerShell を使用して、Linux コマンド ls -la
を使用して C:\Program Files
Windows ファイル システム パス内のファイルを一覧表示するには、次のようにします。
C:\temp> wsl ls -la "/mnt/c/Program Files"
Linux からの Windows ツールの実行
WSL では、[tool-name].exe
を使用して、WSL コマンド ラインから Windows ツールを直接実行することができます。 たとえば、notepad.exe
のように指定します。
この方法で実行されるアプリケーションには、次の特性があります。
- ほとんどの場合、作業ディレクトリを WSL コマンド プロンプトとして保持します (例外については後述します)。
- WSL プロセスと同じアクセス許可権限が与えられています。
- アクティブな Windows ユーザーとして実行されます。
- CMD プロンプトから直接実行されたかのように、Windows タスク マネージャーに表示されます。
WSL で実行される Windows 実行可能ファイルは、ネイティブの Linux 実行可能ファイルと同様に処理されます。パイプ処理、リダイレクト、さらにバックグラウンド処理も想定どおりに機能します。
Linux ディストリビューション (たとえば、Ubuntu) から Windows ツール ipconfig.exe
を実行し、Linux ツール grep
を使用して "IPv4" の結果をフィルター処理し、Linux ツール cut
を使用して列フィールドを削除するには、次のように入力します。
ipconfig.exe | grep IPv4 | cut -d: -f2
Windows と Linux のコマンドを組み合わせた例を試してみましょう。 Linux ディストリビューション (つまり、Ubuntu) を開き、テキスト ファイルを作成します: touch foo.txt
。 次に、Linux コマンド ls -la
を使用して直接ファイルとその作成の詳細を一覧表示し、さらに Windows PowerShell ツール findstr.exe
を使用して結果をフィルター処理して foo.txt
ファイルのみが結果に表示されるようにします。
ls -la | findstr.exe foo.txt
Windows ツールは、ファイル拡張子を含み、ファイルの大文字と小文字が一致し、実行可能である必要があります。 非実行可能ファイルにはバッチ スクリプトが含まれます。 dir
などの CMD ネイティブ コマンドは、cmd.exe /C
コマンドを使用して実行できます。
たとえば、次のように入力して、Windows ファイル システムの C:\ ディレクトリの内容を一覧表示します。
cmd.exe /C dir
または、ping
コマンドを使用して、エコー要求を microsoft.com Web サイトに送信します。
ping.exe www.microsoft.com
パラメーターは、変更されずに Windows バイナリに渡されます。 たとえば、次のコマンドを実行すると C:\temp\foo.txt
が notepad.exe
で開かれます。
notepad.exe "C:\temp\foo.txt"
以下も有効です。
notepad.exe C:\\temp\\foo.txt
WSLENV を使用して Windows と WSL の間で環境変数を共有する
WSL と Windows は WSLENV
を共有します。これは、Windows と WSL で実行される Linux ディストリビューションをつなぐために作成された特殊な環境変数です。
WSLENV
変数のプロパティ:
- 共有され、Windows と WSL の両方の環境に存在します。
- Windows と WSL の間で共有する環境変数の一覧です。
- Windows と WSL で適切に機能するように環境変数をフォーマットできます。
- WSL と Win32 間のフローに役立ちます。
注意
17063 より前では、WSL がアクセスできる唯一の Windows 環境変数は PATH
でした (そのため、WSL で Win32 実行可能ファイルを起動できました)。 17063 以降、WSLENV
がサポートされるようになります。
WSLENV では、大文字と小文字が区別されます。
WSLENV フラグ
WSLENV
には、環境変数の変換方法に影響を与える 4 つのフラグがあります。
WSLENV
のフラグ:
/p
- WSL/Linux スタイル パスと Win32 パスの間でパスを変換します。/l
- 環境変数がパスのリストであることを示します。/u
- Win32 から WSL を実行する場合にのみ、この環境変数を含める必要があることを示します。/w
- WSL から Win32 を実行する場合にのみ、この環境変数を含める必要があることを示します。
フラグは、必要に応じて組み合わせることができます。
WSLENV の詳細をご覧ください。これには、WSLENV の値を他の定義済みの環境変数の連結に設定し (各変数の末尾にはスラッシュが付けられ、その後に、値の変換方法を指定するフラグが続く)、スクリプトによって変数を渡す例や FAQ なども含まれます。 この記事には、WSL と Win32 の間で GOPATH を共有するように構成された、Go プログラミング言語により開発環境を設定する例も含まれています。
相互運用性の無効化
ユーザーは、ルートとして次のコマンドを実行することで、1 つの WSL セッションに対して Windows ツールを実行する機能を無効にできます。
echo 0 > /proc/sys/fs/binfmt_misc/WSLInterop
Windows バイナリを再び有効にするには、すべての WSL セッションを終了して bash.exe を再実行するか、ルートとして次のコマンドを実行します。
echo 1 > /proc/sys/fs/binfmt_misc/WSLInterop
相互運用の無効化は、WSL セッション間で保持されません。新しいセッションが開始されると、相互運用は再び有効になります。
Windows Subsystem for Linux