私の$ PATHは次のようになります。
/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux:/home/torbjorr/deployed/typewriter/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mustudio/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mathext/x86_64-GNU%2fLinux:/home/torbjorr/deployed/doxymax/x86_64-GNU%2fLinux:/home/torbjorr/deployed/c2tex/x86_64-GNU%2fLinux:/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand:/home/torbjorr/deployed/x86_64-GNU%2fLinux/spellesc:/home/torbjorr/deployed/x86_64-GNU%2fLinux/projinit:/home/torbjorr/deployed/x86_64-GNU%2fLinux/herbs:/home/torbjorr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Bashでは、にあるワンドを問題なく呼び出すことができます
/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand
お気に入り
$ wand
(i) Mål från "main.cpp" har registrerats
(i) Skapar katalog "__wand_targets_dbg"
(i) Kör g++ "main.cpp" -fpic -L"/home/torbjorr/deployed" -g -Wall -std=c++11 -I"/home/torbjorr/deployed" -o "__wand_targets_dbg/cb-template
ただし、Bourne Shell互換モードでは、ワンドが見つかりません。
$ wand
sh: 2: wand: not found
問題はこれらのパスの%記号にあるようです。この記号はURLエンコードによって追加されているため、有効なファイル名でなくても、ディレクトリ名に「GNU/Linux」という名前を使用できます。名前をshで機能させること、またはshコマンドをbashとして機能させることは可能ですか?つまり、とにかくbashにシンボリックリンクする/ bin/shコマンドで呼び出された場合でも、bashが同じように動作するようにします。
これはBourneShell、またはBourneShellをエミュレートするbash
ではなく、Almquist Shellです。あなたの場合は、おそらくDebian Almquist Shell(元のAlmquist Shellに基づくBSDのsh自体のDebianによるLinuxフォーク)です。
Almquist Shell(元のバージョンと最新バージョン)では、PATH
に固有の追加機能のために_%
_がash
で使用されます。ドキュメントからの引用:
パス検索
コマンドを見つけるとき、シェルは最初にその名前のシェル関数があるかどうかを確認します。次に、PATHに_
%builtin
_のエントリが含まれていない場合は、その名前の組み込みコマンドを探します。最後に、PATHの各エントリを順番に検索してコマンドを探します。PATH変数の値は、コロンで区切られた一連のエントリである必要があります。各エントリは、ディレクトリ名、またはディレクトリ名とそれに続くパーセント記号で始まるフラグで構成されます。現在のディレクトリは、空のディレクトリ名で示す必要があります。パーセント記号が存在しない場合、エントリにより、シェルは指定されたディレクトリでコマンドを検索します。フラグが_
%builtin
_の場合、シェル組み込みコマンドのリストが検索されます。フラグが_%func
_の場合、ディレクトリは、シェルへの入力として読み取られるファイルを検索します。このファイルは、検索対象のコマンドの名前が名前である関数を定義する必要があります。スラッシュを含むコマンド名は、上記の検索を実行せずに単純に実行されます。
ksh
やzsh
のような他のシェルには、同様の関数の自動読み込みメカニズムがありますが、それらは異なる変数(_$FPATH
_)を使用しますが、どの関数または実行可能ファイルを使用するかを定義することはできません優先順位。
あなたの場合、_/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux
_は、_/home/torbjorr/deployed/vector/x86_64-GNU
_フラグが付いた_2fLinux
_ディレクトリとして解釈されます。そのフラグは不明であるため無視されます。
それを回避する方法はありません。 ashにエスケープメカニズムがあり、この_%
_が特別に処理されない場合でも、他のシェルやexecvp()
のような_$PATH
_を検索する他のものでは機能しません。
_%
_から_$PATH
_文字を削除する必要があるため、ディレクトリの名前を変更するか、シンボリックリンクを追加します。
または、_/bin/sh
_にash
を使用しないでください。それを行わない他の軽量POSIXシェル実装には、 yash
およびmksh
が含まれます。