Comment découvrir, de l'intérieur d'un script bash, le chemin dans lequel se trouve le script

Comment découvrir, de l'intérieur d'un script bash, le chemin dans lequel se trouve le script

Lorsque vous développez des scripts de bash complexes et commencez à mettre divers scripts dans un dossier, où un script interagit avec un autre, par exemple, en le démarrant, il devient rapidement nécessaire pour nous assurer que nous connaissons le chemin de l'émission, afin que nous puissions commencer le Autres scripts avec un chemin d'accès entièrement qualifié. Ceci est important car le premier script a peut-être été démarré de l'extérieur du répertoire du script. Nous aurions pu aussi le faire en utilisant un chemin relatif, donc même - en quelque sorte - lire la commande qui a commencé le script actuel ne fonctionnera pas.

Dans ce tutoriel, vous apprendrez:

  • Ce que PWD La commande est, et ce qu'il fait
  • Comment découvrir de l'intérieur d'un script bash quel chemin ce même script
Comment découvrir, de l'intérieur d'un script bash, le chemin dans lequel se trouve le script

Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Indépendant de la distribution Linux
Logiciel Ligne de commande bash, système basé sur Linux
Autre Toute utilité qui n'est pas incluse dans le shell bash par défaut peut être installée en utilisant Sudo Apt-Get Install Utility-Name (ou Installation de miam pour les systèmes basés sur Redhat)
Conventions # - nécessite que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - exige que les commandes Linux soient exécutées en tant qu'utilisateur régulier non privilégié

Qu'est-ce que PWD?

Le PWD La commande dans Linux renvoie le Répertoire de travail de chemin Lorsqu'il est exécuté. Quel que soit le chemin dans lequel nous nous trouvons actuellement et que nous avons précédemment navigué (ou avons été placés par notre système d'exploitation, comme, par exemple, lorsque nous ouvrons une invite de commande / terminal), ce sera le retour lorsque nous exécutons PWD.

$ CD / $ PWD / $ CD / HOME $ PWD / HOME 


Ici, nous avons changé pour le répertoire racine (/ /) et exécuté PWD. Notre chemin actuel était le répertoire racine, donc / / est retourné. Nous avons ensuite changé pour le /maison répertoire et exécuté PWD encore. Le chemin retourné est maintenant /maison.

À l'intérieur d'un script bash, le PWD La commande fonctionnera de la même manière. Il est également à noter de savoir que depuis un script bash (et sur la ligne de commande en dehors d'un script bash également), nous pouvons utiliser la variable du système d'exploitation spécial $ Pwd qui sera automatiquement tenu à jour par le système d'exploitation pour contenir notre chemin actuel. Cela nous évite d'avoir à faire quelque chose comme appeler une sous-coquille, je.e. Mypath = "$ (pwd)" n'est pas nécessaire, nous pouvons simplement invoquer le $ Pwd variable.

Afin que nous puissions utiliser des personnes handicapées, à droite?

Pas exactement. Imaginez la situation suivante:

$ touch 'mypath.sh '$ echo' #!/ bin / bash '>> mypath.sh $ echo 'echo $ pwd' >> mypath.sh $ chmod + x mypath.shot 

Ici, nous avons défini un script nommé mon chemin.shot et l'a fait exécutable. Ensuite, nous sautons un répertoire de notre répertoire d'origine et exécutons notre script:

$ pwd / home / roel $ cd… $ ./ roel / mypath.sh / home 

Tandis que le PWD commande à l'intérieur de notre mon chemin.shot Le script fonctionne correctement, il y a un problème ici: PWD a rendu le chemin dans lequel nous nous trouvons actuellement, à savoir /maison tandis que le script est réellement stocké dans le / Home / Roel annuaire!

Rappelez-vous le titre de l'article; Nous recherchons le chemin dans lequel le script est stocké! Alors, comment pouvons-nous trouver cela?

La méthode!

Alors qu'il n'y a pas de variable spéciale dans Bash pour couvrir le chemin dans lequel le script est stocké, il existe une méthode simple pour l'obtenir.

$ cd - / home / roel $ touch 'mypath2.sh '$ echo' #!/ bin / bash '>> mypath2.sh $ echo 'mypath = "$ (cd" $ (dirname \ $ 0) "&& pwd)"' >> mypath2.sh $ echo 'echo "$ mypath"' >> mypath2.sh $ chmod + x mypath2.shot 


Ici, nous avons défini un script secondaire nommé mypath2.shot. Nous y placons un peu de code spécial ($ (cd "$ (dirname \ 0 0)"; && pwd)) qui trouvera le chemin dans lequel se trouve le script (en changeant dans son répertoire, basé sur le \ 0 0 variable (qui est le nom de script dans la façon dont nous l'avons appelé, je.e. en utilisant un chemin relatif ou entièrement qualifié potentiel) et en demandant le dirname pour lui (par référence, et notez qu'il peut toujours être un chemin relatif si le script a commencé à utiliser un chemin relatif), puis en le transformant (via le CD) et à demander par la suite le PWD (Répertoire de travail de chemin) pour le même, nous donnant le chemin entièrement qualifié.

Voyons si cela fonctionne plus correctement que d'utiliser uniquement PWD:

$ cd… $ pwd / home $ ./ Home / mypath2.sh / home / roel 

Le script fonctionne correctement, et même si mypath2.shot a été relativement appelé, de l'extérieur du répertoire de l'endroit où réside le script, la sortie renvoyée a correctement reflété les informations recherchées; le chemin où le script existe. Nous avons stocké la même chose dans le $ Mypath variable, et cette variable pourrait désormais être utilisée pour par exemple l'appel $ MyPath / Someotherscript.shotun peu de scintillement.shot est un autre script dans le même répertoire que mypath2.shot

Conclusion

Dans cet article, nous regardons d'abord PWD Et si cela répondrait au problème à accomplir, à découvrir le chemin dans lequel notre script réside, à tout moment. Alors que PWD peut fonctionner si nous n'avons pas changé de répertoires, cela ne fonctionnera pas correctement si nous sommes en dehors du chemin dans lequel se trouve le script. Nous avons ensuite introduit un petit morceau de code (Mypath = "$ (cd" $ (dirname \ $ 0) "&& pwd)" qui renverra toujours le répertoire dans notre script correctement.

Un petit morceau de code, mais une grande solution pour notre problème de codage de script bash! Apprécier!

Tutoriels Linux connexes:

  • Dossier zip dans Linux
  • Comment déplacer le dossier sur Linux
  • Comment vérifier l'utilisation du disque par dossier sur Linux
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Choses à installer sur Ubuntu 20.04
  • Comment créer des archives cryptées compressées avec TAR et GPG
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Système linux hung? Comment s'échapper vers la ligne de commande et…
  • Masterring Bash Script Loops
  • Exemples de lignes de commande de commande de bash utile - Partie 4