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