Qual é o objetivo do executável de colchete


Respostas:


33

Na maioria dos casos, [é um shell embutido e é equivalente a test. No entanto, testtambém existe como um executável independente: foi o que /bin/[você viu. Você pode testar isso com type -a [(em um sistema Arch Linux, em execução bash):

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

Portanto, no meu sistema, tenho dois [: o shell está embutido e o executável no /bin. O executável está documentado em 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.

[ ... ]

Como você pode ver no trecho da página homem citado acima, teste [são equivalentes. Os comandos /bin/[e /bin/testsão especificados pelo POSIX, e é por isso que você os encontrará, apesar de muitos shells também os fornecerem como integrados. Sua presença garante que construções como:

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

funcionará mesmo se o shell que os executa não tiver um [builtin. Por exemplo, em tcsh:

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

5
@AlexandruIrimiea, o que você quer dizer? Um shell que não possui o [builtin é apenas um shell cujos autores decidiram não adicionar um. tcsh não tem um [builtin, por exemplo.
terdon

7
@AlexandruIrimiea não são conchas "personalizadas". É apenas que bashé apenas um dos muitos programas (shells) projetados para realizar tarefas semelhantes. O Bash é um dos mais populares, mas muitos sistemas são fornecidos com diferentes shells padrão. Alguns dos mais conhecidos são sh, bash, zsh, dash, ksh, tcsh, cshe fish. Você pode ver os disponíveis em seu sistema cat /etc/shellse uma lista parcial aqui .
terdon

11
@ JörgWMittag realmente? Eu sabia que o Ubuntu shé, dashmas achei que o sistema de resgate /bin/shnão usa o busybox. Você tem certeza?
terdon

2
No entanto, existe realmente um busybox no initramfs, como evidenciado nesta questão #
Sergiy Kolodyazhnyy

11
@AlexandruIrimiea, sobre quais comandos é necessário ter incorporado e quais comandos podem ou não ser incorporados, consulte esta publicação .
Curinga

12

Isso é usado para teste de condição em scripts de shell. Outro nome deste programa é test:

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

Parece gramática de shell, mas não é. Geralmente [é um shell embutido, mas provavelmente como fallback existe como um comando externo.

Veja o bloco "EXPRESSÕES CONDICIONAIS" em man bash.



9

[é o mesmo comando que test. Em alguns sistemas * nix, um é apenas um link para o outro. Por exemplo, se você executar:

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

você verá a mesma saída.

A maioria dos shells / posix-shells inclui builtin [e testcomandos. O mesmo vale para echo. Há um /bin/echocomando e um builtin na maioria dos shells. Essa é a razão pela qual às vezes você sente que, por exemplo, echonão funciona da mesma maneira em sistemas diferentes.

testou [retorne apenas um código de saída de 0ou 1. Se o teste foi bem-sucedido, o código de saída é 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

Você também pode usar [com 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

Mas você pode usar ifcom todos os comandos, ifé para testar o código de saída. Por exemplo:

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

Ou, usando if:

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

Você pode obter o mesmo resultado usando apenas o testcomando para testar o código de saída que é salvo na variável 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

Você também pode usar [[ ]]e (( ))para testar, mas esses não são os mesmos [e test, apesar de terem quase a mesma sintaxe:

Por fim, para descobrir o que é um comando, você pode usar:

type -a command

Para comparar arquivos, você deve usar cmp /usr/bin/[ /usr/bin/testou talvez hashes, sha256sum /usr/bin/[ /usr/bin/testmas não strings. No meu sistema (openSUSE Tumbleweed), aliás, eles não são os mesmos (por que razão).
Hauke ​​Laging

Eu não quis dizer byte comparando. Em alguns * nix, eles também são iguais no nível de bytes = vinculado. Teste Posix
kshji
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.