pourquoi certains fichiers ont-ils besoin d'être "sourcés" ? Le sujet est résolu

Demande d'aide : c'est ici.
Répondre
tony
Membre
Membre
Messages : 402
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

bonjour ,

la toile n'ayant pas été d'une grande aide .....
  1. tout d'abord à propos de cette commande :

    Code : Tout sélectionner

    ~$ man source
    Aucune entrée de manuel pour source
    
    ~$ help source
    source: source nom_fichier [arguments]
        Exécute des commandes depuis un fichier dans le shell actuel.
        
        Lit et exécute des commandes depuis NOMFICHIER dans le shell actuel.  Les
        éléments dans $PATH sont utilisés pour trouver le répertoire contenant NOMFICHIER.
        Si des ARGUMENTS sont fournis, ils deviennent les paramètres de position
        lorsque NOMFICHIER est exécuté.
  2. donc a priori la commande source "exécute" : un script je suppose
  3. lorsqu'on modifie un fichier de configuration par exemple ( /etc/fichier.config) la modification est visible immédiatement dans le même terminal . Par contre si on modifie .bash_aliases et si on veut vérifier le résultat dans le même terminal il faut passer par la commande

    Code : Tout sélectionner

    source .bash_aliases
    Qu'a donc de spécial ce fichier .bash_aliases ? De plus je ne vois pas la relation entre "exécuter" et "rafraichir" le contenu d'un fichier .
edit 1 : en cherchant une explication sur stackoverflow j'ai trouvé une commande équivalente qui doit être passée dans /home/user/

Code : Tout sélectionner

. .bash/aliases
. Toujours bon à savoir . De plus il me semble avoir lu que ce point peut servir à exécuter un fichier shell . On retombe sur "exécuter" une fois de plus et pourtant ce fichier est juste un fichier texte sans commande à l'intérieur , hormis les alias , non ? J'ai comme l'impression que je suis sur une mauvaise piste .

edit 2 : je pense avoir la solution : https://askubuntu.com/questions/1266196 ... et-applied

.bashrc is read only once, when bash starts. It is just so by design (and has always been). If you make any subsequent changes to .bashrc, they won't be applied until .bashrc is re-read. By running source .bashrc, you make exactly this - you tell bash to re-read that file.

Of course you can also start a new copy of bash (by eg. starting a new terminal session), this will cause the new bash process read the .bashrc file again (but there will be no changes in the old session).

BTW. .bashrc file is a script, and by sourcing it, you execute the commands placed in that file. The commands define aliases in your case, but there can be virtually any commands placed in that file.
et comme .bash_aliases se comporte comme .bashrc et n'est lu qu'une fois il faut le relire et c'est le rôle de la commande source . De plus ce sont bien les alias qui sont considérés comme des commandes à exécuter . En outre ce fichier "texte" est bien un fichier shell = ??? = peu important .

Si j'ai écrit des bêtises merci de me corriger .
Debian 12/ Xfce
tony
Membre
Membre
Messages : 402
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

résolu

je trouve qu'il faut souvent passer par l'anglais pour résoudre des questions qui , pour moi du moins , ne sont pas courantes . En .fr je n'avais rien trouvé .
Debian 12/ Xfce
Avatar de l’utilisateur
vv222
Membre actif
Membre actif
Messages : 852
Inscription : 18 avr. 2016, 20:14
Contact :
Status : Hors-ligne

Quand tu sources un fichier shell il modifie l’environnement courant. Quand tu l’exécutes, ça se passe dans un environnement "à part" justement pour éviter de modifier ton environnement.

Tu peux donc modifier les variables d’environnement ou la liste des alias de l’environnement courant avec un fichier sourçable, mais pas avec un fichier exécutable.
tony
Membre
Membre
Messages : 402
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

vv222 a écrit : 12 oct. 2023, 23:37 Quand tu sources un fichier shell il modifie l’environnement courant. Quand tu l’exécutes, ça se passe dans un environnement "à part" justement pour éviter de modifier ton environnement.

Tu peux donc modifier les variables d’environnement ou la liste des alias de l’environnement courant avec un fichier sourçable, mais pas avec un fichier exécutable.

Et donc lorsque l'exécution est terminée je retrouve toutes les variables d'environnement inchangées et je continue comme si rien ne s'était passé . OK .

Finalement le petit problème que j'ai eu après la modification de la liste de mes alias m'a entraîné un peu loin . De fil en aiguille , c'est toujours le cas avec une recherche internet , je suis tombé sur la variable BASH_ALIASES dont la valeur accessible par la commande set mais pas par echo (=?) est justement la liste de mes alias sourcés .

Il va me falloir un peu de temps pour réellement comprendre ce que fait cette commande , mais comme ça n'interfère pas avec l'utilisation quotidienne du système , je vais laisser décanter .

