J'ai cherché noop dans bash (:), mais je n'ai trouvé aucune bonne information. Quel est le but exact ou le cas d'utilisation de cet opérateur?
J'ai essayé de suivre et ça marche comme ça pour moi:
[mandy@root]$ a=11
[mandy@root]$ b=20
[mandy@root]$ c=30
[mandy@root]$ echo $a; : echo $b ; echo $c
10
30
Merci de me faire part de tout cas d'utilisation de cet opérateur en temps réel ou de tout endroit où il est obligatoire de l'utiliser.
:
intégré existe dans bourne shell et ksh ainsi que bash.:
dans tldp.org/LDP/abs/html/special-chars.htmlRéponses:
C'est là plus pour des raisons historiques. Le colon intégré
:
est exactement équivalent àtrue
. Il est traditionnel à utilisertrue
lorsque la valeur de retour est importante, par exemple dans une boucle infinie:Il est traditionnel à utiliser
:
lorsque la syntaxe du shell nécessite une commande mais que vous n'avez rien à faire.L'
:
intégré remonte au shell Thompson , il était présent dans Unix v6 .:
était un indicateur d'étiquette pour lagoto
déclaration de l'obus Thompson . L'étiquette peut être n'importe quel texte, donc:
doublé comme indicateur de commentaire (s'il n'y en a pasgoto comment
, il: comment
s'agit en fait d'un commentaire). Le Bourne Shell n'avait pasgoto
mais conservé:
.Un idiome commun que les usages
:
est: ${var=VALUE}
, qui définitvar
àVALUE
s'il était hors service et ne fait rien sivar
déjà défini. Cette construction n'existe que sous la forme d'une substitution de variable, et cette substitution de variable doit faire partie d'une commande d'une manière ou d'une autre: une commande no-op sert bien.Voir aussi À quoi sert le colon intégré? .
la source
#
pour les commentaires (ou les#!/bin/sh
shebangs); la:
commande a introduit des commentaires, et malheur au programmeur naïf qui a fait une belle boîte d'étoiles dans leurs commentaires:: ****
(ou, pire,: * * *
).: * * *
?:
s'agit d'une commande, le shell doit encore traiter ses arguments avant de pouvoir découvrir qu'il les:
ignore. La plupart du temps, vous faites simplement faire un travail supplémentaire au shell en développant*
une liste de fichiers dans le répertoire courant; cela n'affectera pas réellement le fonctionnement du script.set -e
sur. Quoi qu'il en soit, j'espère que nous pourrons tous accepter d'utiliser#
:)while : ; do ... ; done
si je veux une boucle infinie rapide et sale. (Habituellement, il y a unsleep
dans la boucle, et je tape Ctrl-C pour le tuer.)Je l'utilise pour les instructions if lorsque je commente tout le code. Par exemple, vous avez un test:
mais vous souhaitez temporairement commenter tout ce qu'il contient:
Ce qui fait que bash donne une erreur de syntaxe:
Bash ne peut pas avoir de blocs vides (WTF). Donc, vous ajoutez un no-op:
ou vous pouvez utiliser le no-op pour commenter les lignes:
la source
Si vous utilisez
set- e
then,|| :
c'est un excellent moyen de ne pas quitter le script en cas d'échec (cela le fait explicitement passer).la source
|| :
plus tard la gestion de l'erreur vous-même avec unexit 0
, vous pourrez afficher tous les stdout et stderr dans la fenêtre de l'application pendant le débogage. Considérez{ foo ... 2>&1; } || :
ce qui est beaucoup plus simple que de configurer des pièges et des if-thens plus complexes.Vous utiliseriez
:
pour fournir une commande qui réussit mais ne fait rien. Dans cet exemple, la commande "verbosité" est désactivée par défaut, en la définissant sur:
. L'option 'v' l'allume.la source
$(verbosity $i)
dernier (et conditionnellement) ne fait rien.Ignorer les
alias
argumentsParfois, vous voulez avoir un alias qui n'accepte aucun argument. Vous pouvez le faire en utilisant
:
:la source
:
fonctionne, malheureusement. L'exemple que vous avez fourni semble redondant.#
#
ferait ignorer tout ce qui vient syntaxiquement après sur la même ligne. Ceci est vraiment différent (considérezmy_alias arg ; other_command
ou, au contraire,my_alias arg1 {BACKSLASH}{NEWLINE} arg2
), et ce n'est probablement pas ce que vous voulez car cela peut provoquer des erreurs de syntaxe (devinez ce que ferawhile my_alias ; do true ; done
ouwhile true ; do my_alias ; done
fera).Une utilisation est en tant que commentaires multilignes, ou pour commenter une partie de votre code à des fins de test en l'utilisant conjointement avec un fichier here.
N'oubliez pas d'utiliser des guillemets
EOF
pour que tout code à l'intérieur ne soit pas évalué, comme$(foo)
. Il pourrait également être intéressant d' utiliser un nom de terminaison intuitive commeNOTES
,SCRATCHPAD
ouTODO
.la source
Deux des miens.
Incorporer les commentaires du POD
Une application assez géniale de
:
consiste à incorporer des commentaires POD dans des scripts bash , afin que les pages de manuel puissent être générées rapidement. Bien sûr, on réécrirait éventuellement tout le script en Perl ;-)Liaison de fonction d'exécution
Il s'agit d'une sorte de modèle de code pour les fonctions de liaison au moment de l'exécution. Fi, ayez une fonction de débogage pour faire quelque chose uniquement si un certain drapeau est défini:
Vous obtenez:
la source
Parfois, les clauses no-op peuvent rendre votre code plus lisible.
Cela peut être une question d'opinion, mais voici un exemple. Supposons que vous ayez créé une fonction qui fonctionne en prenant deux chemins Unix. Il calcule le «chemin de changement» nécessaire pour passer d'un chemin à un autre. Vous placez une restriction sur votre fonction selon laquelle les chemins doivent tous deux commencer par un «/» OU les deux ne doivent pas.
Certains développeurs voudront supprimer le no-op, mais cela signifierait annuler le conditionnel:
Maintenant, à mon avis, il n'est pas si clair d'après la clause if les conditions dans lesquelles vous voudriez sauter la fonction. Pour éliminer le no-op et le faire clairement, vous voudrez déplacer la clause if hors de la fonction:
Cela semble mieux, mais souvent nous ne pouvons pas faire cela; nous voulons que la vérification soit effectuée à l'intérieur de la fonction.
Alors, à quelle fréquence cela se produit-il? Pas très souvent. Peut-être une ou deux fois par an. Cela arrive assez souvent pour que vous en soyez conscient. Je n'hésite pas à l'utiliser quand je pense que cela améliore la lisibilité de mon code (quelle que soit la langue).
la source
:
, vous devez utiliser:
, nontrue
, dans la réponse. Cela dit, la meilleure façon de nier l'ici conditionnelle est d'utiliser une[[ ... ]]
commande et le préfixe avec!
:if ! [[ ( ... && ... ) || ( ... && ... ) ]]; then
.: ${...=...}
soit sans doute moins gênant quetrue ${...=...}
. Certains pourraient préférerwhile :; do
àwhile true; do
des laconisme aussi bien.Un peu lié à cette réponse , je trouve ce no-op plutôt pratique pour pirater des scripts polyglottes . Par exemple, voici un commentaire valide à la fois pour bash et pour vimscript:
Bien sûr, nous avons peut-être
true
tout aussi bien utilisé , mais:
être un signe de ponctuation et non un mot anglais hors de propos indique clairement qu'il s'agit d'un jeton de syntaxe.Quant à savoir pourquoi quelqu'un ferait une chose aussi délicate que d'écrire un script polyglotte (en plus d'être cool): cela s'avère utile dans les situations où nous écririons normalement plusieurs fichiers de script dans plusieurs langues différentes, le fichier
X
faisant référence au fichierY
.Dans une telle situation, combiner les deux scripts dans un seul fichier polyglotte évite tout travail
X
pour déterminer le chemin versY
(c'est simplement"$0"
). Plus important encore, il est plus pratique de se déplacer ou de distribuer le programme.Un exemple courant. Il y a un problème bien connu et de longue date avec les shebangs: la plupart des systèmes (y compris Linux et Cygwin) n'autorisent qu'un seul argument à passer à l'interpréteur. Le shebang suivant:
lancera la commande suivante:
et non pas l'intention:
Ainsi, vous finiriez par écrire un script wrapper, tel que:
C'est là que la polyglossie entre en scène.
Un exemple plus précis. J'ai écrit un jour un script bash qui, entre autres, invoquait Vim. J'avais besoin de donner une configuration supplémentaire à Vim, ce qui pourrait être fait avec l'option
--cmd "arbitrary vimscript command here"
. Cependant, cette configuration était substantielle, de sorte que l'incruster dans une chaîne aurait été terrible (si jamais possible). Par conséquent, une meilleure solution était de l'écrire en extenso dans un fichier de configuration, puis de faire lire ce fichier à Vim avec-S "/path/to/file"
. Par conséquent, je me suis retrouvé avec un fichier bash / vimscript polyglotte.la source
J'ai également utilisé des scripts pour définir des variables par défaut.
la source
supposons que vous ayez une commande que vous souhaitez enchaîner au succès d'une autre:
mais maintenant vous voulez exécuter les commandes de manière conditionnelle et vous voulez afficher les commandes qui seraient exécutées (à sec):
donc si vous définissez DEBUG et NOEXEC, la deuxième commande ne s'affiche jamais. c'est parce que la première commande ne s'exécute jamais (parce que NOEXEC n'est pas vide) mais l'évaluation de ce fait vous laisse avec un retour de 1, ce qui signifie que la commande subordonnée ne s'exécute jamais (mais vous le voulez parce que c'est une exécution à sec). pour résoudre ce problème, vous pouvez réinitialiser la valeur de sortie laissée sur la pile avec un noop:
la source