`]`のトークン識別子は何ですか?


9

バッシュマニュアルは言う:

[フォームを使用する場合、コマンドの最後の引数は]でなければなりません。

$ type [
[ is a shell builtin
$ type ]
bash: type: ]: not found

つまり]、予約語でも、演算子でも、組み込みコマンドでもありません。

トークンとして、トークン識別子は]何ですか?WORDまたはNAME?


4
実際に[は、(また)自立コマンドです:-rwxr-xr-x 1 root root 39552 Dec 3 18:14 / usr / bin / [可能性がありますが、例えばkill。一部のシステムでは、testコマンドはシンボリックリンク[またはその逆です。AFAIK、]それ自体は何も意味しませんが、「閉じる」ことは受け入れられます[-しかし、それは「美的」な理由のためです。
Baard Kopperud 2016年

5
シェル言語は過去46年間にわたって層ごとに成長しており、内部の一貫性は決して優先事項ではありませんでした。理論的な形式言語のフレームワークのいずれかにそれを強制的に適合させようとすると、悪い時間になります。
zwol 2016年

以来[(も)自己完結型のコマンドで、それは通常、マンページを持って...だから試すman [および/またはman test[test同じコマンドでもよいです)。
Baard Kopperud 2016年

こだわりのお試し]単一または二重引用符で、あなたはそれが違いはありませんが表示されます。それは単なる文字列です。
ワイルドカード2016年

回答:


21

]補完[、それはの閉鎖の兆候である[コマンド。

manページが指摘し、これは実際に引数です[が、[エンディングとして、特にそれを処理するために起こります。

次の例のように、いくつかの他のコマンド閉鎖パターンでそれに似ていることができます;の中でfind .. exec


ありがとう。トークンのタイプ/識別子は]何ですか?
Tim

8
@Tim ]は、このコンテキストの他の通常の文字と(コマンドの引数として)違いはありません。testコマンド特別扱い、それを、しかし、そのコマンドまでです。
muru 2016年

6
これは単なる文字列であり[、最後の引数がと完全に等しくない場合はエラーが発生し]ます。
chepner 2016年

19

bashは、アルファベット文字と異なる([または]それ自体の)文字を扱いません。

この場合、bashは「単語」を見つけ[、その名前のコマンドを探します。ファイルシステムを見ると、おそらく/bin/[(または/usr/bin/[)が実行可能ファイルとして存在していることがわかります。たまたま、bashには組み込みバージョン(効率化のため)も用意されていますが、これは実装の詳細にすぎません。

[(のように、その名前の実行ファイル)コマンドは、あなたがそれに渡す最後のパラメータがあるべきというルールを持っている]か、そうでなければ、エラーがスローされます。これは、見た目が良いのも理由の1つかもしれませんが、誤ってコマンドが切り捨てられるのを防ぐのにも役立ちます。

これらが特別でないという事実が、[orの前後の空白を省略できない理由です]


例外

  • とき[]同じワード内の正しいフォーマットで発生し、例えば[a-z]、それはある特別なバッシュのグロブのルールが適用されます。
  • この[[コマンド特別であり、多くのことを実行[できません(また[[ .. ]]、一部の改行と同様に、内部のパラメーターは異なる方法で処理されます)。対応する]]ものも特殊です。これは、コマンド名にできないシェルの予約語であり、[[キーワードに続く特殊な処理を終了するためです。

1
@JacobKrallそれはのような特殊文字ではない;か、>それだけで組み込みコマンドのようなものです、cd。特に、と入力した場合[x[特別な意味はありません。
Barmar 2016年

2
@JacobKrallすべての組み込みコマンドに当てはまります。[は特殊なコマンドであり、特殊文字ではありません。
Barmar 2016年

@Barmar:十分に公平です。コメントを撤回します。
Jacob Krall 2016年

実際]]はより特別です]。使用する[と、]それらは単なる言葉です。省略する]か、別の単語に置き換えた場合、bashは引き続き実行されます[[、エラーが発生します。ただし[[]]解析時には特別に扱われます。]]他のもので置き換えた場合、bashは構文エラーを報告します。また、]]bash を省略した場合、次の行を解析してを探し続けます]]
kasperd

@kasperdの回答が調整されました。
ams

3

前の2つの答えよりも簡単に言えば、実行するために必要な]文字列です[


1
これはコメントのようです...
wizzwizz4

@ wizzwizz4、コメントでOPからのフォローアップ質問を考えると、私はこの単純さがまさに彼が必要としていたと思います。
ワイルドカード2016年

@ワイルドカード私は実際に同意します。この回答に賛成したいという誘惑がありましたが、質が低いと思いました。(ただし、反対投票はしませんでした!)マークアップを改善するために編集します。
wizzwizz4 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.