質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Bash on Ubuntu on Windows

Bash on Ubuntu on Windowsは、Windows Subsystem for Linux(WSL)の非推奨の名称。Windows10およびWindows Server上でLinuxのバイナリ実行ファイルをネイティブ実行するための互換レイヤーです。

Q&A

解決済

1回答

5641閲覧

WSL シェル とバッチファイルの組み合わせエラー

退会済みユーザー

退会済みユーザー

総合スコア0

Bash on Ubuntu on Windows

Bash on Ubuntu on Windowsは、Windows Subsystem for Linux(WSL)の非推奨の名称。Windows10およびWindows Server上でLinuxのバイナリ実行ファイルをネイティブ実行するための互換レイヤーです。

0グッド

0クリップ

投稿2022/06/03 20:58

編集2022/06/08 02:38

環境

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

pushdで、\\wsl$に一時的に割り当てられるネットワークドライブがwsl2側から見えないのだと思います。

ちょっとwsl2の環境が無いので確認できませんが、バッチスクリプトの中でnet useコマンドで明示的にネットワークドライブを割り当てれば、wsl2側でも/mntの下にドライブが出来るのではないかと思います。

投稿2022/06/04 01:29

otn

総合スコア85773

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/06/04 07:04

回答ありがとうございます。なるべくなら、個人の環境を入力したり、PC の設定やレジストリをいじらずに済ませたいと思っています。pushd コマンドとフルパスの上記のようなコードでは、ちょっと違和感のある怪しいコードなのでしょうか?
otn

2022/06/04 14:13

> なるべくなら、個人の環境を入力したり、PC の設定やレジストリをいじらずに済ませたいと思っています。 別に環境設定やレジストリ変更は不要だと思いますけど、どういうことでしょうか? > pushd コマンドとフルパスの上記のようなコードでは、ちょっと違和感のある怪しいコードなのでしょうか? pushd %~dp0 の事なら、ごく普通です。
退会済みユーザー

退会済みユーザー

2022/06/05 08:54

コメントありがとうございます。 > pushd %~dp0 の事なら、ごく普通です。 わかりました。ありがとうございます。 > 別に環境設定やレジストリ変更は不要だと思いますけど、どういうことでしょうか? すいません。「net use コマンド」や「ネットワークドライブの割り当て」について、あまり知識がないのです。 「ネットワークドライブの割り当て」というと、ネットワーク上に共有フォルダを作成して、任意のドライブ文字を作り、そのために PC の設定をするみたいなイメージがありました。 net use コマンドもざっとググってみたら、なんか PC のデバイス名とか入力しないといけないのかな、なんか面倒くさいそうだなと思ったのです。でも、ちょっと勘違いしていたかもしれません。 まだ調べながら手探りでやっているところです。 例えば、<追記>のようにしてみましたが、うまくいきませんでした。
otn

2022/06/05 09:09 編集

> でも、ちょっと勘違いしていたかもしれません。 はい。勘違いです。 pushd %~dp0 の代わりに、 net use X: %~dp0 pushd X:\ と書くだけです。(X: は使っていないドライブ文字) あとで、net use X: /delete はしておく。
退会済みユーザー

退会済みユーザー

2022/06/06 00:20

教えていただいた上記のコマンドで実行すると、次のようなエラーが出ました。 > '\\wsl$\Ubuntu-20.04\home\<username>\Test' > 上記の現在のディレクトリで CMD.EXE を開始しました。 > UNC パスはサポートされません。Windows ディレクトリを既定で使用します。 > システム エラー 67 が発生しました。 > ネットワーク名が見つかりません。 > 指定されたドライブが見つかりません。 > 続行するには何かキーを押してください . . . ドライブ X はかぶっていません。 そこで、<追記2>のテストのコードで確認しました。 どうやら、「net use X: %~dp0」でも「pushd %~dp0」でも結局「/mnt/c/Windows」に飛んでしまうようです。 あとは、振り出しに戻って他をフルパスにすればうまくいくといった状態です。
otn

2022/06/06 11:33

ググってみると、 https://atmarkit.itmedia.co.jp/ait/articles/1903/01/news043.html によると、少なくとも以前は net use X: \\wsl$\~~~ が出来ていたようです。 echo offしないで、net use X: のコマンドラインがどうなっているか見てください。 (先頭に@echo offを付けるのは完成してからです)
退会済みユーザー

退会済みユーザー

2022/06/07 06:39

何度も恐縮です。見づらいので <追記3> に書きました。よろしくお願いします。
otn

2022/06/07 09:56 編集

wsl コマンドだと常にユーザーのホームディレクトリ(/home/USER)から始まるとかいう仕様なのですかね?
退会済みユーザー

退会済みユーザー

2022/06/08 02:40

つきあっていただき、ありがとうございます。これまでの結果を<追記4>にまとめてみました。よろしくお願いします。 > wsl コマンドだと常にユーザーのホームディレクトリ(/home/USER)から始まるとかいう仕様なのですかね? Windows のローカル側(C ドライブとか)に作業ディレクトリを作って、wsl すると、カレントディレクトリ自体は変わらないと思います。でも、例えば、ubuntu2004(.exe) とコマンドを打って、ディストリビューションを直接起動すると、そのディストリビューション内のホームディレクトリがカレントディレクトリになります。たぶん、pushd すると、それと同じ挙動になるのかもしれません。私もついバッチファイルの場所がカレントディレクトリになると思い込んでいました。 なので、ディストリビューション内のカレントディレクトリさえ意識すれば、無理にネットワークドライブを割り当てなくてもうまくいくのでは? と思ってバッチファイルに直接 `/home/~~/hello.sh` として実行したところ、一応期待通りの結果になりました。ただし、「Windows ディレクトリを既定で使用します。」と警告にあるとおり、ディストリビューション内のカレントディレクトリは、`/mnt/c/Windows` になりますが。 なんだかそう考えると、すべてがつながるような気がするのですが、どうでしょうか?
otn

2022/06/08 15:08

やっぱり手元にwsl2の環境が無いので、よくわからないです。
退会済みユーザー

退会済みユーザー

2022/06/08 20:11

コメントありがとうございます。なんか私の質問が要領を得ないのかもしれません。答えづらいですよね。 もう少し知識を増やしてから考えることにします。 net use の使い方とかいろいろと勉強になりました。辛抱強くつきあって頂いてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問