Qual é o objetivo do executável de colchetes?

27

Eu vejo que existe um executável chamado "[" em /usr/bin . Qual é o seu propósito?

    
por Alexandru Irimiea 22.01.2016 / 16:07

3 respostas

32

Na maioria dos casos, [ é um shell embutido e é equivalente a test . No entanto, como test , ele também existe como um executável autônomo: esse é o /bin/[ que você viu. Você pode testar isso com type -a [ (em um sistema Arch Linux, executando bash ):

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

Portanto, no meu sistema, eu tenho dois [ : meu shell embutido e o executável em /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 man acima, test e [ são equivalentes. Os comandos /bin/[ e /bin/test são especificados por POSIX e é por isso que você encontrará eles apesar do fato de que muitas conchas também os fornecem como builtins. Sua presença garante que construções como:

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

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

> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ]  && echo yes
yes
    
por 22.01.2016 / 16:36
12

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

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

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

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

    
por 22.01.2016 / 16:15
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 sh shells / posix-shells inclui comandos incorporados [ e test . O mesmo é verdade para echo . Existe um comando /bin/echo e um embutido na maioria das conchas. Essa é a razão pela qual às vezes você sente que, por exemplo, echo não funciona da mesma maneira em sistemas diferentes.

test ou [ retornam apenas um código de saída de 0 ou 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 if com 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 somente o comando test 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 testes, mas eles não são iguais a [ e test , apesar de terem quase a mesma sintaxe:

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

type -a command
    
por 22.01.2016 / 18:14