web-dev-qa-db-ja.com

UNIXで$ PATHのコロン(:)をエスケープする方法は?

アプリケーションの$PATH環境変数を解析する必要があります。そのため、$PATHでどのエスケープ文字が有効になるのか疑問に思いました。 /bin:dというテストディレクトリを作成し、その中にfunnyというテストスクリプトを作成しました。絶対パスで呼び出すと実行されます。 :$PATHをエスケープする方法がわかりません。コロンを\でエスケープし、シングル'とダブル"の引用符で囲んでみました。 。しかし、常にwhich funnyを実行すると、それが見つかりません。 CentOS6を実行しています。

38
Gellweiler

これは、POSIX標準では不可能です。これは特定のシェルの関数ではありません。PATH処理はCライブラリのexecvp関数内で行われます。いかなる種類の引用についても規定はありません。

これが、特定の文字(「ポータブルファイル名の文字セット」に含まれていないもの-例としてコロンが具体的に呼び出されているもの)を含めることを強くお勧めする理由です。

から SUSv7

このコンテキストでは<colon>は区切り文字であるため、PATHで使用される可能性のあるディレクトリ名には<colon>文字を含めないでください。

GLIBC execvpのソース も参照してください。 PATHコンポーネントの処理にstrchrnul関数とmemcpy関数を使用しており、エスケープ文字をスキップしたりエスケープ解除したりすることはまったくできません。

24
Random832

関数を見てください extract_colon_unit これは不可能だと私には思えます。 :は、パス区切り文字として無条件かつ不可避的に使用されます。

まあ、これは少なくともbashには有効です。他のシェルは異なる場合があります。

9
rodrigo

mountingを試すことができます

mount /bin:d /bind
PATH=/bind
3
Steven Penny