En tout cas merci pour ces précisions .
Debian 12/ Xfce
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Bonjour
tony a écrit : 13 oct. 2023, 08:02 …je suis tombé sur la variable BASH_ALIASES dont la valeur accessible par la commande set mais pas par echo
Essaye comme ça :

Code : Tout sélectionner

mic@deb12:~$ echo ${BASH_ALIASES[egrep]}
egrep --color=auto
mic@deb12:~$ 

Code : Tout sélectionner

for k in ${!BASH_ALIASES[@]}; do echo $k; done

Code : Tout sélectionner

for k in "${!BASH_ALIASES[@]}"; do echo -e "$k\t${BASH_ALIASES[$k]}"; done
tony
Membre
Membre
Messages : 402
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

MicP a écrit : 13 oct. 2023, 11:35 Bonjour

…je suis tombé sur la variable BASH_ALIASES dont la valeur accessible par la commande set mais pas par echo

Essaye comme ça : .......
bonjour ,

seules les 2 dernières commandes fonctionnent , la 1ère ne renvoie rien .

Avec ce genre de commandes , dont 2 sont des fonctions il me semble ( je vais regarder ça plus tard ) , on est en lisière du domaine d'un spécialiste , non ?

ps : après avoir lu le post de @dezix plus bas , je m'aperçois que ce que j'avais pris pour des fonctions n'en sont pas . Au temps pour moi donc .

En tout cas merci .
Debian 12/ Xfce
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

tony a écrit : 13 oct. 2023, 11:51 …seules les 2 dernières commandes fonctionnent , la 1ère ne renvoie rien . …
ces lignes de commandes retournent ce qu'elles trouvent => si aucun alias nommé egrep n'a été définit dans ton shell, alors il n'y aura aucun retour
et si aucun alias n'avait été définit, les deux autres commandes n'auraient rien retourné non plus.

La variable BASH_ALIASES est un tableau associatif dans lequel chaque nom d'alias définit est associé à une ligne de commande.

Voir aussi :

Code : Tout sélectionner

man --pager='less -p "BASH_ALIASES$"' bash
et

Code : Tout sélectionner

man --pager='less -p "^ALIAS$"' bash
tony
Membre
Membre
Messages : 402
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

ces lignes de commandes retournent ce qu'elles trouvent => si aucun alias nommé egrep n'a été définit dans ton shell, alors il n'y aura aucun retour
Désolé j'étais axé sur une liste des alias en sortie et comme je suis incapable de décortiquer ce type de commande , pour le moment du moins , je n'ai pas fait le nécessaire . Et donc elle fonctionne très bien pour trouver un alias dans une liste . Mais le fait que egrep ne soit finalement qu'un mot à trouver dans une liste rend déjà la commande entière moins ésotérique .


Je vais regarder le reste .

edit 1 : voilà pour la commande 1 de type " opération sur un tableau " , comprise mais comme je ne connais rien aux tableaux . Avec le recul je m'aperçois que j'aurais dû comprendre le type de sortie à attendre de cette commande , j'avais la réponse sous les yeux .

edit 2 : pour les 2 autres , une fois la signification de [@] connue ( manuel Bash Shell expansions ) , seule la 1ère se comprend bien , la 2ème est à décrypter , trop d'inconnu . En tout cas c'est intéressant même si ça ne me servira probablement jamais .
Debian 12/ Xfce
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5854
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

Du coup, je me pose une question basique: comment identifier le type d'une variable en Bash. Car effectivement, faire un echo sur une liste ou un tableau n'a pas de sens, mais encore faut il connaître le type de la variable à visualiser.
tony
Membre
Membre
Messages : 402
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

piratebab a écrit : 13 oct. 2023, 14:29 Du coup, je me pose une question basique: comment identifier le type d'une variable en Bash. Car effectivement, faire un echo sur une liste ou un tableau n'a pas de sens, mais encore faut il connaître le type de la variable à visualiser.
je ne sais pas si c'est suffisant pour éliminer le type "variable d'environnement" , mais en tout cas "printenv" ne la connaît pas .
Car effectivement, faire un echo sur une liste ou un tableau n'a pas de sens, mais encore faut il connaître le type de la variable à visualiser.
voilà une remarque qui pourra me servir pour une prochaine fois .

Et puis il y a ceci :

~$ type BASH_ALIASES
bash: type: BASH_ALIASES : non trouvé --> peut-être normal car je viens d'essayer sur les 3 types de variables que je connais , un peu , et la réponse reste la même .

~$ set | grep BASH_ALIASES
BASH_ALIASES=([xc]="xclip -o >" [fr]="LANG=fr_FR.utf8" [arr]="sudo shutdown -P now" [grepc]="grep --color" [arm]="sudo apt autoremove" [en]="LANG=C.UTF-8" [scan]="xsane SANE URI: hpaio:/net/Deskjet_3070_B611_series?ip=192.168.1.16" [Alias]="alias ; (alias) | wc -l" [vl]="vim -V9myVim.log" [lsg]="lsc --group-directories-first -A ; ls -A | wc -l" [lsc]="ls --color=auto" [sr]="sudo shutdown -r 0" [ad]="sudo apt update && sudo apt upgrade" )
_=BASH_ALIASES

