대괄호 실행 파일의 목적은 무엇입니까


답변:


33

대부분의 경우 [셸 내장이며에 해당합니다 test. 그러나와 같이 test독립 실행 형 실행 파일로도 존재합니다 /bin/[. 다음을 사용하여이를 테스트 할 수 있습니다 type -a [(Arch Linux 시스템에서 실행 bash).

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

그래서 내 시스템에는 [쉘의 내장과에있는 실행 파일이 /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.

[ ... ]

당신이 사람이 페이지의 발췌에서 볼 수 있듯이 위의 인용 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 없는[ 예를 들어 내장을.
terdon

7
@AlexandruIrimiea 그들은 "사용자 정의"쉘이 아닙니다. 단지 bash유사한 작업을 수행하도록 설계된 많은 프로그램 (쉘) 중 하나 일뿐입니다 . Bash는 가장 많이 사용되는 시스템 중 하나이지만 많은 시스템에서 기본 쉘이 다릅니다. 잘 알려진 것들 중 일부는 sh, bash, zsh, dash, ksh, tcsh, cshfish. 시스템에서 사용할 수있는 항목 cat /etc/shells여기에 부분 목록이 있습니다 .
terdon

1
@ JörgWMittag 정말? 나는 우분투는 것을 알고 sh있다 dash그러나 나는 구조 시스템의 사용을 생각 /bin/sh비지 박스 없습니다. 확실합니까?
terdon

2
그러나이 질문
Sergiy Kolodyazhnyy

1
@AlexandruIrimiea, 명령이 무엇인지에 대한 필요 에 구축하고, 또는 내장되지 않을 수 있습니다 어떤 명령을 참조하십시오 이 게시물을 .
와일드 카드

12

쉘 스크립트의 조건 테스트에 사용됩니다. 이 프로그램의 다른 이름은 다음과 같습니다 test.

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

그것은 쉘 문법처럼 보이지만 그렇지 않습니다. 일반적으로 [쉘은 내장되어 있지만 대체는 외부 명령으로 존재합니다.

의 "조건부 표현"블록을 참조하십시오 man bash.



9

[와 같은 명령 test입니다. 일부 * nix 시스템에서 하나는 다른 하나의 링크 일뿐입니다. 예를 들어, 다음을 실행하는 경우 :

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

당신은 같은 출력을 볼 수 있습니다.

대부분의 sh-shell / posix-shell에는 내장 [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

당신은 또한 사용할 수 있습니다 [[ ]](( ))테스트,하지만 사람들은없는 동일로 [test거의 동일한 구문을에도 불구하고, :

마지막으로 명령이 무엇인지 알아 보려면 다음을 사용할 수 있습니다.

type -a command

파일을 비교하려면 오히려 cmp /usr/bin/[ /usr/bin/test해시를 사용 하거나 해시 sha256sum /usr/bin/[ /usr/bin/test하지 않아야 strings합니다. 내 시스템 (openSUSE Tumbleweed) BTW에서 동일하지 않습니다 (이유).
Hauke ​​Laging

바이트 비교를 의미하지 않았습니다. 일부 * nix에서는 바이트 수준 = 링크에서도 동일합니다. Posix 테스트
kshji
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.