Windows上のUbuntu上のBASH(WindowsのLinuxサブシステム)10-PATHを設定するにはどうすればよいですか?


8

Anniversary Updateのおかげで、Windows 10のUbuntuでBASHを使用できるようになりました。以前は、Cygwinを使用していて、MavenをCygwinでセットアップしていて(完全に機能していました)、MavenをインストールしてからPATH環境を変更していました変数(~/.bashrc

まあ、私はBUWを使用して同じことをしようとしていますが、私の知る限り、PATH変数は無視されます(Maven binディレクトリをに追加してからPATH実行すると、which mvn空白が返されます)。私が見逃しているトリックはありPATHますか、それともBUWで別の方法でセットアップする必要がありますか?

編集:

具体的に申し上げます。「???」で何をする必要がありますか パスにpathTestScript.shを取得するステップ?

mkdir -p ~/pathTest
touch ~/pathTest/pathTestScript.sh
echo '#!/bin/sh' >> ~/pathTest/pathTestScript.sh
echo 'echo "it works!"' >> ~/pathTest/pathTestScript.sh
bash ~/pathTest/pathTestScript.sh
    # Should output 'it works!'
# ?????????
pathTestScript.sh
    # Should output it works!'

編集2:

私の実際の最終目標を明確にしたいと思います。私のシステムの通常の場所にJDKとApache Mavenがインストールされています。Cygwinでこれらの両方を完全に正常に動作させました。BUWがリリースされたので、代わりにそれらを使用したいのですが、PATHに加えた変更が何の効果もないように見えるため、それらの環境をセットアップする方法がわかりません。

編集3:

さて、私は野生のガチョウの追跡をしているのではないかと心配しています。私がするならecho $PATH、私は得る/mnt/c/Program\ Files/apache-maven-3.3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

それは私が期待することです。それが私が自分の~/.bashrcファイルに入れたものです...そして私はそうls /mnt/c/Program\ Files/apache-maven-3.3.9/binします

m2.conf  mvn  mvn.cmd  mvnDebug  mvnDebug.cmd  mvnyjp

しかし、を実行するとwhich mvn、空白になり、を呼び出すとmvnapt-getそれをインストールするために使用するようにリダイレクトされます。

したがって、問題はPATHが更新されていないことではありません...無視されているだけです。PATHに注意を払う方法はありますか?そうでない場合、これはLinux(IMO)のかなり弱いバージョンです

編集4:

それは数回起動されました、そして、はい、私の平手打ちの例はファイルを実行可能としてマークするのを忘れていました。私の実際のシナリオ(Mavenを使用)では、ファイルはすべて実行可能です。

cd /mnt/c/Program\ Files/apache-maven-3.3.9/bin && ls -alt
total 36
dr-xr-xr-x 2 root root    0 Apr 19 11:56 ..
-r-xr-xr-x 1 root root 1843 Apr 19 11:56 mvnyjp
dr-xr-xr-x 2 root root    0 Apr 19 11:56 .
-r-xr-xr-x 1 root root 1815 Apr 19 11:56 mvnDebug
-r-xr-xr-x 1 root root 7383 Apr 19 11:56 mvn
-r-xr-xr-x 1 root root 1513 Apr 19 11:56 mvnDebug.cmd
-r-xr-xr-x 1 root root 6067 Apr 19 11:56 mvn.cmd
-r-xr-xr-x 1 root root  230 Apr 19 11:56 m2.conf

1
C:\Users\%username%\AppData\Local\lxss\root\.bashrcファイルを編集してパスを追加しますか?
Peter

@Peterそのディレクトリは存在しません(ローカルの下に「lxss」はありません)
コーディS

1
アドレスバーに入力してください。それ以外の場合は、非表示のシステムフォルダーを表示します。隠しフォルダを有効にするだけでは不十分です。superuser.com/questions/1108483/…を
ピーター

ああ、あなたは正しいです...しかし、今はそれが私の問題であるかどうかわかりません。私の質問を編集する必要があります
コーディS

1
なぜWindows mavenをBashで実行するのですか?Windows上のBashはLinux内で実行され、ネイティブLinuxバイナリのみを実行できます。ネイティブのWindowsバイナリの実行に使用されるCygwinとは異なり、Windows exeファイルを実行することはできません
phuclv

回答:


6

更新の概要

問題の実行可能ファイルはLinuxネイティブ形式(ELF)ではなく、Windows用にコンパイルされています。パス拡張中に、bashはバイナリのマジックナンバーをチェックします。ELFと一致しない場合、パス拡張を介してそれを公開しません。ただし、Windowsのbashには、bash環境からネイティブのWindowsアプリケーションを起動する機能が含まれていました。そのため、直接実行(パスの拡張と後続のバイナリチェックなし)は正常に機能します。

解決策は、別名ベースの.bashrcの追加(またはパス拡張を模倣してbashファイルの評価をバイパスする任意の数の代替方法)またはLinuxバージョンのインストールのいずれかです。


元の答え

ファイルの権限

これは、おそらくクロスファイルシステムの権限の問題です。あなたcd /mnt/c/Program\ Files/apache-maven-3.3.9/binがその./mvnようにmvnを実行しようとすると、どうなりますか?

ls -altそのディレクトリの出力は何ですか?

ファイルが実行可能として適切にマークされていない場合、パス上の「プログラム」として表示されません。バイナリファイルであり、「linux」形式(ELF)ではない場合、パス実行可能ファイルとしても表示されません。

mvnを直接実行しても機能しない場合(lsの結果を投稿してください)、実行権限を追加してみてください chmod ug+x mvn

間違ったバージョンがインストールされています

Linuxネイティブバージョンがインストールされていることを確認します。cygwinで使用したのと同じバージョンは、ほぼ確実に機能しません。

とのバイナリ互換性を確認する sudo apt-get install elf-binutils には、ファイルmvnで次のコマンドを使用し readelf -a mvn ます。「ELFファイルではありません...」などのエラーが発生した場合は、答えがあります。

この例では、テストシェルスクリプトに実行権限を追加していないことに気づきました。(ステップをリストするのを忘れた場合を除いて)、特定の失敗を完全に説明しています。

概要:

  1. maven binディレクトリー内の実行可能ファイルが、chmodを使用して実行可能ファイルとして適切に設定されていることを確認してください。ls -altの出力を回答に投稿してください。
  2. Linuxバイナリがあることを確認してください。確認するには、utilty readelfを使用してください。
  3. もう一度シェルスクリプトテストを実行しますが、今回は実行可能ファイルにマークを付けます。

更新

パスの問題は、赤いニシンでした。Linux環境のWindows環境と互換性のないバイナリ形式を実行しようとしているだけです。

表面的には、2つの環境(Windowsのcygwinとbash)は多少似たユーザーエクスペリエンスを提供しますが、実装とその結果のバイナリ互換性は大きく異なります。

結論-CygwinとLinuxのバイナリ形式には互換性がありません。Windowsのbashから実行するには、Linuxネイティブバージョンをインストールする必要があります。Windows環境のbash内のソースからコンパイルすることもできます。しかし、環境の「初期」の性質のため、依存関係の追跡について心配しました。

2つの環境の簡単な説明:

Cygwinは、実質的にはPOSIX以外のシステムでは利用できないシステムコール用のAPIを提供する変換層であり、Windows環境のLinuxで実行するように記述された多くのプログラムをコンパイルできます。ただし、まだ「Windows」環境で実行されています。このバイナリは、Windowsのcygwin環境でのみ動作します。この変換層と関連ライブラリにより、Linux APIに対して記述されたソースコードをcygwin環境でコンパイルし、Windowsで実行できます。この方法でビルドされたバイナリは、LinuxまたはWindowsでネイティブに実行されません。cygwin環境でのみ。

canonicalが提供するウィンドウのbash環境は、cygwinとは大きく異なります。これは、実際にはlinuxのように見えるプログラムの環境を実際に「再作成」します。つまり、バイナリに変更を加えることなく、標準ライブラリがPOSIXシステムコールとともに利用できます。多くの場合、ubuntuに対してビルドされたバイナリは、Windows環境のbashに直接コピーして問題なく実行できます。

Windowsのbashで有効な実行可能ファイルとして認識されるには、ネイティブのLinuxバイナリ形式か、それを解釈するプログラムでマークされたスクリプトファイル(bashスクリプトの場合は#!/ bin / bash)である必要があります。ネイティブLinuxバイナリは、Linuxライブラリとシステムコールに対してビルドされます。Bashは、実行可能許可ビットをチェックすることと、バイナリファイル形式が互換性があることをチェックすること(「マジックナンバー」チェック)の両方によって、何かが有効な実行可能ファイルであることを確認します。バイナリファイルでELF形式でない場合は、パス展開によってシェルに公開されません。

この問題を明確にするのをより困難にするために、彼らはネイティブbashアプリケーションをbash on windowsから起動する部分的な機能を追加しましたが、bashパス拡張バイナリファイル形式チェックに対処しなかった-または彼らはそうしました、それはバグです。

2番目の編集:

あなたの質問の明確化:

直接(./mvn)起動すると、Bash評価をバイパスし、実行するだけです。Windows環境のbashは、Windowsネイティブ実行可能ファイルを起動するのに十分なほどスマートです。cygwinバイナリがbashから適切に起動するとは思わないが、間違っている可能性がある-現時点ではドキュメントが乏しく、テスト環境に現在アクセスできない。

「パス」サポートと同等の機能を提供する回避策:

Mavenのインストールに完全に満足している場合(他の互換性の問題はなく、すべてが「機能する」)、パス上にそれを置くことが重要な場合は、同等の機能を提供する簡単な回避策を使用できます。

.bashrcファイルに、次のエイリアスを追加します。

alias mvn='/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn'

Windows環境のbash内の任意の場所からアクセスしたい、そのディレクトリ内の他の実行可能ファイルについて、同等のものを繰り返します。

bashを再起動するか、ファイルをソースすると、mvn任意のディレクトリから動作します(bin dir内から直接実行するステートメントに基づいて、。/ mvnが機能していました)。


ファイルは実行可能ですが、ELFファイルではありません...しかし、一体何ですか?Cygwinがこのバイナリを実行できるのにBUWはできないのはなぜですか?そして、ディレクトリに移動した場合でも、。/ mvnを実行できます。実行され、パス上にありますが、BUWはそれを承認しません。ELFファイルの存在/非存在がPATHの動作と関係があるのはなぜですか?
Cody S

先ほど言ったように、CygwinはWindows環境であり、Windowsアプリしか実行できません。BashはLinux環境であり、Linuxネイティブアプリのみを実行できます。それらは別々の環境です。ネイティブのUbuntuインストールからいくつかのアプリをコピーしてbashで呼び出してみてください。問題なく実行されます。ただし、bashでWindowsアプリを実行することはできません。実際のbashで実行する場合は、Linux用のmavenを再度セットアップする必要があります
phuclv

Mavenを別のLinuxマシンからコピーしたにもかかわらず、「ELFファイルではありません」という結果も表示されます。mvnを実行すると、応答がありません。JavaプロセスがWindowsタスクマネージャーに表示され、bashで「Kill​​ed」応答を取得するために最終的にkillする必要があります。「/ mnt / c / Program Files(x86)/ Maven / bin」からmavenを実行しようとすると、まったく同じ動作になります。何か案は?
パパディ2016

0

echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path(お好きな名前を)試してください

source ~/.bash_path

echo $PATH 何か変化がないか確認する

chmod +x ~/pathTest/pathTestScript.sh 直接実行するには、ファイルに実行権を追加する必要があります。

pathTestScript.sh

これが機能する場合は、行source ~/.bash_pathを追加します~/.bashrc

あなたは呼び出すことができます/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvnか?


私はによって呼び出すことができ、PATH /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvnにを追加しましたbinが、それでもwhich mvn正常に実行できません。これは私には意味がありません。
Cody S

変。回答を検索しているときに良くなるようにするには、Linuxエイリアスを試して、呼び出しを少し単純にすることができます。linfo.org/alias.html
Roden Luo

0

Ubuntuに基づいているため、実際のP​​ATHファイルは " /etc/environment"です(ファイルタイプは表示されません)。

$ nano /etc/environmentファイルを編集する最も簡単な方法です。次のようなものが表示されます。

PATH = "/ usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ sbin:/ bin:/ usr / games:/ usr / local / games"

最後の引用符の前、最後のディレクトリの後ろに、前のディレクトリ:と区切るために追加の(コロン)を付けて、選択したディレクトリを追加できます。

最後に、ファイル " /etc/environment" を実行する必要があります。これは、次のように入力して実行できます。

$ . /etc/environment

これらを実行し$ sudo -s、で確認しました$ env。envコマンドはすぐに変更を表示し、選択した変更を行った後は再起動で終了するはずだと確信しています。


シナリオを使用して質問を編集しましたが、〜/ pathTestを/etc/environmentファイルに追加すると、ファイルがパスに追加されませんでした。あなたの解決策は機能しません。
Cody S

〜を使用しないでください。フルパスを使用してください。適切なディレクトリにpwdと入力して取得します
djsmiley2kStaysInside

私はしませんでした。それでも動作しません。申し訳ありませんが、それが誤解を招く可能性があることはわかりますが、いいえ、環境パスで〜を使用していません。常に展開します
Cody S

機能を再インストールしたところ、答えが不十分で、特定のセッションのパスが一時的に変更されただけです。もう少し調べています。コーディさん、ごめんなさい。
Chris Bernard
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.