角括弧実行可能ファイルの目的は何ですか


回答:


33

ほとんどの場合、[は組み込みのシェルで、と同等testです。ただし、のようにtest、スタンドアロンの実行可能ファイルとしても存在し/bin/[ます。見たとおりです。これをテストするにはtype -a [(Arch Linuxシステムでを実行bash):

$ type -a [
[ is a shell builtin
[ is /bin/[

したがって、私のシステムには[、シェルの組み込みコマンドと実行可能ファイルの2つがあり/binます。実行可能ファイルのドキュメントはman test次のとおりです。

TEST(1)                          User Commands                         TEST(1)

NAME
       test - check file types and compare values

SYNOPSIS
       test EXPRESSION
       test

       [ EXPRESSION ]
       [ ]
       [ OPTION

DESCRIPTION
       Exit with the status determined by EXPRESSION.

[ ... ]

あなたはmanページの抜粋で見ることができるように上記引用し、testかつ[等価です。/bin/[そして/bin/testコマンドがされているPOSIXによって指定されたあなたは多くのシェルでも組み込みコマンドとしてそれらを提供するという事実にもかかわらず、それらを見つける理由です。それらが存在することで、次のような構造が保証されます。

[ "$var" -gt 10 ]  && echo yes

それらを実行するシェルに[組み込み機能がない場合でも機能します。例えば、中tcsh

> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ]  && echo yes
yes

5
@AlexandruIrimieaどういう意味ですか?[組み込みのないシェルは、作成者が追加しないことにしたシェルにすぎません。たとえば、組み込みtcsh 機能はありません[
テルドン

7
@AlexandruIrimiea彼らは「カスタム」シェルではありません。それはそれはちょうどだbashと同様の仕事をするように設計されている多くのプログラム(シェル)のうちの1つにすぎません。Bashは最も人気のあるものの1つですが、多くのシステムには異なるデフォルトシェルが付属しています。良く知られているもののいくつかはshbashzshdashkshtcshcshfish。あなたのシステムで利用可能なものcat /etc/shellsここに部分的なリストを見ることができます
テルドン

1
@JörgWMittag本当に?Ubuntuのshは知っているdashが、レスキューシステムは/bin/shbusybox ではなく使用していると思った。本気ですか?
テルドン

2
しかし、initramfsの中busyboxのがこのことからも明らかなように、確かにそこにある質問
Sergiy Kolodyazhnyy

1
@AlexandruIrimiea、どのコマンドが組み込まれている必要あるか、どのコマンドが組み込まれているかどうかについては、この投稿を参照してください。
ワイルドカード

12

これは、シェルスクリプトでの条件テストに使用されます。このプログラムの別の名前はtest次のとおりです。

if [ 1 -lt 2 ]; then ...

それはシェル文法のように見えますが、そうではありません。通常[はシェル組み込みですが、おそらくフォールバックとして外部コマンドとして存在します。

のブロック「条件式」を参照してくださいman bash



9

[と同じコマンドtestです。一部の* nixシステムでは、一方は他方への単なるリンクです。たとえば、次を実行する場合:

strings /usr/bin/test 
strings /usr/bin/[

同じ出力が表示されます。

ほとんどのsh-shells / posix-shellsには​​組み込みコマンド[testコマンドが含まれています。同じことはにも当てはまりますecho/bin/echoほとんどのシェルにはコマンドと組み込みの両方があります。たとえば、echo異なるシステムでは同じように機能しないと感じることがあるのはそのためです。

testまたは[唯一の終了コードを返す0かを1。テストが成功した場合、終了コードは0です。

# you can use [ command but last argument must be ] 
# = inside joke for programmers 
# or use test command. Args are same, but last arg can't be ] :)
# so you can't write 
#    [-f file.txt] because [-f is not command and last argument is not ]
# after [ have to be delimiter as after every commands
[ -f file.txt ] && echo "file exists" || echo "file does not exist"
test -f file.txt && echo "file exists" || echo "file does not exist"
[ 1 -gt 2 ] && echo yes || echo no
test 1 -gt 2  && echo yes || echo no
# use external command, not builtin
/usr/bin/[ 1 -gt 2 ] && echo yes || echo no

また、使用することができます[if

if [ -f file.txt ] ; then
  echo "file exists" 
else 
  echo "file does not exist"
fi
# is the same as
if test -f file.txt  ; then
  echo "file exists" 
else 
  echo "file does not exist"
fi

ただしif、すべてのコマンドで使用できifます。終了コードのテスト用です。例えば:

cp x y 2>/dev/null && echo cp x y OK ||  echo cp x y not OK

または、次を使用if

if cp x y 2>/dev/null ; then
   echo cp x y OK
else
   echo cp x y not OK
fi

test変数に保存された終了コードをテストするコマンドのみを使用して、同じ結果を取得できますstat

cp x y 2>/dev/null 
stat=$?
if test "$stat" = 0 ; then
   echo cp x y OK
else
   echo cp x y not OK
fi

[[ ]]また(( ))、テストにand を使用することもできますが、構文はほとんど同じですが、これらは[andと同じではありませんtest

最後に、コマンドが何であるかを調べるには、次を使用できます。

type -a command

ファイルを比較するには、むしろcmp /usr/bin/[ /usr/bin/testハッシュを使用するか、ハッシュを使用する必要sha256sum /usr/bin/[ /usr/bin/testがありstringsます。私のシステム(openSUSE Tumbleweed)では、これらは同じではありません(しかし)。
ホークレイジング

バイトを比較するつもりはありませんでした。一部の* nixでは、バイトレベル=リンクでも同じです。 Posixテスト
-kshji
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.