Qual é o programa `[` que reside no meu sistema / bin?

32

Eu estava recentemente navegando na /binpasta do Fedora e notei um binário chamado [. Tentei pesquisar na internet para obter mais informações sobre isso, mas não consegui encontrar nada útil. Executá-lo stracetambém não parece produzir algo útil para uma inspeção mais detalhada.

O que é isso? Eu deveria estar alarmado? Poderia ser o resultado de um comprometimento do sistema? Devo executá-lo? Pertence a algum pacote?

NlightNFotis
fonte
4
[ -f /bin/[ ] && printf "%s\n" "Don't panic"
jasonwryan
@jasonwryan Sim, demorei um pouco para descobrir. Não consegui encontrar muita informação na rede e o Google não ajudou muito. Colocou aqui na esperança de ajudar o próximo que está no meu lugar.
NLNFotis
10
Corra man [para ver qual é o [comando!
Gilles 'SO- stop be evil'
@ Gilles Para ser honesto, eu fiz e mencionou algo sobre bash, e achei que poderia ser outra coisa. Não é a primeira coisa que vem à sua mente quando você vê um binário com um nome que você nunca viu antes em seu sistema de arquivos - ou, em outras palavras, precisa encontrar algo mais concreto para esclarecer as dúvidas em sua cabeça .
NLNFotis
4
Não um rpm -qif /bin/[para descobrir de onde vem ...
vonbrand

Respostas:

37

O [binário localizado sob a /binárvore em muitas distribuições GNU / Linux não é algo para se alarmar. Pelo menos no meu Fedora 19, ele faz parte do pacote coreutils, como demonstrado abaixo:

$ rpm -qf /bin/[
coreutils-8.21-13.fc19.x86_64

e é um sinônimo para testpermitir que expressões como [ expression ]sejam escritas em scripts de shell ou mesmo uso interativo.

NlightNFotis
fonte
16
Note-se que escudos como bashter um builtin teste [e não invocar o binário externo.
Jordanm
1
@jordanm, hoje a maioria dos shells os possui (e muitas outras operações simples e comuns) como integradas. Mas isso não foi sempre assim (ou é assim em todas as formas). Pode até ser mandatado pelo POSIX.
vonbrand
2
@vonbrand pubs.opengroup.org/onlinepubs/009695399/utilities/test.html Você está certo. Um comando de teste [é requerido por esta especificação.
yegle
@ vonbrand, apenas shells tipo Bourne geralmente têm um [comando embutido . Non-Bourne-like queridos como (t)csh, rc, esgeralmente não ( fishé uma exceção lá).
Stéphane Chazelas 4/04
5

O [comando é o mesmo que o testcomando.

Ele permite que você escreva instruções condicionais bastante concisas em scripts de shell. Na página de manual do SunOS:

   if [ "$1" = "pear" ] || [ "$1" = "grape" ] || [ "$1" = "apple" ]
   then
       command
   fi

Se você removê-lo, os scripts serão quebrados!

Thorbjørn Ravn Andersen
fonte
Os scripts escritos para shells que não têm [como comando interno serão interrompidos. A maioria das conchas faz. Ainda assim, eu certamente não recomendaria a remoção /bin/[.
Keith Thompson
@ KeithThompson, todos os shells foram [criados, são os scripts que executam aplicativos não-shell [que quebram. Como find ... -exec [ -f {} ] \;ouenv LC_ALL=C [ -f bar ]
Stéphane Chazelas
@StephaneChazelas: Todas as conchas? (csh e tcsh não, mas talvez isso não seja o ponto.) Eu não acho que tenha visto um shell derivado de sh que não tenha [um builtin, mas não acho que tenha [sido um builtin no original Casca de Bourne. De qualquer forma, remover /bin/[seria certamente uma má ideia.
25414 Keith Thompson
Menor queixa: teste [são quase os mesmos. [requer um fechamento ]; testnão permite (ou melhor, não trata um argumento de ]especial).
25414 Keith Thompson
2

O [é sempre dado como equivalente ao teste, mas eu não tinha visto o] mencionado explicitamente, embora esteja sempre lá. Acabei de encontrar isso em http://ss64.com/bash/test.html :

When the [ form is used, the last argument to the command must be a ]

o que é reconfortante - finalmente tenho a conclusão como eles dizem.

Harry Weston
fonte