Uruchamianie skryptów z innego katalogu

11

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ć sudow takich przypadkach? To na przykład nie działa:

sudo . /path/to/script
Desmond Hume
źródło
Należy pamiętać, że skrypt . /path/to/script źródłowy ! W ogóle nie potrzebujesz okresu, jeśli chcesz go uruchomić.
gniourf_gniourf

Odpowiedzi:

14

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 zadzwoni exitna 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:

$(cd /wherever/ ; sh script.sh)
Ярослав Рахматуллин
źródło
3
Czy masz na myśli (cd /wherever/ ; sh script.sh)? Dlaczego masz z $przodu?
G-Man mówi „Przywróć Monikę”
7

Z pewnością możesz to zrobić (z korektami wspomnianymi przez innych, jak sudo sh /pathto/script.shlub ./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

ln -s /home/username/Scripts/name.sh /usr/bin/name

(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_profiledodaj coś takiego:

alias l="ls -l"

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 prostu alias sl="sudo ls -l"zanotuj sobie l vs sl (jako bezużyteczny przykład).

Tak czy inaczej, możesz po prostu pisać sudo nameofscripti być na swojej drodze. Nie musisz zadzierać z ./ lub. lub sh itp. Po prostu zaznacz je jako pliki wykonywalne: D

nerdwaller
źródło
Zdecydowanie polecam opcję 2.
Bernhard
Dlaczego? To najlepsza praktyka czy po prostu smak?
Sergio
3

Zwykle robię tak, jak mówisz

sh /path/to/script

I uruchomić go jako root / superuser

sudo sh /path/to/script

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.

Bolli
źródło
nie działałby, jeśli ścieżka_bezpieczna jest ustawiona w pliku / etc / sudoers
l1zard 24.11.12
3

Zwykle przechowuję swoje skrypty w ( /usr/local/binlub /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/.bashrcplik i dodając ten wiersz:

export PATH=$PATH:/usr/local/sbin:/usr/local/bin

Jeśli chcesz mieć możliwość wykonywania skryptu jako root przez sudo, musisz dodać te katalogi do zmiennej secure_pathw swoim /etc/sudoers.

Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

Edycja tego pliku odbywa się przez uruchomienie, visudoco zapewnia, że ​​nie wystąpią żadne błędy.

IZard
źródło
Literówka: masz na myśli .bashrczamiast .bachrc.
gniourf_gniourf
0

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ć.

Codezilla
źródło
0

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.

alias run-script="cd /home/user/path/to/script/ && bash script.sh"

W ten sposób nie musisz nic zmieniać, aby działało.

EvR2f
źródło
0

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.

# Place this somewhere in your .bashrc/.bash_profile/etc and edit as you see fit

YOURCOMMAND () {
  cd /path/to/directory/containing/your/script/ && ./YOURSCRIPT
}

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.

AnonimowyX
źródło
-1

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
zxq9
źródło
(1) Chociaż wydaje się to użyteczną informacją, pytanie nie zadawało pytania, jak pisać skrypty wykorzystujące zasoby w stosunku do ich własnej lokalizacji; zapytał o uruchamianie skryptów. (2) Nie jestem pewien, w jaki sposób drugi akapit odnosi się do pytania. Sugerujesz, że jeśli napiszę skrypt, a Desmond chce go uruchomić, powinien połączyć go ze swoim prywatnym binkatalogiem? To wydaje się kłopotliwe. (3) Ponadto narusza niezależność lokalizacji. Jeśli /home/desmond/bin/foojest link do mojego skryptu, to BASH_SOURCEbędzie /home/desmond/bin/foo, a skrypt nie będzie w stanie znaleźć swoich zasobów.
G-Man mówi „Przywróć Monikę”
@ G-Man (1) Użytkownik nie przedstawił dużego kontekstu. Ilekroć w ciągu ostatnich 30 lat zadawano mi to pytanie, zawsze w kontekście użytkownik (zwykle nowy sysop lub programista) uruchamiał kombinację własnych i innych nabytych skryptów w celu automatyzacji trywialnych zadań, więc odpowiedziałem, że droga. To nie zakładamy trochę wiedzy skryptów ze strony wyciągnięcie ręki użytkownika. (2) Skrypty ogólnosystemowe są zwykle instalowane w /binlub w znanej lokalizacji /opt. (3) Niezależność lokalizacji jest dokładnie tym, co zachowuje się podczas pisania zbioru zależnych skryptów osobistych.
zxq9