シェルメタキャラクターとしての^の使用


19

今日私は含まれている小さなスクリプトを書きました

grep -q ^local0 /etc/syslog.conf

レビュー中、同僚は、Bourneシェルの「パイプ」を意味する^local0ため、引用することを提案し^ました。この主張に驚いて、私はこれに言及した参考文献を追跡しようとしました。インターネット上でこれが問題だと示唆するものはありませんでした。

ただし、bshAIX 7の(Bourneシェルであると主張する)の実装には、実際に次の動作があることがわかります。

> bsh
$ ls ^ wc
      23      23     183
$ ls | wc
      23      23     183

私が試した他の「Bourneシェル」実装は、この方法で動作し^ませんでした(つまり、シェルメタキャラクターとはみなされません)。shCentOS(実際にはbash)とshFreeBSD(bashではない)で試しました。他に試すシステムはあまりありません。

この動作は予想されますか?どのシェル^がパイプメタキャラクターと見なされますか?


1
私はそれ^がzshの否定文字であり、正規表現の空間でもあることを知っています。別のコメントとして、シェル間での移植性のために、grep式で単一引用符を使用することをお勧めします。
mkc

Bourneシェルには、現代のシェルコードなどで回避策が見られる奇妙な動作がたくさんありました[ x"$foo" = x"bar" ]
ヨルダン

bshボーンシェルではありません。この名前は、AIX上のBourne Shellのみで悪用されます。bsh1984年にUNOS(最初のUNIXクローン)のH.Berhold AGで紹介されたシェルです。AIXは、1984年に存在しなかったことを注意
シリー

回答:


21

トンプソンシェルからさかのぼる日付の^同義語としての文字。それらはUnix v4で同時に導入され、manページで一緒に言及されていますSven Mascheckは、「初期の大文字のみの端末での利便性のために、おそらく(導入された)」タイピングが「やや苦痛」だったと述べています。|^|

Thompsonシェルは長い間使用されていませんが、その後継であるBourneシェルは同じ構文を保持していました(マニュアルページでのみ言及されている場合でも|)。

ash、bash、kshなどの後継シェル|は、パイプ文字としてのみ理解します。長い間、Bourneシェルのオープンソースリリースがなかったため、オープンソースのUNIXバリアントで実際のBourneシェルを見つけることはできません。(OpenSolarisには含まれていたと思いますが、それまでに新しい実装によって長い間廃止されていたため、他の場所では採用されませんでした)。

シングルUnixの仕様では言及していない^効果的にPOSIXシェルはそれがliterally¹解釈すべきであることを意味し、特殊文字、など。Bourneシェルの完全にPOSIXに準拠したバリアント(独立した実装のみ)はこれまでになかったと思います。

^オプションextendedglobが有効になっている場合、zshでは特別ですが、sh互換モードではありません。デフォルトモードでは、多くの点でPOSIXから逸脱しています。

^わかりやすくするため、とにかく正規表現で引用することをお勧めします。スクリプト内の正規表現は、その中に含まれる文字に関係なく引用します。

¹ ワイルドカードパターンのブラケット式の最初の文字を除きます。ここ!では標準の否定文字ですが、実装も^同じように解釈される場合があります。


おかげで、2003年のTUHSスレッド全体が啓発されました。
グレッグヒューギル

完全にするために、あなたはそれを言及したいこと^で特別であるfish、それはリダイレクト演算子、のWHERE rc/ esそれはだ連結演算子には、コマンドラインの最初の文字だ時に履歴展開は、csh / tcshの/ bashの/ zshでは、または。
ステファンシャゼル16


3

はい、OpenSolarisにはBourne Shellソースが含まれていますが、そのソースは移植できません。

Aは維持され、ボーンシェルソースの移植性の高いバージョンを見つけることができ、ここschily-*.tar.bz2アーカイブ。

ソースの関連部分は次のcmd.cとおりです。

/* 
* ^ is a relic from the days of UPPER CASE ONLY tty model 33s 
*/ 
if ((t = item(TRUE)) != 0 && (wdval == '^' || wdval == '|')) 

ご覧のとおり、これは特定のシェル(Thompsonシェルなど)に関連するものではなく、1970年代にはまだ大文字のみのターミナルが存在していたという事実に関連しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.