~$ bash

~$ set | grep BASH_ALIASES
BASH_ALIASES=()

on dirait bien que le fait de passer dans un shell fils change sa valeur , ce qui ne devrait pas être le cas si elle était dans la classe " environnement " . Enfin il me semble .

edit 1 : après avoir lu le post ci-dessous de @MicP moi qui pensais savoir un petit quelque chose sur les types de variables , je vois que finalement je ne connais qu'un petit pas grand chose . Je me suis mêlé d'un problème qui me dépasse largement . Désolé .
Debian 12/ Xfce
Avatar de l’utilisateur
dezix
Membre hyper actif
Membre hyper actif
Messages : 3548
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

Salut !

Si ça t'intéresses, j'ai une assez vieille mémoire
(HDD interne qui sature et quelques secteurs partis en vacances...) :banana_stoner:

Bref j'ai bien du mal à me souvenir des alias peu utilisés,
mais bien pratiques quand on tape comme un pied même avec ses (2) doigts. :003:

Donc, j'ai rajouté une fonction dans mon ~/.bashrc :

[Édité]

En copiant sur @MicP :023:
je modifie le chemin de mon fichier liste des "alias courants" :117:
pour le mettre dans le "home" de l'utilisateur :029: ,
car c'est la logique commune ... :014:

Code : Tout sélectionner

# Aliases Print
aliasPrint ()
    {
        alias_list='~/.alias_list' ;
        echo -e "Liste des aliases en usage  -  $(date -d now +%Y-%m-%d)  -  MàJ avec : \$ aliasPrint \n" > "$alias_list"  ;
        alias -p | sed 's/alias\s/\n/g' >> "$alias_list" ;
    }
Pour la prendre en compte <=> rajouter cette fonction à l'environnement de ma session (actuelle)

Code : Tout sélectionner

source ~/.bashrc

Après cela :

Code : Tout sélectionner

$ aliasPrint

$ head ~/.alias_list
Liste des aliases en usage  -  2023-10-13  -  MàJ avec : $ aliasPrint 


al='apt list'

ali='apt list --installed'

ap='apt policy'

asr='apt search'


Voilà j'ai ma liste d'aliases à jour,
et consultable depuis un lien sur le bureau,
ou mieux depuis un lanceur dans ma barre latérale xfce4-panel qui me l'affiche via seetxt
qui n'est malheureusement plus dans stable :

Code : Tout sélectionner

$ ap seetxt
seetxt:
  Installé : 0.72-7
  Candidat : 0.72-7
 Table de version :
 *** 0.72-7 100
         90 https://deb.debian.org/debian bullseye/main amd64 Packages
        100 /var/lib/dpkg/status

**Simple Utilisateur** -- Debian stable - XFCE
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

La commande interne (du bash) declare (ou typeset) te permetra de voir le type d'une variable.

Voir l'aide concernant la commande declare du shell bash :

Code : Tout sélectionner

declare --help
Exemples :

Une variable de type tableau associatif donnera :

Code : Tout sélectionner

mic@deb12:~$ declare -p BASH_ALIASES | cut -d ' ' -f2
-A
mic@deb12:~$ 
Une variable de type tableau donnera :

Code : Tout sélectionner

mic@deb12:~$ declare -p BASH_ARGC | cut -d ' ' -f2
-a
mic@deb12:~$ 

Une variable en lecture seule donnera :

Code : Tout sélectionner

mic@deb12:~$ declare -p BASHOPTS | cut -d ' ' -f2
-r
mic@deb12:~$ 

Une variable de type entier en lecture seule donnera :

Code : Tout sélectionner

mic@deb12:~$ declare -p PPID | cut -d ' ' -f2
-ir
mic@deb12:~$ 
etc.

=======
Et on peut lister le contenu du tableau associatif BASH_ALIASES de façon à en faire un fichier (caché puisque je vais le nommer ~/.alias_perso)
qu'il suffira de faire "sourcer" par une ligne de commande dans son fichier ~/.bashrc

Code : Tout sélectionner

for k in "${!BASH_ALIASES[@]}"; do printf "alias %s='%s'\n" "$k" "${BASH_ALIASES[$k]}"; done > ~/.alias_perso
Dans ~/.bashrc la ligne de commande à ajouter pour "sourcer" le fichier ~/.alias_perso est :

Code : Tout sélectionner

source ~/.alias_perso
ou bien, en utilisant un simple point qui est l'autre nom de la commande source

Code : Tout sélectionner

.   ~/.alias_perso
Voir aussi :

Code : Tout sélectionner

man --pager='less -p "\.  fichier"' bash
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5854
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

Merci pour l'astuce!
Répondre