単一の括弧[
とtest
コマンドはbashシェルに組み込まれています。
角[
かっことtest
コマンドが同じ機能を持っている場合、なぜ2つの別々のコマンドがありますか?
答え1
[
そしてtest
同じコマンドです。ただ、[
最後のパラメータになると予想してください]
(そうでなければ無視されます)。
[
コマンドはtest
通常同じバイナリで実装されます。 Bourneのようなほとんどのシェルfish
では。 Cシェルやその派生物はそうではありません。 Cシェルには、通常/ utilsで実行されるいくつかのタスクを実行するための特別な構造があります。[
test
rc
test
[
このtest
コマンドは、当時新しいBourneシェルと共に1970年代後半のUnix V7に登場しました。以前のバージョンにはコマンドがなく、対応するtest
シェルは構成されていませんでしたif
。しかし、一つあります。独立if
コマンド同じテストのいくつかを実行しtest
、結果に応じてコマンドを実行できます。
Bourneシェルにはいくつかの制御ステートメント(if
// )が導入されているため、while
これらのステートメントの条件付き部分で使用してさまざまなテストを実行できるコマンドを追加するために導入されました。until
test
V7にはコマンドはありませんが、[
いくつかのコマンドを見つけることができます。トリムしない コードをコメントアウトしてください。そこには組み込まれていますが[
、これは彼らがそれを想像していましたが、sh
おそらく当時はコードを台無しにしないことを決めたかもしれません。
[
test
Bourneシェルに組み込み機能を追加します。1981年システムIIIに入る。
それ以降のすべてのBourne様シェルには/組み込み機能がbash
あります[
が、Almquistシェルには最初から/組み込み機能がありましたが(実際にマージ)、完全に無効になるまで初期BSDで元々無効になりました(コンパイルされていません)。やや遅れていました。test
[
test
expr
[
とtest
両方標準 POSIX コマンド。組み込む必要はありませんが、などで実行可能である必要があるため、スタンドアロンの実行可能env
ファイルとして使用できますfind -exec
。execvp()
スタンドアロンユーティリティを提供するシステムもありますが、いずれも提供されませtest
ん[
。これは、以下をより頻繁に見る理由を説明します。
find . -exec test -f {} ';'
(GNUと同じfind
)-xtype f
、比較:
find . -exec [ -f {} ] ';'
[
スタンドアロンユーティリティを提供しないシステムでは、この操作は失敗します。
[
test
との間の別の逸話的な違いtest <any-string>
(と同じ)は、空ではない、または返すことができないバージョンまたはその使用法[ <any-string> ]
の有効なテストです。ただし、これは有効なテストではないため、GNUスタンドアロンユーティリティは一般的なエラーメッセージの代わりにバージョンと使用情報を別々に受け入れて返しますが、GNUはそうではありません(参照)<any-string>
test --version
test --help
test
[ --version
[
--version
--help
missing ‘]’
test
2003年に適用(誤解を招くコメント2005年に復元)).
$ '/usr/bin/[' --version
[ (GNU coreutils) 8.30
[...]
$ /usr/bin/test --version && echo "--version is non-empty"
--version is non-empty
$ '/usr/bin/[' --something-else
/usr/bin/[: missing ‘]’