web-dev-qa-db-ja.com

$ PATH環境変数のパーセント

私の$ 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が同じように動作するようにします。

16
user877329

これはBourneShell、またはBourneShellをエミュレートするbashではなく、Almquist Shellです。あなたの場合は、おそらくDebian Almquist Shell(元のAlmquist Shellに基づくBSDのsh自体のDebianによるLinuxフォーク)です。

Almquist Shell(元のバージョンと最新バージョン)では、PATHに固有の追加機能のために_%_がashで使用されます。ドキュメントからの引用:

パス検索

コマンドを見つけるとき、シェルは最初にその名前のシェル関数があるかどうかを確認します。次に、PATHに_%builtin_のエントリが含まれていない場合は、その名前の組み込みコマンドを探します。最後に、PATHの各エントリを順番に検索してコマンドを探します。

PATH変数の値は、コロンで区切られた一連のエントリである必要があります。各エントリは、ディレクトリ名、またはディレクトリ名とそれに続くパーセント記号で始まるフラグで構成されます。現在のディレクトリは、空のディレクトリ名で示す必要があります。パーセント記号が存在しない場合、エントリにより、シェルは指定されたディレクトリでコマンドを検索します。フラグが_%builtin_の場合、シェル組み込みコマンドのリストが検索されます。フラグが_%func_の場合、ディレクトリは、シェルへの入力として読み取られるファイルを検索します。このファイルは、検索対象のコマンドの名前が名前である関数を定義する必要があります。

スラッシュを含むコマンド名は、上記の検索を実行せずに単純に実行されます。

kshzshのような他のシェルには、同様の関数の自動読み込みメカニズムがありますが、それらは異なる変数(_$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が含まれます。

15