Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Explication ligne dans un fichier .ksh

2 réponses
Avatar
UNIXAS9
Bonjour,

Pourriez-vous s'il vous plaît m'expilquer en détails cette ligne :

current_dir=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P ) . ${current_dir}/../outils.env

checklogdir ${current_dir} 1

Merci d'avance.

2 réponses

Avatar
Olivier Miakinen
Bonjour,
Le 04/07/2018 16:58, UNIXAS9 a écrit :
Pourriez-vous s'il vous plaît m'expilquer en détails cette ligne :

Déjà, il y a au moins deux lignes non vides. Je suppose que la première
ligne ne se termine pas par un « . », et du coup je vais concaténer
cette ligne avec la suivante.
Par ailleurs, les commandes cd et pwd sont en principe des builtins
du shell, et du coup cela pourrait aider de savoir de quel shell
il s'agit.
current_dir=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P ) . ${current_dir}/../outils.env

Allons-y par petits bouts, en supposant que le shell est un peu comme
le bash.
command -v -- "$0"

Ceci récupère le nom complet du script dans lequel tu as trouvé ce
code, et l'affiche sur la sortie standard.
Mettons par exemple que c'est /foo/bar/le_script
"$(command -v -- "$0")"

« $(truc) » récupère la sortie standard de la commande truc et en fait
un paramètre de ligne de commande (ou plusieurs s'il y a des blancs).
« "$(truc)" » s'assure que le résultat sera UN seul paramètre et pas
plusieurs. Particulièrement utile si le chemin vers le_script peut
comporter des espaces.
Dans l'exemple, ce sera "/foo/bar/le_script"
"$(dirname -- "[...]")"

Extrait le nom de répertoire où se trouve le fichier dont le nom est
passé en paramètre. Je te passe l'explication du $(...) et des
guillemets, c'est la même chose que précédemment.
Dans l'exemple, on a donc "/foo/bar".
cd -P [...] && pwd -P

Je ne connaissais pas cette syntaxe, mais le man de bash m'indique
que ça permet d'obtenir le vrai nom physique du répertoire, au lieu
de liens symboliques. Par exemple, si /foo est un lien symbolique
vers /usr/local, ça donnera /usr/local/bar
current_dir=$(...)

Met la chaîne /usr/local/bar dans la variable current_dir. C'est fait
temporairement, juste le temps d'exécuter le reste de la commande, à
savoir « . ${current_dir}/../outils.env »
. ${current_dir}/../outils.env

Lance le script ${current_dir}/../outils.env, c'est-à-dire le script
/usr/local/outils.env dans notre exemple, mais en exécutant ses
commandes dans le script courant au lieu de lancer un processus
indépendant. Ça veut dire que si /usr/local/outils.env définit des
variables ou des fonctions, elles seront visibles dans le script
appelant.
checklogdir ${current_dir} 1

Ça je n'en sais rien. Peut-être que checklogdir est une fonction
définie dans outils.env ? Soit dit en passant, il vaudrait mieux
que ce script définisse aussi ${current_dir} s'il ne l'a pas
été avant, parce que la ligne compliquée ne l'a *pas* défini
(rappelle-toi, j'ai dit que c'était fait temporairement).
Cordialement,
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 05/07/2018 00:49, je répondais à UNIXAS9 :
Par ailleurs, les commandes cd et pwd sont en principe des builtins
du shell, et du coup cela pourrait aider de savoir de quel shell
il s'agit.

Euh... j'ai l'habitude de lire le contenu des articles et pas leur
titre (champ Subject), du coup je n'avais pas vu que le shell en
question était le korn shell (ksh). Sachant cela, ce que j'ai écrit
à propos de « command -v », « cd -P » et « pwd -P » semble correct
puisque les pages man de bash et de ksh disent la même chose.
Cordialement,
--
Olivier Miakinen