Obtenez le chemin absolu d'un script en bash

Obtenez le chemin absolu d'un script en bash
Un chemin est un emplacement vers un répertoire ou un fichier. Il existe deux types de chemins distincts dans Linux - absolu et relatif. Le chemin relatif est déterminé à l'aide du répertoire de travail actuel. D'un autre côté, le chemin absolu est le chemin complet d'un fichier ou d'un répertoire. Le chemin complet, en particulier, est spécifié à partir du répertoire racine. Un moyen facile de se rappeler ce qui est en utilisant le /. Un chemin relatif ne commence pas par a / (le dossier racine). Dans ce tutoriel, nous apprendrons à obtenir le chemin absolu d'un script en bash.

Chemin absolu

Pour commencer, créons un répertoire simple, des sous-répertoires et des fichiers.

Dans cet exemple, si Linuxhint est notre répertoire de travail actuel, alors le chemin absolu du script de fichier.SH est:

/ Home / Kalyani / Desktop / LinuxHint / Project2 / Script.shot

Notre chemin relatif est:

Project2 / script.shot

Ce que vous pouvez remarquer ici, c'est que pour récupérer le fichier appelé script.sh, si nous avons un chemin absolu, nous pouvons le récupérer de n'importe où dans l'écosystème Linux. Notre chemin relatif n'est pas aussi flexible; Il, en revanche, dépend du répertoire de travail actuel. Dans le cas précédent, si nous étions dans le répertoire de Linuxhint, et c'était notre répertoire de travail actuel, alors pour accéder au script.sh, nous devons taper project2 / script.shot. Remarquez comment il n'y a pas / au début du chemin relatif.

Notre objectif est de récupérer l'adresse ou le chemin complet du script (chemin absolu).sh compte tenu d'un chemin relatif.

Link de lecture

Une commande que vous pouvez utiliser pour capturer l'adresse complète d'un fichier ou d'un exécutable est ReadLink. ReadLink est généralement utilisé pour capturer le chemin d'un lien symbolique ou d'un fichier canonique. Cependant, ReadLink peut également calculer le chemin absolu étant donné un chemin relatif. Dans tous les cas, vous devrez attacher un drapeau à ReadLink. Le drapeau le plus utilisé dans de tels cas est le drapeau F.

Exemple # 1 - ReadLink en utilisant le drapeau F

scénario.shot
#!/ bac / bash
path = 'readLink -f “$ bash_source: - $ 0”'
Dir_path = 'dirname $ path'
écho 'le chemin absolu est' $ chemin
écho '---------------------------------------------'
Echo 'Le chemin du répertoire est' $ dir_path

En règle générale, 0 $ est utilisé pour obtenir le chemin du script; Cependant, cela ne fonctionne pas toujours. Ainsi, un moyen plus fiable ou robuste d'obtenir le chemin relatif du script est d'utiliser $ bash_source: - 0 0.

Supposons qu'une instance que j'écris echo $ bash_source: - 0, le résultat que j'obtiens est ./scénario.shot. Ceci est le chemin non absolute vers notre fichier de script actuel. C'est-à-dire que l'emplacement du script exécuté est stocké dans $ bash_source: - 0.

Une fois que nous avons récupéré de manière fiable le chemin du script, nous pouvons ensuite le passer à ReadLink avec le drapeau F. Nous pouvons par la suite utiliser la commande dirname pour récupérer le chemin du répertoire. La commande dirname omettra la dernière valeur du chemin et renvoie le reste.

Donc, si nous avons un chemin de / home / kalyani / bureau / linuxhint / project2 / script.sh, et nous y appliquons dirname, nous obtiendrons / home / kalyani / bourse / linuxhint / project2. Cela a dépouillé le nom de base ou le nom du script à partir de l'adresse ou du chemin.

Chemin de vrai

Une autre commande qui peut être utilisée est RealPath. RealPath est une commande Linux utilisée pour imprimer le nom de fichier absolu résolu. Il faut que tous les composants existent sauf pour le dernier composant.

