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 .
コマンドの最後にピリオドを追加して、現在のディレクトリを開きます。
使用可能なすべての Linux ディストリビューションとそのルート ファイル システムを Windows エクスプローラーで表示するには、アドレス バーに次のように入力します。 \\wsl$
ファイル名とディレクトリの大文字と小文字の区別
大文字 (FOO.txt) と小文字 (foo.txt) をファイル名またはディレクトリ内で区別する(大文字小文字を区別する)か、同一視する(大文字小文字を区別しない)かを決定します。 Windows ファイル システムと Linux ファイル システムでは、大文字と小文字の区別はさまざまな方法で処理されます。Windows では大文字と小文字が区別され、Linux では大文字と小文字が区別されます。 特に WSL を使用してディスクをマウントする場合に、大文字と小文字の区別を調整する方法の詳細については、 大文字と小文字の区別の調整 に関する記事を参照してください。
Windows コマンドと Linux コマンドの相互運用性
Windows および Linux のツールとコマンドは、WSL と同じ意味で使用できます。
- Linux コマンド ラインから Windows ツール (つまり、notepad.exe) を実行します。Ubuntu)。
- Windows コマンド ライン (例えば、PowerShell) から Linux ツール (例えば、grep) を実行します。
- 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"
PowerShell コマンド dir
を使用してファイルを一覧表示し、Linux コマンド 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 形式で指定する必要があります。
Linux コマンド ls -la
を使用して、 /proc/cpuinfo
Linux ファイル システム パス内のファイルを一覧表示するには、PowerShell を使用します。
C:\temp> wsl ls -la /proc/cpuinfo
Linux コマンド ls -la
を使用して、 C:\Program Files
Windows ファイル システム パス内のファイルを一覧表示するには、PowerShell を使用します。
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 実行可能ファイルと同様に処理されます。パイプ処理、リダイレクト、バックグラウンド処理も想定どおりに行われます。
Windows ツール ipconfig.exe
を実行するには、Linux ツール grep
を使用して "IPv4" の結果をフィルター処理し、Linux ツール cut
を使用して、Linux ディストリビューション (Ubuntu など) から列フィールドを削除します。次のように入力します。
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 は、WSL で実行されている Windows ディストリビューションと Linux ディストリビューションをブリッジするために作成された特別な環境変数 ( WSLENV
) を共有します。
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 の詳細については、FAQs、および WSLENV の値をスラッシュとフラグを用いて他の定義済み環境変数の連結として設定する例、スクリプトを使用して変数を渡す方法を含む情報をご覧ください。 この記事には、WSL と Win32 の間で GOPATH を共有するように構成された Go プログラミング言語を使用して開発環境を設定する例も含まれています。
相互運用性を無効にする
ユーザーは、ルートとして次のコマンドを実行することで、単一の 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