Bash-builtins . :

[Fermé]
Signaler
-
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
-
Bonjour,

pouvez vous me dire à quoi servent les commandes "." et ":" ?

le manuel dit:
       : [arguments]
	      No effect; the command does nothing beyond  expanding  arguments
	      and  performing any specified redirections.  A zero exit code is
	      returned.

	.  filename [arguments]


Pas clair du tout.

Merci d'avance

3 réponses

Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 431
Salut,

Source man bash

: [arguments]
    Pas d'effet. Cette commande ne fait rien d'autre que l'expansion des arguments et la mise en place des redirections. Le code de retour est nul. 

    . fichier [arguments] 
source fichier [arguments]
    Lire et exécuter les commandes contenues dans le fichier avec l'environnement du shell en cours, puis renvoyer le code de retour de la dernière commande exécutée dans le fichier. Si le nom du fichier ne contient pas de slash, les chemins d'accès contenus dans PATH sont parcourus pour rechercher le répertoire contenant le fichier. Lorsqu'il est recherché dans le PATH le fichier n'a pas besoin d'être exécutable. Le répertoire de travail en cours est finalement examiné si aucun fichier n'est trouvé dans le PATH. Si l'option sourcepath de la commande interne shopt est désactivée, le PATH n'est pas parcouru. Si des arguments sont fournis, ils sont transmis dans les paramètres positionnels lorsque le fichier est exécuté. Sinon les paramètres positionnel ne sont pas modifiés. Le code de retour est celui de la dernière commande exécutée au sein du script (0 si aucune commande n'est exécutée), et faux si le fichier n'est pas trouvé.


Pour la 1ère commande, j'avoue ne pas en savoir plus, sinon que je l'emploie souvent avec un "while" de cette façon :
while :
...

ce qui est un synonyme de :
while true
...

Ce qui explique bien sa définition. Mais je ne l'ai jamais employé avec des arguments.

Par contre pour la 2nd, tu as oublié ce qui suivait, en effet le "." est un synonyme de la commande "source".
Messages postés
18303
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 octobre 2021
5 412
Le Bourne shell original ne connaissait que ., pas source. le point est certainement resté pour compatibilité
edit: le : permet des commentaires au millieu de commandes
$ echo 1 ; echo 2 ; : une bière, svp ; echo 3 
1 
2 
3 
$ echo 1 ; echo 2 ; # une bière, svp ; echo 3 
1 
2 
$ 
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 431
Merci ;-)
salut,

un exemple d'expansion
si var n'est pas encore assignée alors lui assigner foo, si elle est déjà assignée, elle garde la valeur foo
: ${var:=foo}

pour les redirections
dans certaines conditions (ça ne me revient pas immédiatement)
> filename
ne fonctionne pas, alors que
: >filename
marche très bien.
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 431
Salut,

Merci.

Pour l'expansion j'avais plus pensé à l'extraction de sous-chaîne (${paramètre:début:longueur}) mais j'avais du mal à faire le parallèle ;-\

Pour la redirection, ça doit s'appliquer aux anciens shells, non ? ;-\
Je vous remercie
Par contre j'ai toujours du mal à comprendre la commande source, dans quels cas elle pourrait être utile
auriez-vous un/des exemple(s) à me montrer ?
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 431
Re-

L'exemple le plus employé en général est lorsque tu modifies ton fichier ".bashrc" et que tu veux que les modifications soient répercutées sur ton shell actif. Ou tu te déconnectes et te relogues dans la foulée, soit tu sources ton fichier et tu bénéficies des changements immédiatement :

source ~/.bashrc


Sinon un petit exemple :

$ echo $A     # Cette variable n'est pas définie dans mon environnement

$ echo $B     # Idem pour celle là

$ cat brol     # Ce fichier contient 2 variables et 1 commande
A="toto"
B="titi"
ls

$ source brol     # Je source mon fichier. La commande est exécutée
brol  f2  plop

$ echo $A     # La variable $A est maintenant définie dans mon environnement
toto

$ echo $B     # Idem pour $B
titi

$
Ah ok tout simplement !
J'avais mal compris ce que ça faisait

Merci bien !
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 431
Attention toutefois de ne pas appeler un fichier contenant un "exit", sans quoi tu es expulsé de ton shell manu-militari ;-))