Exécutez un script de n'importe où

8

J'ai un script:

#!/bin/bash
echo "$(dirname $(readlink -e $1))/$(basename $1)"

qui se trouve ici: /home/myuser/bin/abspath.shqui a des autorisations d'exécution.

Si je cours, echo $PATHj'obtiens ce qui suit:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/myuser/bin

Je souhaite pouvoir, depuis n'importe quel répertoire, appeler abspath <some_path_here>et appeler mon script. J'utilise bash, qu'est-ce que je fais mal?

guépard
la source

Réponses:

30

Vous voulez taper abspath, mais le programme est nommé abspath.sh. Le problème n'est pas de savoir s'il se trouve dans le CHEMIN, mais le fait que vous n'utilisez simplement pas son nom pour l'appeler.

Vous avez deux options:

  1. Tapez abspath.shplutôt.
  2. Renommez le programme en abspath.
Michael Hampton
la source
1
... Ou créer un simlink: cd $HOME/bin ; ln -s abspath.sh abspath. Cela vous permet de conserver l'extension correcte pour le script et d'avoir un outil nommé comme vous le souhaitez. (Vous pourriez dans un futur proche, remplacer votre script shell par un script python, par exemple ...)
F. Hauri
Ou créez un alias.
Jenny D
6

Ce code est suffisamment petit pour que je le code comme une fonction shell:

abspath() {
    echo "$(dirname "$(readlink -e "$1")")/$(basename "$1")" 
} 

Et oui, vous voulez toutes ces citations.

glenn jackman
la source
4

définissez un alias en ajoutant votre commande dans le fichier .bashrc.

alias abspath='sh /home/myuser/bin/abspath.sh'

Et n'oubliez pas de vous procurer le fichier.

Balasekhar Nelli
la source
1
Pourquoi voudriez-vous sudo ici?
un CVn
1
Je voterais si j'avais assez de réputation, car utiliser inutilement sudo est tout simplement faux. Il semble que certaines personnes utilisent automatiquement sudo pour tout au lieu d'apprendre quand et pourquoi cela est nécessaire.
Scott Severance
D'accord avec vous les gars. Et je sais quand utiliser sudo. Je n'ai pas vu toutes les questions.
Balasekhar Nelli
2

Je renommerais votre script bash pour abspathensuite le déplacer dans le binrépertoire. Vous serez en mesure d'appeler abspathde n'importe où alors

Harvey
la source
0

Une troisième option consiste à créer un alias appelé abspath qui pointe vers votre script abspath.sh.

tokamak
la source
5
Pas nécessaire s'il est corrigé comme l'explique la solution acceptée, également assez compliqué et il cache en fait un problème plutôt que de le résoudre.
dawud
Cela ne vaut pas la peine d'être argumenté, mais il va sans dire que si vous le résolvez avec une solution, vous n'avez pas besoin d'appliquer une autre solution. Oui, c'est une solution bandaid et se référer directement au script shell est une solution plus idéale.
tokamak