Quel est l'intérêt de l'opérateur "null" dans un script BASH? Je comprends qu'il est utilisé comme espace réservé après une if
commande lorsque vous n'avez rien à dire, mais que vous avez besoin d'une commande pour permettre au programme de fonctionner correctement. Mais quelle en est l'utilité globale? Quand l'utiliseriez-vous? Quand est-il judicieux de l'utiliser?
13
Réponses:
Il est parfois utile de permettre aux effets secondaires d'extension de paramètres de se produire.
Par exemple, définir une valeur par défaut
la source
:
commandes et des paramètres dans le manuel bash.${name:="John Doe"}
sera développée, provoquant l'affectation car elle est lue comme un argument pour :. Sans le: le shell tentera d'exécuter "John Doe" en tant que commande, ou la valeur$name
si elle est déjà définieVous pouvez également l'utiliser pour des boucles sans fin:
la source
while true
- être est plus lisible, car (a) il utilise moins de ponctuation, et (b) il est plus similaire aux langages dérivés C.Vous pouvez l'utiliser pour créer un fichier sans exécuter de programme ::
Ceci est infiniment plus rapide que
touch /path/to/file
(car il ne nécessite pas d'exécuter letouch
programme) et peut être légèrement plus portable que tout simplementqui semble fonctionner sur de nombreux systèmes. De même, il peut être utilisé pour vérifier si vous avez un accès en écriture à un fichier :
bien que cela, aussi, puisse généralement être fait sans
:
. Mises en garde:(Voir la question liée pour les raisons pour lesquelles cela est plus fiable que
if [ -w /path/to/file ]
.)la source
En arrière, dans Unix V6 et Thompson Shell, le
:
était en fait utilisé dans le cadre de lagoto
déclaration. Selon le manuel , il est apparu à l'origine dans la version 3 d'Unix:De nos jours, en
bash
, il est utilisé comme un opérateur sans opération, retournant le succès. En effet, si vous regardez le code source , vous verrez que les deuxtrue
et:
utilisent la même fonction,int colon_builtin()
en dessous. Il n'y a:
pas de commande non intégrée et/bin/true
est en fait une commande assez importante pour ce qu'elle fait.:
pourrait être utilisé n'importe oùtrue
est utilisé, par exemple danscommand_that_can_fail || true
, bien que cela risque de dérouter les non-experts. En savoir plus ici .la source
Vous pouvez l'utiliser sur le test positif d'une
if
commande lorsque vous voulez seulement faire quelque chose de négatif. Par exemple:Sans le
:
bash, une erreur de syntaxe serait générée.Ceci est un exemple trop simplifié. Généralement, vous utiliseriez une telle technique dans le codage préliminaire lorsque vous n'avez pas encore écrit ce segment de code et que vous avez juste besoin de quelque chose qui ne génère pas d'erreur.
la source
if pgrep firefox >/dev/null ; then : ; else echo "Firefox not running"; fi
ne montrerait d'erreur que si firefox n'était pas en cours d'exécution. En d'autres termes, lorsque vous devez faire quelque chose uniquement lorsque la commande contient une erreur. D'une certaine manière, cela équivaut àpgrep firefox || echo "Firefox not running"
, bien que plus lisible et autorise plus de commandesJe viens de l'utiliser dans un script avec des commandes SSH pour empêcher le script de générer des erreurs.
Dans ce cas, je veux voir si un utilisateur peut se connecter à un ensemble de serveurs. Si la connexion est OK, l'hôte distant fera écho OK. Si la connexion échoue, SSH répondra avec l'erreur. Cependant, je veux que mon script se termine avec 0 et non la valeur de la commande SSH en cas d'échec. Donc, essentiellement, je piège l'erreur SSH en l'ORing
||
avec la commande null:
. Ressemble à ça:De cette façon, j'obtiens la sortie de SSH mais pas le code d'erreur:
la source