web-dev-qa-db-ja.com

LinuxのWindowsサブシステム(WSL)PATHでWindows実行可能ファイルへのシンボリックリンクを作成できますか?

Android StudioとJDK 8がWindowsにインストールされていますが、WSLでJDK cliを使用できません。Javaまたはjavacと入力すると、コマンドが見つかりません。提案 here を実行したところ、Java.exejavac.exeを入力してWSLからコマンドにアクセスできるようになりましたが、 .exe拡張子を指定します。私の考えは、実行可能ファイルを指すシンボリックリンクを追加することですが、実行可能ファイルへのパス(/mnt/c/...)を指定する必要はありません。それで、PATH内の場所を指すシンボリックリンクを作成できますか?これが意味をなさない場合は、これを試してみました:

Sudo ln -s -t Java.exe Java

"failed to access 'Java.exe': No such file or directory"を取得しました。しかし、これはまさに私が達成したいものです。PATHには既に実行可能ファイルがあるため、実行可能ファイルへの実際のパスを指定せずに、PATH内の実行可能ファイルへのシンボリックリンク。私が狂っていて、これがばかげている/不可能/不必要である場合、あなたはそれを答えとして言うことができ、私はそれを受け入れます! :-D

4
Uche Ozoemena

実行可能ファイルの前にパスを付ける必要があります。または、Linux PATH環境変数を変更して、Windowsパス(/mnt/c/で始まる)を追加することもできます。

From: WindowsとのLinux相互運用性のためのWindowsサブシステム

WSLからのWindowsバイナリの呼び出し

LinuxのWindowsサブシステムは、WSLコマンドラインから直接Windowsバイナリを呼び出すことができます。この方法で実行されるアプリケーションには、次のプロパティがあります。

  1. 以下で説明するシナリオを除き、作業ディレクトリをWSLコマンドプロンプトとして保持します。
  2. Bash.exeプロセスと同じ権限を持っている。
  3. アクティブなWindowsユーザーとして実行します。
  4. CMDプロンプトから直接実行されたかのように、Windowsタスクマネージャーに表示されます。

例:

$ /mnt/c/Windows/System32/notepad.exe

WSLでは、これらの実行可能ファイルはネイティブLinux実行可能ファイルと同様に処理されます。これは、Linuxパスにディレクトリを追加し、コマンド間のパイプが期待どおりに機能することを意味します。例:

$ export PATH=$PATH:/mnt/c/Windows/System32
$ notepad.exe
$ ipconfig.exe | grep IPv4 | cut -d: -f2
$ ls -la | findstr.exe foo.txt
$ cmd.exe /c dir

Windowsバイナリは、ファイル拡張子を含み、ファイルの大文字と小文字を一致させ、実行可能でなければなりません。バッチスクリプトやdirなどのコマンドを含む非実行可能ファイルは、/mnt/c/Windows/System32/cmd.exe /Cコマンドで実行できます。

例:

$ /mnt/c/Windows/System32/cmd.exe /C dir
$ /mnt/c/Windows/System32/PING.EXE www.Microsoft.com

パラメータは変更されずにWindowsバイナリに渡されます。

Linuxでも、シンボリックリンクにはパスが含まれています。次のコマンドを例にとります。

$ ls -la /bin | grep ^l
(...SNIP...)
lrwxrwxrwx  1 root root      20 Jun 27 09:49 systemd -> /lib/systemd

systemd/lib/systemd/systemdにリンクされています。だからあなたのシンボリックリンク:

Sudo ln -s -t Java.exe Java

私は(私はリンクの専門家ではないので)次のようなものになる必要があると思います:

Sudo ln -s -t /mnt/c/Windows/Path/To/Java.exe Java

シンボリックリンクの代わりにaliasを使用

シンボリックリンクではなく、~/.bashrcファイルにエイリアスを作成します。

alias Java='/mnt/c/WindowsPathTo/Java.exe'

次に、Javaと入力すると、mumbo-jumboが入力されます。渡されたパラメータはすべて尊重されます。

4

私はFish-Shellを使用していますが、エイリアスリンクとシンボリックリンクの両方が実際には機能しないことがわかりました。魚の問題かどうかはわかりませんが、Windowsの奇妙なパスの命名が問題だと思います。

私の解決策は、fish.config(.bashrcに相当)に関数を追加することでした。

function npp
    "/mnt/c/Program Files (x86)/Notepad++/notepad++.exe" $argv
end

(魚の$ argvはbashの$ *と同等です)

それから私はNotepad ++を呼び出すことができます:npp test.txt

0
Karsten