web-dev-qa-db-ja.com

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

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!'

編集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を実行すると、空白になり、mvnを呼び出すと、apt-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
8
Cody S

更新の概要

問題の実行可能ファイルは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 on windowsからネイティブ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は機能していました)。

6
Argonauts

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で呼び出すことはできますか?

0
Roden Luo

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コマンドはすぐに変更を表示し、選択した変更を行った後は再起動で終了するはずです。

0
Chris Bernard