Anniversary Updateのおかげで、私はWindows 10のUbuntuでBASHを使用できるようになりました。以前は、Cygwinを使用していて、MavenをCygwinにセットアップしていて(完全に機能していました)、MavenをインストールしてからPATH
環境変数(~/.bashrc
内)
まあ、私はBUWを使用して同じことをやろうとしているのですが、私の知る限り、PATH
変数は無視されます(Maven binディレクトリをPATH
に追加して実行します) which mvn
は空白を返します)。私が見逃しているトリックはありますか、またはBUWでPATH
を別の方法で設定する必要がありますか?
具体的に申し上げます。 「???」で何をする必要がありますかパスに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!'
私の実際の最終目標を明確にしたいと思います。私のシステムの通常の場所にJDKとApache Mavenがインストールされています。 Cygwinでこれらの両方を完全に正常に動作させました。 BUWがリリースされたので、代わりにそれらを使用したいのですが、PATHに加えた変更が何の効果もないように見えるため、それらの環境をセットアップする方法がわかりません。
さて、私は野生のガチョウの追跡をしているのではないかと心配しています。 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
を実行すると、空白になり、mvn
を呼び出すと、apt-get
を使用してインストールするようにリダイレクトされます。
したがって、問題はPATHが更新されていないことではありません...無視されているだけです。 PATHに注意を払う方法はありますか?そうでない場合、これはLinux(IMO)のかなり弱いバージョンです
それは数回起動されました、そして、はい、私の平手打ちの例はファイルを実行可能としてマークするのを忘れていました。私の実際のシナリオ(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
問題の実行可能ファイルは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ファイルではありません...」などのエラーが発生した場合は、答えがあります。
この例では、テストシェルスクリプトに実行権限を追加していないことに気づきました。(ステップをリストするのを忘れた場合を除いて)、特定の失敗を完全に説明しています。
パスの問題は、赤いニシンでした。 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 on windowsからネイティブWindowsアプリケーションを起動する部分的な機能を追加しましたが、bashパス拡張バイナリファイル形式のチェックに対処していなかったか、またはバグでした。
直接(./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は機能していました)。
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
で呼び出すことはできますか?
Ubuntuに基づいているため、実際のPATHファイルは "/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コマンドはすぐに変更を表示し、選択した変更を行った後は再起動で終了するはずです。