$ PATH環境変数の割合


16

私の$ 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シェル互換モードでは、ワンドが見つかりません。

$ wand
sh: 2: wand: not found

問題は、これらのパスの%記号のようです。この符号はURLエンコードによって追加されているため、有効なファイル名ではない場合でも、ディレクトリ名に「GNU / Linux」という名前を使用できます。shで名前を機能させること、またはshコマンドをbashとして機能させることは可能ですか?つまり、/ bashにシンボリックリンクされる/ bin / shコマンドで呼び出された場合でも、bashを同じように動作させます。


いい質問ですね。それは「%」文字はから$ PATHで正しく動作していないようだsh(それがで大丈夫ですbashzshが)。直接で実行可能な作品を呼び出しますsh。本当に奇妙です。
Rmano 14

2 %%を使用するとどうなりますか?
mikeserv 14

または%をエスケープしますか?
mdpc 14

回答:


15

それは、Bourneシェルではなく、Bourneシェルをbashエミュレートするものであり、Almquistシェルです。おそらく、Debian Almquistシェル(元のAlmquistシェルに基づいたDebianのBSDのsh自体によるLinuxフォーク)です。

Almquistシェル(元のバージョンと最新バージョン)では、に固有の追加機能に%使用され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-GNU2fLinux

それを回避する方法はありません。ashにエスケープメカニズムがあり、これを%特別に扱わない場合でも、他のシェルやの$PATHような他のものでは動作しませんexecvp()

%から文字を削除する必要があるため、$PATHディレクトリの名前を変更するか、シンボリックリンクを追加します。

または、に使用しないashでください/bin/sh。それを行わない他の軽量POSIXシェル実装には、yashおよびが含まれmkshます。


この答えは説明を提供しますが、解決策を提供するものではありません。%を保持する互換性のある方法はありますか。
user877329

@ user877329、ここには本当の解決策はありません。編集をご覧ください。
ステファンシャゼル

3
言い換えれば、Debian shはPOSIX標準に違反しています。別のものを持つことのポイントは、sh互換性のないシェル拡張をつまずかないようにする必要があることです(/bin/sh最近はログインシェルとして誰も使用していないと思います)、私はバグだと思います。
celtschk 14

1
使用のポイントものの合意@celtschk、ashのために/ binに/ shを使用してのパフォーマンスの低下を避けるために、よりあるbashので、使用しyashたりmksh(あるいはposhあなたがすべての拡張を除外したい場合は)まだ使用してより良いオプションですbash。また、人はそれをコーナーケースと考えるかもしれません。通常%、パスコンポーネントには誰もいません。ほとんどのシェルには、POSIXに準拠していないコーナーケースがあります。
ステファンシャゼル14

1
@mtmiller、それはポータブルファイル名文字セット(PFCS)の意味を読み取る方法ではありません。POSIXはプログラミングAPIを指定しますが、ファイルシステムの実装は指定しません。PFCSは、POSIXがファイルシステム、現在のロケールに関係なく機能する最小の保証ですが、ファイルシステムでサポートされ、現在のロケールで有効な場合、ツールがファイル名の文字を受け入れない言い訳にはなりません。たとえば、POSIXでは[、その文字がPFCSにない場合でもコマンドが必要であることに注意してください。
ステファンシャゼル14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.