scénario.shot
#!/ bac / bash
path = $ (realPath «$ bash_source: - $ 0»)
écho 'le chemin absolu est' $ chemin
écho '-----------------------------------'
Dir_path = $ (dirname $ path)
Echo 'Le chemin du répertoire est' $ dpath

Ici, encore une fois, nous obtenons le chemin du script en utilisant $ bash_source: - $ 0. RealPath va récupérer le chemin complet pour vous, et Dirname obtiendra toute la dernière valeur du chemin absolu.

Alternative # 1

Supposons maintenant que vous n'aviez pas le privilège d'utiliser RealPath ou ReadLink. Il ne vient pas avec tous les systèmes Linux! J'ai eu la chance d'avoir utilisé Ubuntu et j'ai donc pu y accéder. Cependant, un long chemin à fait faire la même chose est le suivant:

scénario.shot
#!/ bac / bash
Dir_path = $ (cd $ (dirname "$ bash_source: - $ 0") && pwd)
path = $ dir_path / $ (nom de base «$ bash_source: - $ 0»)
écho 'le chemin absolu est' $ chemin
écho '----------------------------------'
Echo 'Le chemin du répertoire est' $ dir_path

Dans ce cas, nous avons d'abord besoin du chemin du script actuel, et à partir de celui-ci, nous utilisons dirname pour obtenir le chemin du répertoire du fichier de script. Une fois que nous avons cela, nous nous traduions dans le dossier et imprimons le répertoire de travail. Pour obtenir le chemin complet ou absolu, nous attachons le nom de basen du fichier de script au chemin du répertoire ou $ dir_path.

Récupération du chemin d'un autre script (autre que soi)

Dans les exemples précédents, nous avons récupéré les chemins absolus et répertoires du fichier de script lui-même. Et si nous voulions récupérer les chemins absolus et répertoires d'un fichier autre que le script dans lequel nous travaillons (autre que soi)?

Alors ici, nous avons créé un nouveau fichier appelé script2.sh, et nous aimerions obtenir les chemins absolus et répertoires de Script2.shot.

En script.SH:

scénario.shot
#!/ bac / bash
path = $ (realpath script2.sh)
écho 'le chemin absolu est' $ chemin
écho '-----------------------------------'
Dir_path = $ (dirname $ path)
Echo 'Le chemin du répertoire est' $ dpath

Toute des méthodes précédentes devrait également fonctionner ici. Cependant, ici, nous utiliserons le chemin relatif de Script2.sh pour récupérer le chemin absolu.

Récupérer le chemin d'une commande

Maintenant, vous pouvez obtenir les chemins absolus et répertoires de tous les scripts que vous souhaitez et celui des commandes. Supposons un instant que nous voulons obtenir les chemins absolus et répertoires de la commande ls. Nous écrivions:

scénario.shot
#!/ bac / bash
path = $ (qui ls)
écho 'le chemin absolu est' $ chemin
écho '-----------------------------------'
Dir_path = $ (dirname $ path)
Echo 'Le chemin du répertoire est' $ dir_path

Un chemin est une adresse utilisée pour localiser un fichier ou un dossier. Un chemin absolu est une adresse ou un emplacement complet de sorte que peu importe où vous êtes, vous pouvez récupérer le fichier que vous souhaitez. D'un autre côté, un chemin relatif est déterminé par rapport au répertoire de travail actuel. Dans Bash, il existe un certain nombre de façons de récupérer l'adresse complète d'un script. En particulier, nous pouvons utiliser RealPath, ReadLink, ou même créer notre petit script personnalisé. Lorsque nous voulons connaître le chemin du répertoire, nous pouvons utiliser la commande dirname dans notre script bash pour récupérer notre chemin de répertoire. Il est assez facile d'obtenir l'adresse complète en utilisant une adresse relative.

Codage heureux!