web-dev-qa-db-ja.com

端末コマンドの「 '」(アポストロフィ)の意味

いくつかの奇妙な理由で、次のように、識別子のワード区切り文字として「 '」を試しました。

$ export foo'bar=1
> 
> ^C
$ 

結果は上記のようになります。id estプロンプトが「>」に変わり、システムは明らかに私の側でさらに情報を待ちます。ご覧の通り、私はctrl-Cで逃げなければなりませんでした。次のような他のコマンドを使用しても同じことが起こります

$ ls foo'bar
$ mkdir foo'bar

私はこのすべての意味に興味があります、それはターミナルコマンドで特別な意味 "" "が持っているものです(実際、id内でも分解されるという特別な意味があります)。

追加:余談ですが、UnixライクなシステムとWindowsシステムの両方で、ファイル名とフォルダー名に含まれる特殊文字または無効な文字のセットを知りたい(安全なものの共通サブセットを取得するため) (特に、すべての非ASCIIについてはどうですか?)。

ありがとう、デニス

10
denis 63

'文字は、シェルコマンドで使用される場合は常に非常に強力な文字です。基本的に、 '(アポストロフィマーク)は、あらゆる種類の変換または変更を無効にします。 'マークで囲まれたものはすべて、単一のエンティティ、つまり単一のパラメーターと見なされます。絶対に種類の置換や拡張は行われません。

例:

 $ echo '$HOME'

出力で文字列$HOME自体を生成し、ホームディレクトリへのパスを出力しません。単一引用符は、あらゆる種類の展開を防ぐため、置換と単純は、それ自体が単純なパラメーターとして存在するものを考慮します。

アポストロフィをそのまま使用する場合は、エスケープする必要があります。

 $ mkdir foo\'bar

 $ cd foo\'bar

エスケープされていない場合、最初の例で発生したように、ペアが閉じられるまで待機します。

したがって、修正すると、コマンドは次のようになります。

 $ export foo\'bar=1

注: Milan Todorovicが気づいたように、この場合はアポストロフィを使用できないため、これは無効になります。

14
Frantique

文字'は特殊文字です。これを使用して、変更されないコマンドラインエントリの一部をマークします(たとえば、ワイルドカードの代替はありません)。例えば:

$ ls 'bla*'
ls: cannot access bla*: No such file or directory

これは、lsの引数がbla*であり、blaで始まるものすべてではないことを意味します。

>文字を取得する理由は、開くのに1つの'を使用し、変更されない部分を閉じるのに1つの'を使用する必要があるためです。

フォルダー名に'を使用する場合は、\'のようにエスケープする必要があります。したがって、foo'barという名前のフォルダーをリストする場合は、ls foo\'barと入力する必要があります。

ああ、環境変数名に'を使用できるかどうかわかりません。 export foo\'bar=1は使用できないと思いますが、

お役に立てれば。

7
Milan Todorovic