La solution existe avec "sudo env PATH=$PATH toto.sh" mais il est important de comprendre pourquoi une solution fonctionne et l'autre non. Je dois corriger un grand script qui bogue à cause de ce problème (des commandes invalides non reconnues) et on m'a chargé d'expliquer les raisons de ce bug dans un rapport
Si je comprends bien ...
- ton problème n'est pas de passer la variable d'environnement dans ton script appelé par sudo
- dans ton script principal, en fait $PATH n'est PAS ta variable d'environnement
Tu modifies $PATH dans ton script principal ? (avant ton code donné)
Ton problème est que tu ne sais pas modifier ta variable d'environnement ? donc ton script principal ne trouve pas le second script dans cette variable d'environnement
Ce nouveau PATH doit être très temporaire ???
PATH="$NEWPATH" sudo toto.sh PATH="$PATH:/nouveau dir/bin" sudo toto.sh.
ou,
la bonne question initiale était simplement comment changer une variable d'environnement dans un script (et ces sous-scripts) ...
En déroulant le fil de discussionon est passé de variable=valeur commande (assez générique) à variable/[commande, prog ou script param].
Je ne suis pas expert en Linuxmais :
- lorsque tu remplaces 1 truc simple et universel par 1 truc tordu normal que lorsque cela marche ou pas tu ne peux pas vraiment expliquer pourquoi (ici on peut voir cela comme 2 threads concurrents qu'on veut dire "thread 1 puis thread 2")
- lorsque dans 1 commande simple (lancer 1 script) tu es obligé de créer 1 """sous shell""", c'est qu'il y a quelque chose de mauvais
![]()
(avec env ou carrément avec sh -c 'XXXX')
Donne leur l'URL de ce topic...
En fait, c'est "env" qui fait que ça marche mais en même temps, qui fout la zone dans la compréhension. Et avec le fait que la variable modifiée soit justement le PATH (variable assez primordiale dans la gestion des processus) ça aide pas non plus.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
C'est simplement parce que vous n'avez pas compris comment fonctione la syntaxe:
cette syntaxe crée une variable "locale" à la commande de DROITE , donc sudo ne voit pas l'affectation de PATH, par contre pour la commande env , c'est différent, car pour elle c'est un paramètre qu'elle doit tenir compte et dont c'est le boulot.
Code : Sélectionner tout - Visualiser dans une fenêtre à part variable=valeur commande
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 $ env --help Utilisation*: env [OPTION]... [-] [NOM=VALEUR]... [COMMANDE [ARG]...] Initialiser chaque NOM à VALEUR dans l'environnement et exécuter COMMANDE.
Ce que tu dis est vrai pour la syntaxe variable=valeur sudo commande, mais pas pour la syntaxe sudo variable=valeur commande. Dans ce dernier cas, variable=valeur est un argument de sudo comme il l'est pour env, et donc sudo pourrait le traiter comme le fait env (cf. https://www.developpez.net/forums/d2.../#post11961400 ), mais elle ne le fait pas.
Non, soit tu as fait une typo et inversé tes 2 commandes sudo dans ton explication (ce qui serait plus logique pour moi):
ceci ne fonctionne pas car sudo par mesure de sécurité ne tient pas compte de l'environnement appelant
Code : Sélectionner tout - Visualiser dans une fenêtre à part PATH=$PATH sudo commande
ne permet pas à sudo de trouver la commande car on lui dit juste de fournir une variable à la commande mais pas de l'intégrer dans son env.
Code : Sélectionner tout - Visualiser dans une fenêtre à part sudo PATH=$PATH commande
pour preuve:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 #!/bin/bash echo $PATHcomme on peut le voir ici, PATH n'est pas modifié dans mon shell appelant (c'est pareil pour sudo)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 $ echo $PATH /opt/disedorgue/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin $ ./pre.sh /opt/disedorgue/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin $ PATH=/bin ./pre.sh /bin $ echo $PATH /opt/disedorgue/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
Ah, ça je savais pas
Ca oui je l'avais déjà décrit ici.
D'où sudo PATH=$PATH sh -c 'commande' afin que ce soit "sh" qui lance la commande ; sh processus déjà lancé à ce moment là donc connaissant le PATH modifié.![]()
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Pense pas.
En reprenant mon "toto.sh" copié dans mon bin, j'ai tenté...
... mais rien n'a réussi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 sudo --preserve-env=PATH toto.sh sudo --preserve-env=PATH PATH=$PATH toto.sh
En revanche, en modifiant "toto.sh" pour lui faire afficher "$var", puis en écrivant export var=123, alors sudo --preserve-env=var ./toto.sh fonctionne.
Donc le "--preserve-env" c'est pour transmettre au fils, pas pour permettre au PATH d'évoluer afin de pouvoir créer ce fils.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
@disedorgue: je maintiens
Cette syntaxe a besoin d'être interprétée par un shell: variable=valeur sudo commande, et ce que fait le shell est d'ajouter variable=valeur à l'environnement de la commande sudo commande avant de la lancer.
Le fait que sudo ignore l'environnement appelant est un autre problème.
Cette syntaxe n'a pas besoin d'être interprétée par un shell: sudo variable=valeur commande, car variable=valeur est un argument de la commande sudo (et commande en est un autre argument), tout comme il est un argument de la commande env dans les posts précédents.
Le fait que sudo traite cet argument "comme le fait le shell" (manifestement) et non pas comme le fait env, est en quelques sortes accidentel : essentiellement c'est un argument, et sudo pourrait en faire autre chose.
C'est cette distinction que je voulais faire, mais pour le reste je constate comme vous le comportement démontré.
Pour le premier cas, on est d'accord, c'est un problème inhérent à sudo.
Pour le deuxième cas, tu auras le même souci que sudo via Bash ou autre shell car la définition de la variable est juste pour la commande de droite : sudo n'est rien d'autre qu'une surcouche à sh qui permet au sh de se lancer dans un autre env.
Ce que je veux dire par là, c'est que pour sudo, il n'a qu'un seul paramètre, toute la ligne (ou jusqu'au ; )
Partager