Je suis toujours surpris qu'il /bin
y ait un [
programme dans le dossier .
Est-ce ce qu'on appelle quand on fait quelque chose comme if [ something ]
:?
En appelant [
explicitement le programme dans un shell, il demande une correspondance ]
, et lorsque je fournis le crochet de fermeture, il semble ne rien faire, peu importe ce que j'insère entre les crochets.
Inutile de dire que la manière habituelle d'obtenir de l'aide à propos d'un programme ne fonctionne pas, c'est-à-dire que ni man [
ne [ --help
fonctionne.
[
fait référence à latest
commande si, nonexpr
, il devrait donc êtreman test
man '['
fonctionne très bien pour moi - soit vous avez oublié de citer[
ou vous avez une définition différente de «œuvres».[
évalue ses arguments, vous devez donc laisser des espaces entre eux.[ a=b ]
n’est pas une comparaison: ce sera toujours vrai (c’est une seule chaîne: "a = b", qui est toujours évalué à vrai ). Et vous devriez limiter le nombre d’arguments à 4 (même si les implémentations récentes permettent plus .. Limiter à 4 le rend plus portable.Par exemple: a[ "a" = "b" ]
déjà 4 arguments: "a" "=" "b" et la fin non nécessaire du test arg: "]"). Si vous avez besoin de plus: tests en chaîne avec par exemple:if [ "$Var_a" = "foo" ] && [ "$Var_b" = "bar" ] ; then : do something ; fi
!
lui-même (non échappé et non cité) ne sera pas remplacé, et ce serait encore mieuxif ! [ ...
. Toutes les extensions de bash qui utilisent!
incluent au moins un autre caractère[
-builtin dansbash
(et éventuellement d'autres shells), et que cela peut être utilisé à la place de/bin/[
. Il existe également latest
commande-qui, sur de nombreux systèmes, est un lien symbolique vers/bin/[
(ou vice-versa) - mais sur d'autres, il s'agit d'une commande séparée.Réponses:
Le
[
travail de la commande consiste à évaluer les expressions de test. Il retourne avec un statut de sortie 0 (ce qui signifie vrai ) lorsque l'expression est résolue en vrai et quelque chose d'autre (ce qui signifie faux ) sinon.Ce n'est pas qu'il ne fait rien, c'est juste que son résultat se trouve dans son statut de sortie. Dans un shell, vous pouvez connaître l'état de sortie de la dernière commande
$?
pour les shells de type Bourne ou$status
dans la plupart des autres shells (fish / rc / es / csh / tcsh ...).Dans d'autres langues
perl
, l'état de sortie est par exemple renvoyé dans la valeur de retour desystem()
:Notez que tous les shells modernes Bourne-like (et
fish
) ont une[
commande intégrée . Celui dans/bin
ne sera généralement exécuté que lorsque vous utilisez un autre shell ou lorsque vous faites des choses commeenv [ foo = bar ]
oufind . -exec [ -f {} ] \; -print
ou cetteperl
commande ci-dessus ...La
[
commande est également connue sous sontest
nom. Lorsqu'il est appelé en tant quetest
, il ne nécessite pas d']
argument de clôture .Bien que votre système ne dispose peut-être pas de page de manuel
[
, il en a probablement unetest
. Mais encore une fois, notez qu'il documenterait la/bin/[
ou la/bin/test
mise en œuvre. Pour en savoir plus sur la[
structure de votre shell, vous devriez plutôt lire la documentation de votre shell.Pour plus d'informations sur l'historique de cet utilitaire et sur la différence avec l'
[[...]]
expression de test ksh, vous pouvez consulter cet autre Q & R ici .la source
[
. Je ne me souviens pas s'il s'agissait d'une variante Bourne ou d'une version ancienne de frêne.[
ettest
intégré à Unix System III. Avant cela, il n'y en avait pas[
et il n'ytest
avait qu'une commande binaire externe.find . -exec [ f {} ] \; -print
? La commandefind . -type f -print
ferait la même chose tellement plus efficacement ...Vous avez raison d'être surpris. C’est l’une des rares commandes POSIX, avec l’utilitaire null (
:
), qui ne respecte pas la convention des caractères autorisés du fichier de commandes (jeu de caractères du nom de fichier portable).Précisément mais il peut être utilisé sans le
if
trop.Il ne fait rien de visible, mais il fait exactement la même chose que lorsqu'il est utilisé avec
if
, c'est-à-dire qu'il définit le statut de sortie à 0 (vrai) ou à toute autre chose (faux) en fonction de ce que vous mettez entre crochets. C'est (pour une raison) le même comportement que latest
commande; la seule différence est qu'il cherche la fin]
. Voirman test
pour plus de détails.Cela dépend de votre système d'exploitation.
man [
Cela fonctionne certainement pour moi sur quelques distributions Gnu / Linux classiques, mais pas sur Solaris.[ --help
Cela peut fonctionner ou non, selon l’implémentation car il enfreint la syntaxe de toute façon, il manque la fin]
. De plus, la norme POSIX pour latest
/[
commande exclut explicitement toutes les options, y compris la--
résiliation de l' option afin que les deux[ --help ]
et letest --help
besoin de revenirtrue
et se taire par la conception. Notez que ce que vous mettez à l' intérieur des crochets ou après[
et qui ressemblent à des options (par exemple-f file
,-n string
et les goûts) ne sont pas des options mais opérandes .Tous les interprètes shell de style moderne Bourne (comme
bash
,ksh
,dash
etzsh
pour ne citer que quelques - uns) mettre en œuvre letest
/[
utilitaire en interne comme un builtin donc quand vous les utilisez, la bonne page de manuel pour désigner pourrait être celui de la coquille, pastest
un.Avant Unix System III (1981), le shell Bourne
test
n’implémentait pas l’ utilitaire en interne, de sorte que seule l’implémentation de commande binaire externe était disponible. Il n'y avait pas non plus de[
commande (interne ou intégrée) avant Unix System III. Par exemple, sous Unix Version 7, vous deviez taper:au lieu de:
la source
man test
fonctionne mais pasman [
Par contre, mon environnement cygwin est connuman [
!man [
ne semble pas fonctionner sur Manjaro (basé sur Arch Linux). Le manuel destest
listes[ --help
est une invocation valide qui devrait afficher de l'aide, mais il est intéressant de noter qu'il ne le fait pas et se plaint plutôt d'une absence]
, comme c'est le cas avec--version
. L'ajout de]
ne fait rien, donc il semble impossible d'obtenir de l'aide autrement que deman test
./usr/bin/[ --help
ou/bin/[ --help
.env [ --help
ainsi que de/usr/bin/[ --help
travailler complètement bien (même si je dois citer/usr/bin/[
ou zsh se plaint).[
est en fait plus communément appelétest
commande. L’utilisation typique de cette commande consiste simplement à évaluer des expressions et à renvoyer leur condition - vraie ou fausse. Il est souvent utilisé dans lesif-then-else-fi
instructions, même s'il peut être utilisé en dehors desif
instructions pour exécuter conditionnellement d'autres commandes via un shell&&
ou des||
opérateurs, comme cela.Plus spécifiquement, l'évaluation est communiquée à d'autres commandes via le statut de sortie. Certains programmes peuvent choisir de générer un état de sortie pour indiquer différents types d'événements: exécution réussie du programme, erreur d'un type particulier survenant pendant l'exécution ou erreurs de syntaxe. Dans le cas de la
test
commande, il y a des0
significations vraies et1
fausses. Comme Stephan l’a souligné, les erreurs de syntaxe produisent le statut de sortie2
.Son emplacement dépend de votre système et explique également pourquoi vous n'avez pas vu la page de manuel à ce moment-là
man [
. Par exemple, sur FreeBSD, il est en dessous/bin
. Sous Linux (ou dans mon cas particulier, Ubuntu 16.04), il se trouve dans/usr/bin/
. Si vous le faitesman [
ouman test
sur un système Linux, vous verrez la même documentation ouverte. Il est également important de noter que votre shell peut avoir sa propre implémentationtest
.Il convient également de noter que cette commande pose des problèmes que l’implémentation de Korn Shell (connue sous le nom de "expression conditionnelle" avec des doubles crochets
[[ "$USER" = "root" ]]
) cherche à résoudre. Cette fonctionnalité est également utilisée par d'autres coques telles quebash
etzsh
.la source
/usr/bin/
pour Amazon Linux aussi.Sur certaines distributions (par exemple Ubuntu),
man [
suit un lien symbolique verstest(1)
. Sur d'autres (par exemple Arch), ce n'est pas le cas. (Mais latest
page de manuel documente également l'utilisation[
)type -a [
vous montre qu'il existe à la fois un shell intégré et un exécutable.bash-builtin
[ --help
imprime simplement un message d'erreur. (Mais comme il s'agit d'une commande intégrée, vous pouvez utiliserhelp [
ou consulter la page de manuel / docs de bash)./usr/bin/[ --help
affiche l’aide complète (pour la version de GNU Coreutils), qui commence par:et décrit ensuite la syntaxe autorisée pour EXPRESSION.
C'est une autre façon dont vous auriez pu découvrir cela
[
et quitest
sont équivalentes.En passant, si vous programmez pour bash (ou écrivez des lignes uniques de manière interactive), je le recommanderais
[[
au lieu de[
. C'est mieux à plusieurs égards, voir les liens dans la réponse de Serg.la source
[
La commande retourne l'état de sortie zéro si expression, contenue dans ses arguments, est considérée comme vraie et non nulle comme état de sortie si expression, contenue dans ses arguments, est considérée comme fausse. Il échoue également avec le message d'erreur si son dernier argument n'est pas]
(ceci est fait uniquement pour des raisons esthétiques).Par exemple:
… Produira:
Cependant, bash et de nombreux autres shells n'appellent généralement pas
/bin/[
(ou/usr/bin/[
) dans ces cas-là, mais appellent une commande intégrée avec exactement le même comportement (uniquement pour des raisons de performances). Pour appeler/bin/[
(et non le substitut intégré au shell), vous devez spécifier explicitement son chemin (par exemple/bin/[ hello ]
, vous n'avez pas besoin de préfixer]
avec dirname si ☺ ), ou configurer le shell pour ne pas utiliser un substitut intégré (par exemple,enable -n [
en bash).PS: Comme cela a été dit dans d'autres réponses,
[
est lié àtest
. Maistest
, contrairement à[
, ne nécessite pas]
le dernier argument (et ne l'attend pas du tout; l'ajout]
d'test
arguments supplémentaires peut entraîner l'échec du message d'erreur ou le renvoi d'un résultat erroné) . Le/bin/test
et/bin/[
peut résoudre le même fichier (par exemple , un est un lien symbolique , dans ce cas , le détournement de comportement est probablement mis en œuvre par l' analyse de la commande actuellement appelée dans letest
/[
code lui - même) ou des fichiers différents. Entest
outre, shell appelle généralement le substitut intégré, sauf si path est explicitement spécifié (/bin/test
) ou s'il est configuré pour ne pas le faire (enable -n test
)PPS: Contrairement à
test
and[
, modernif
n’est jamais un vrai fichier. Cela fait partie de shell (par exemple bash) syntaxe:if commandA; then commandB; fi
(sauts de ligne peuvent être utilisés à la place des points - virgules) provoquecommandB
à exécuter si et seulement si vous êtescommandA
liquide' zéro état. Cela correspond parfaitement au comportement detest
ou[
, permettant de les combiner commeif [ "$a" = foo ]; then …; fi
(ouif test "$a" = foo; then …; fi
- tout simplement moins lisibles) . Cependant, les scripts modernes utilisent souvent à la[[
place detest
ou[
, qui (en tant queif
) n'est jamais un fichier réel, mais fait toujours partie de la syntaxe du shell.PPPS: En ce qui concerne
man
- ne vous attendez jamaisman
à avoir un article sur chaque commande de votre système de fichiers. Infos sur certaines commandes (même « réel », basé sur des fichiers) peuvent être manquants, informations sur certains shell Encastrements peut - être présent non seulement dans un article consacré à l' enveloppe spécifique (qui est l'endroit où vous certainement y trouver des informations surtest
,[
,if
,[[
). Pourtant, beaucoup de distributions ont desman
articles explicites pourtest
et[
. (À propos--help
, ce n'est pas reconnutest
pour une raison évidente: il doit gérer des cas comme par exemplea=--help; test "$a"
: sur certaines distributions[ --help
(sans fermer]
), l'aide est toujours affichée, sur d'autres non.)la source
if
c'était une commande jusqu'à Unix V6. Unix V7 (1979) est venu avec le shell Bourne (avec saif-then-else-fi
construction) et la nouvelletest
commande.