web-dev-qa-db-fra.com

Ajouter au chemin seulement le fichier sh et non un répertoire

J'ai un dossier bin avec un tas de fichiers sh. Par exemple, "server-run.sh", "server-stop.sh", "server-do-something.sh". Et je veux exécuter le fichier "server-stop.sh" de n'importe où. Je pourrais ajouter ce dossier bin à un chemin, mais les fichiers "run" et "à faire" seront également disponibles et je ne souhaite pas polluer ma console. De plus, je ne veux pas ajouter ce fichier au dossier/bin, car cela pourrait changer. Peut-être un lien. Puis-je en quelque sorte ajouter que "server-stop.sh" au chemin?

3
Moses

Le meilleur moyen consiste à ajouter un lien symbolique à ce fichier dans le répertoire /usr/local/bin:

cd /usr/local/bin
ln -s server-stop.sh /path/to/your/folder/server-stop.sh

Dans ce cas, vous ajoutez un lien au fichier d'origine. Vous pouvez donc toujours modifier le fichier d'origine et votre commande fonctionnera toujours.

6
Елин Й.

La création de liens dans /usr/bin fonctionne, mais à moins que vous ne souhaitiez que les scripts soient disponibles pour tous les utilisateurs, je préférerais créer les liens dans ~/bin, avec le même résultat, mais sans toucher au système global. En outre, OP n'a pas indiqué où les scripts sont stockés. créer un lien globalement pendant que les scripts sont stockés localement est une mauvaise pratique, c'est pourquoi je suggérerais:

  • Créez un répertoire local ~/bin.
  • Supprimez l'extension de langage des scripts (à moins qu'ils ne s'appellent), rendez-les exécutables (voir ci-dessous).
  • Créez des liens vers les scripts à partir de ~/bin (ln -sf).
  • Déconnexion et retour dans.

Que ce soit avec ou sans extension de langue, le script fonctionnerait parfaitement bien. Cependant, il existe certains arguments pour utiliser le script sans extension de langage:

  • Pour des raisons de clarté, il peut être préférable de nommer le lien vers le script similaire à le script lui-même . Conserver l'extension de langue serait alors moins pratique lors de l'appel du script.
  • Bien qu'un peu exagéré dans le cas de scripts écrits par l'utilisateur, selon conventions de Lintian , les scripts (ou les liens vers des scripts) dans les chemins de recherche par défaut ne devraient pas avoir d'extension de langue. -
4
Jacob Vlijm

J'utiliserais la commande intégrée bashhash pour mémoriser l'emplacement du script server-stop.sh:

hash -p /path/to/folder/server-stop.sh server-stop

Ajoutez simplement la ligne ci-dessus à votre fichier .bashrc. Vous pouvez maintenant utiliser server-stop partout dans votre bash Shell/scripts.

Voir help hash:

hash: hash [-lr] [-p pathname] [-dt] [name ...]
Remember or display program locations.

Determine and remember the full pathname of each command NAME.  If
no arguments are given, information about remembered commands is displayed.

Options:
  -d        forget the remembered location of each NAME
  -l        display in a format that may be reused as input
  -p pathname   use PATHNAME is the full pathname of NAME
  -r        forget all remembered locations
  -t        print the remembered location of each NAME, preceding
        each location with the corresponding NAME if multiple
        NAMEs are given
Arguments:
  NAME      Each NAME is searched for in $PATH and added to the list
        of remembered commands.
3
Sylvain Pineau

Peut-être un alias est ce que vous recherchez. Ouvrez votre fichier ~/.bash_aliases et ajoutez les éléments suivants à la fin du fichier (le fichier peut être vide si vous avez déjà ajouté un alias):

alias server-stop.sh='/path/to/your/server-stop.sh`

Avantages:

  • Ceci n’ajoutera que server-stop.sh comme vous le souhaitez.

  • Cela ne changera pas votre variable $PATH

  • Les autres utilisateurs de votre système ne sont pas affectés

Inconvénients:

  • Vous devrez changer l'alias une fois que vous aurez changé le chemin où se trouve server-stop.sh (je ne pense pas que cela sera nécessaire très fréquemment)

  • Cela ne fonctionnera que pour bash Shell, vous devrez voir ce que les autres shells utilisent pour alias.

2
jobin