Dość często skrypt, który chcę wykonać, nie znajduje się w moim bieżącym katalogu roboczym i tak naprawdę nie chcę go zostawiać.
Czy dobrą praktyką jest uruchamianie skryptów (BASH, Perl itp.) Z innego katalogu? Czy zwykle znajdą wszystko, czego potrzebują do prawidłowego działania?
Jeśli tak, jaki jest najlepszy sposób uruchomienia skryptu „odległego”? Czy to jest
. /path/to/script
lub
sh /path/to/script
i jak korzystać sudo
w takich przypadkach? To na przykład nie działa:
sudo . /path/to/script
. /path/to/script
źródłowy ! W ogóle nie potrzebujesz okresu, jeśli chcesz go uruchomić.Odpowiedzi:
sh / path / to / script odrodzi nową powłokę i uruchomi skrypt niezależnie od bieżącej powłoki. Polecenie
source
(.) Wywoła wszystkie polecenia w skrypcie w bieżącej powłoce. Jeśli skrypt zadzwoniexit
na przykład, stracisz bieżącą powłokę. Z tego powodu zwykle bezpieczniej jest wywoływać skrypty w osobnej powłoce z sh lub wykonywać je jako pliki binarne przy użyciu pełnej (zaczynającej się od /) lub względnej ścieżki (./). Jeśli zostaną wywołane jako pliki binarne, zostaną wykonane przy użyciu określonego interpretera (na przykład #! / Bin / bash).Jeśli chodzi o to, czy skrypt znajdzie potrzebne pliki, nie ma dobrej odpowiedzi poza spojrzeniem na skrypt, aby zobaczyć, co robi. Opcjonalnie zawsze możesz przejść do folderu skryptu w podprocesie bez opuszczania bieżącego folderu:
źródło
(cd /wherever/ ; sh script.sh)
? Dlaczego masz z$
przodu?Z pewnością możesz to zrobić (z korektami wspomnianymi przez innych, jak
sudo sh /pathto/script.sh
lub./script.sh
). Robię jednak jedną z kilku rzeczy, aby uruchomić je w całym systemie, aby nie martwić się o katalogi i oszczędzić mi niepotrzebnego dodatkowego pisania.1) Symlink do
/usr/bin
(upewnij się, że nie ma tam nakładającej się nazwy, ponieważ oczywiście byś ją zastąpił). To pozwala mi również przechowywać je w moich folderach programistycznych, aby w razie potrzeby dostosować.
2) Dodaj katalog skryptów do swojej ścieżki (używając .bash_profile - lub cokolwiek. Profil, który masz na swojej powłoce)
PATH=/path/to/scripts/:$PATH
3) Utwórz Alias
.bash_profile
w~/.bash_profile
dodaj coś takiego:Jak widać, składnia to po prostu alias, cyfry, które chcesz pełnić jako polecenie, polecenie. Więc wpisanie „l” w dowolnym miejscu w terminalu spowoduje, że
ls -l
jeśli chcesz sudo, po prostualias sl="sudo ls -l"
zanotuj sobie l vs sl (jako bezużyteczny przykład).Tak czy inaczej, możesz po prostu pisać
sudo nameofscript
i być na swojej drodze. Nie musisz zadzierać z ./ lub. lub sh itp. Po prostu zaznacz je jako pliki wykonywalne: Dźródło
Zwykle robię tak, jak mówisz
I uruchomić go jako root / superuser
Twój bieżący katalog ma znaczenie tylko wtedy, gdy skrypty zakładają, że jesteś w tym samym folderze, co on. Zakładam, że większość skryptów tego nie robi, a ty możesz zapisać, aby uruchomić go jak wyżej.
źródło
Zwykle przechowuję swoje skrypty w (
/usr/local/bin
lub/usr/local/sbin/
jeśli skrypt wymaga uprawnień roota), do których należą zgodnie ze standardem hierarchii systemów plików (FHS).Wszystko, co musisz zrobić, to upewnić się, że te dwa katalogi zostały dodane do twojego
PATH
. Możesz to zrobić, edytując$HOME/.bashrc
plik i dodając ten wiersz:Jeśli chcesz mieć możliwość wykonywania skryptu jako root przez
sudo
, musisz dodać te katalogi do zmiennejsecure_path
w swoim/etc/sudoers
.Edycja tego pliku odbywa się przez uruchomienie,
visudo
co zapewnia, że nie wystąpią żadne błędy.źródło
.bashrc
zamiast.bachrc
.Nie jestem pewien, czy tak działa w Linuksie, zakładając, że tak nie będzie, jeśli nikt tego nie zasugerował. Ale zamiast używać ././ do powrotu do katalogów. Czy możesz użyć cudzysłowów, aby wyznaczyć ścieżkę bezwzględną? Być może nie daje ci to dostępu do całego dysku, abyś mógł to zrobić, aby o tym pomyśleć.
źródło
Jeśli masz wokół siebie skrypty, które musisz często uruchamiać i zależą one od ich lokalizacji w celu znalezienia zasobów, możesz to łatwo zrobić, łącząc polecenia w takim aliasie.
W ten sposób nie musisz nic zmieniać, aby działało.
źródło
Nie jestem pewien, dlaczego nikt tego nie zasugerował, ale to bardzo proste! Kilka razy przejrzałem Google i nie mogłem znaleźć tej dokładnej odpowiedzi, więc pomyślałem, że się podzielę. IMO, to i tak najlepsze dla mnie, a także i najłatwiejsze rozwiązanie, jednak inni mogą czuć i robić to inaczej.
Najpierw polecenie „cd” informujące o katalogu lokalizacji skryptów. Następnie „&&”, aby można było powiązać go po wykonaniu następnego polecenia. Na koniec otwórz skrypt, tak jak zrobiłbyś to w terminalu! Zapisałeś plik w pliku BASH i zajmuje to 5 sekund.
Mam nadzieję, że to komuś pomogło.
źródło
Pytanie starożytne, ale ponadczasowe.
Rozwiązaniem, które konsekwentnie widziałem, jest posiadanie
$HOME/bin
katalogu i umieszczanie go na pierwszym miejscu$PATH
(poprzez,~/.bashrc
jeśli jeszcze go nie ma; w niektórych systemach~/bin
jest on$PATH
domyś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_SOURCE
jest envvar .$BASH_SOURCE
zawsze zawiera bezwzględną ścieżkę do aktualnie uruchomionego skryptu, niezależnie od wartości$PWD
.Rozważ następujące:
Widzimy, że
$HOME/bin
to pierwsze$PATH
, więc wszystko, co wprowadzę,~/bin
będzie działać. Mam skrypt demonstracyjny o nazwie~/bin/findme
:Można tego użyć, aby uzyskać bezwzględną ścieżkę do lokalizacji uruchomionego skryptu.
źródło
bin
katalogiem? To wydaje się kłopotliwe. (3) Ponadto narusza niezależność lokalizacji. Jeśli/home/desmond/bin/foo
jest link do mojego skryptu, toBASH_SOURCE
będzie/home/desmond/bin/foo
, a skrypt nie będzie w stanie znaleźć swoich zasobów./bin
lub w znanej lokalizacji/opt
. (3) Niezależność lokalizacji jest dokładnie tym, co zachowuje się podczas pisania zbioru zależnych skryptów osobistych.