環境
Windows10 WSL ubuntu-20.04
問題点
WSL の Linux 上の /home/<username> に作業ディレクトリを作って、
その中にバッチファイルを作りました。
Test/
├── hello.bat
└── hello.sh
hello.bat
batch
1@echo off 2wsl ./hello.sh
hello.sh
bash
1#!/bin/bash 2echo 'hello!' > hello.txt
このコードでバッチファイルを実行すると、「UNC パスはサポートされません」とエラー表示(警告?)が出ます。
ググったところ、解決策として pushd %~dp0
とすると、
バッチファイルの実行場所に一時的に自動でネットワークドライブを割り当ててくれると書いてありました。
そこで以下のようにコードを変更しました。
hello.bat
batch
1@echo off 2pushd %~dp0 3wsl /home/<username>/Test/hello.sh
これでシェルも実行されるのですが、なぜか hello.txt がひとつ前のディレクトリにできてしまいます。
そこで次のコードでもう一度確認しました。
hello.bat
batch
1@echo off 2pushd %~dp0 3echo %~dp0 4wsl pwd 5wsl /home/<username>/Test/hello.sh 6pause
その結果、%~dp0
は、\\wsl$\Ubuntu-20.04\home\<username>\Test\
と表示され、
正しい値が取れているみたいですが、pwd
のほうは、/home/<username>
となっていて、
うまく値が取れていないようです。hello.sh のパスも同様に確認したところ、
やはり /home/<username>
になっているようです。
そこで強引に hello.sh のほうもフルパスで書いたら、一応期待通りの結果が得られました。
hello.sh
bash
1#!/bin/bash 2echo 'hello!' > /home/<username>/Test/hello.txt
これは仕様上の問題でしょうか? それともコードや考え方がどこかおかしいでしょうか?
長くなって恐縮ですが、ご存じの方いらしたら、教えていただけると助かります。
<追記>
以下のようにしましたが、うまくいきませんでした。
batch
1@echo off 2net use z: \\wsl$\Ubuntu-20.04 3wsl pwd 4net use z: /delete 5pause
結果は、
'\wsl$\Ubuntu-20.04\home<username>\Test'
上記の現在のディレクトリで CMD.EXE を開始しました。
UNC パスはサポートされません。Windows ディレクトリを既定で使用します。
コマンドは正常に終了しました。
/mnt/c/Windows
z: が削除されました。
<追記2>
確認テスト
batch
1@echo off 2net use X: %~dp0 3echo %~dp0 4pushd X:\ 5wsl pwd 6pause
結果は、
'\wsl$\Ubuntu-20.04\home\<username>\Test'
上記の現在のディレクトリで CMD.EXE を開始しました。
UNC パスはサポートされません。Windows ディレクトリを既定で使用します。
システム エラー 67 が発生しました。
ネットワーク名が見つかりません。
\wsl$\Ubuntu-20.04\home\<username>\Test
指定されたドライブが見つかりません。
/mnt/c/Windows
続行するには何かキーを押してください . . .
<追記3>
以下を@echo off をつけず実行してみました。
net use X: %~dp0
C:\Windows>net use X: \wsl$\Ubuntu-20.04\home\<username>\Test
システム エラー 67 が発生しました。
ネットワーク名が見つかりません。
うまくいかないので、参考サイトのように UNC パスを \\wsl$\Ubuntu-20.04
だけにしました。
batch
1net use X: \\wsl$\Ubuntu-20.04 2pushd pushd X:\home\<username>\Test 3pause
C:\Windows>net use X: \wsl$\Ubuntu-20.04
コマンドは正常に終了しました。
C:\Windows>pushd X:\home\<username>\Test
X:\home\<username>\Test>pause
続行するには何かキーを押してください . . .
エラーもなく、最後、X:\home\<username>\Test>pause
となっているので、こちらは、うまくいっているような気がします。上記のコードの pause の前に、dir
として実行すると、ちゃんと、Test の中の hello.bat と hello.sh が表示されました。
アクセスもできるようです。
でもそのあとがわかりません。
wsl ./hello.sh
で実行すると、
X:\home\<username>\Test>wsl ./hello.sh
/bin/bash: ./hello.sh: そのようなファイルやディレクトリはありません
wsl pwd
で確認すると、なぜか /home/<username>
となっています。
なので、wsl ./Test/hello.sh
として実行すると、一応期待通りの結果になります。
C:\Windows>pushd X:\home\<username>\Test
X:\home<username>\Test>wsl ./Test/hello.sh
windows 側からの X ドライブのシェルの実行方法はどうすればよいのでしょうか?
<追記4>
以下のようにして確認すると、期待通りの結果になりました。
1.
hello.bat
batch
1wsl /home/<username>/Test/hello.sh 2wsl pwd
hello.sh
bash
1#!/bin/bash 2echo "hello! $(pwd)" > /home/<username>/Test/hello.txt
結果は、
ディストリビューション内のカレントディレクトリは、
/mnt/c/Windows
Windows ローカル側のカレントディレクトリ
C:\Windows
2.
hello.bat
batch
1pushd %~dp0 2wsl /home/<username>/Test/hello.sh 3wsl pwd
hello.sh は、1. と同じ
結果は、
ディストリビューション内のカレントディレクトリは、
/home/<username>
Windows ローカル側のカレントディレクトリ
Z:\home\<username>\Test
3.
hello.bat
batch
1net use X: \\wsl$\Ubuntu-20.04 2pushd X:\home\<username>\Test 3wsl /home/<username>/Test/hello.sh
hello.sh は、1. と同じ
結果は、
ディストリビューション内のカレントディレクトリは、
/home/<username>
Windows ローカル側のカレントディレクトリ
X:\home\<username>\Test
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2022/06/04 07:04
2022/06/04 14:13
退会済みユーザー
2022/06/05 08:54
2022/06/05 09:09 編集
退会済みユーザー
2022/06/06 00:20
2022/06/06 11:33
退会済みユーザー
2022/06/07 06:39
2022/06/07 09:56 編集
退会済みユーザー
2022/06/08 02:40
2022/06/08 15:08
退会済みユーザー
2022/06/08 20:11