Pytanie starożytne, ale ponadczasowe.
Rozwiązaniem, które konsekwentnie widziałem, jest posiadanie $HOME/binkatalogu i umieszczanie go na pierwszym miejscu $PATH(poprzez, ~/.bashrcjeśli jeszcze go nie ma; w niektórych systemach ~/binjest on $PATHdomyślnie pierwszy ). Upuszczenie tam skryptów do wykonania lub dowiązań symbolicznych do skryptów / plików wykonywalnych w innym miejscu jest prostym sposobem radzenia sobie z problemami ze ścieżką, które nie powinny mieć wpływu na system ani innych użytkowników.
Jeśli skrypt wymaga dodatkowych zasobów, które można znaleźć w stosunku do jego własnej lokalizacji (nierzadko), wówczas używana $BASH_SOURCEjest envvar . $BASH_SOURCEzawsze zawiera bezwzględną ścieżkę do aktualnie uruchomionego skryptu, niezależnie od wartości $PWD.
Rozważ następujące:
ceverett@burrito:~$ echo $PATH
/home/ceverett/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Widzimy, że $HOME/binto pierwsze $PATH, więc wszystko, co wprowadzę, ~/binbędzie działać. Mam skrypt demonstracyjny o nazwie ~/bin/findme:
#!/bin/bash
echo "Running from $BASH_SOURCE"
Można tego użyć, aby uzyskać bezwzględną ścieżkę do lokalizacji uruchomionego skryptu.
ceverett@burrito:~$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~$ cd foo
ceverett@burrito:~/foo$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~/foo$ cd /
ceverett@burrito:/$ findme
Running from /home/ceverett/bin/findme
. /path/to/scriptźródłowy ! W ogóle nie potrzebujesz okresu, jeśli chcesz go uruchomić.