Exécuter un script dans le même répertoire que le script courant

J'ai deux scripts Bash dans le même dossier (enregistré quelque part par l'utilisateur qui télécharge l'ensemble du référentiel):

  • script.sh est exécuté par l'utilisateur
  • {[1] } est requis et exécuté par script.sh

, Les deux scripts doivent être dans le même répertoire. J'ai besoin du premier script pour appeler le second, mais il y a deux problèmes:

  1. connaître le répertoire de travail actuel m'est inutile, car je ne sais pas comment l'utilisateur exécute le premier script (peut-être avec /usr/bin/script.sh, avec ./script.sh, ou il pourrait être avec ../Downloads/repo/scr/script.sh)
  2. le script script.sh va changer de répertoire avant d'appeler helper.sh.

Je peux certainement pirater ensemble Bash qui le fait en stockant le répertoire courant dans une variable, mais ce code semble inutilement compliqué pour ce que j'imagine est une tâche très commune et simple.

Existe-t-il un moyen standard de de manière fiable appeler helper.sh depuis script.sh? Et travaillera dans n'importe quel Bash-système d'exploitation pris en charge?

21
demandé sur Community 2016-08-16 18:19:01

1 réponses

Depuis $0 détient le chemin complet du script en cours d'exécution, vous pouvez utiliser dirname pour obtenir le chemin d'accès du script:

#!/bin/bash

script_name=$0
script_full_path=$(dirname "$0")

echo "script_name: $script_name"
echo "full path: $script_full_path"

Donc, si vous le stockez par exemple dans /tmp/a.sh, vous verrez une sortie comme:

$ /tmp/a.sh
script_name: /tmp/a.sh
full path: /tmp

Donc

  1. connaître le répertoire de travail actuel est inutile pour moi, car je ne sais pas comment l'utilisateur exécute le premier script (pourrait être avec /usr/bin/script.sh, avec ./script.sh, ou il pourrait être avec ../Downloads/repo/scr/script.sh)

L'utilisation de dirname "$0" vous permettra de garder une trace du chemin d'origine.

  1. le script script.sh va changer de répertoire avant d'appeler helper.sh.

Encore une fois, puisque vous avez le chemin dans $0 Vous pouvez cd y revenir.

33
répondu fedorqui 2016-08-16 15:23:25