Jak uruchomić skrypt powłoki bez używania poleceń „sh” lub „bash”?

261

Mam skrypt powłoki, który chcę uruchomić bez użycia poleceń „sh” lub „bash”. Na przykład:

Zamiast: sh script.sh

Chcę użyć: script.sh

W jaki sposób mogę to zrobić?

PS (i) Nie używam dużo skryptów powłoki i próbowałem czytać o aliasach, ale nie rozumiałem, jak ich używać.

(ii) Przeczytałem również o powiązaniu skryptu z innym plikiem w zmiennych PATH. Korzystam z mojego serwera uniwersyteckiego i nie mam uprawnień do tworzenia pliku w tych lokalizacjach.

Rameez Hussain
źródło
1
Odpowiedzi wskazują, w jaki sposób uczynić skrypt wykonalnym, ale nie wydają się obejmować tego, jak uczynić go dostępnym. W tym celu utwórz katalog bin - $HOME/bin- jeśli jeszcze go nie masz, dodaj go do ŚCIEŻKI (z przodu). Umieść skrypty (i wszelkie inne programy), które chcesz wykonać bezpośrednio, bez określania nazwy ścieżki tutaj lub dowiązań symbolicznych tutaj, gdzie znajdują się rzeczywiste programy.
Jonathan Leffler
1
Po wykonaniu poniższych odpowiedzi, aby usunąć plik „.sh”, możesz zmienić nazwę pliku: mv example.sh examplea następnie examplepowinien działać samodzielnie.
PJ Brunet,

Odpowiedzi:

434

Dodaj „shebang” u góry pliku:

#!/bin/bash

I uczyń swój plik wykonywalnym ( chmod +x script.sh).

Na koniec zmodyfikuj ścieżkę, aby dodać katalog, w którym znajduje się skrypt:

export PATH=$PATH:/appropriate/directory

(zazwyczaj chcesz $HOME/binprzechowywać własne skrypty)

fge
źródło
Hej dzięki za odpowiedź. Próbowałem tego. Teraz mogę uruchomić go bez polecenia „sh”. Ale nadal muszę poprzedzić polecenie „./”, czego nie chcę. :)
Rameez Hussain
5
Zobacz komentarze na temat ścieżki. Musisz umieścić skrypt w katalogu, który musisz dołączyć do ŚCIEŻKI.
fge
2
w moim przypadku nie zadziałało. ale source script.shdziałało dobrze, a raczej source <filename_without_any_extension_type>
MycrofD
4
source ./my-cool-script(lub . ./my-cool-script) zanieczyści bieżącą sesję powłoki dowolnymi zmiennymi zdefiniowanymi w skrypcie. Sourcingu nie należy używać, chyba że chcesz jawnie zmodyfikować sesję powłoki, ustawiając zmienne środowiskowe, zmieniając katalog itp. Naprawdę okropne błędy mogą spowodować inaczej, ponieważ zmienne z jednego skryptu, jeśli zostaną wykonane za pomocą sourcingu, mogą wpłynąć na wykonanie innego skryptu.
Daniel Waltrip,
3
Jeśli masz pewność, że folder skryptu znajduje się w ŚCIEŻCE, a bez niego nadal nie działa ./, możesz mieć kolizję nazw. Spróbuj zmienić nazwę.
chorbs
66

Oto niektóre z warunków bezpośredniego używania nazwy skryptu:

  1. Dodaj she-bang (#!/bin/bash)linię na samej górze.
  2. Użycie chmod u+x scriptnamepowoduje, że skrypt jest wykonywalny. (gdzie scriptnamejest nazwa twojego skryptu)
  3. Umieść skrypt w /usr/local/binfolderze.
  4. Uruchom skrypt, używając tylko nazwy skryptu.

Uwaga: Sugerowałem, aby umieścić go w /usr/local/binfolderze, ponieważ najprawdopodobniej będzie to ścieżka już dodana do twojego PATH variable.

Aktualizacja:

Jeśli nie masz dostępu do /usr/local/binfolderu, wykonaj następujące czynności:

  1. Utwórz folder w swoim katalogu domowym i nazwijmy go myscripts.
  2. Wykonaj ls -lartw swoim katalogu domowym, aby zidentyfikować skrypt startowy, którego używa powłoka. Powinno to być .profilealbo .bashrc.
  3. Po zidentyfikowaniu skryptu uruchamiania dodaj następujący wiersz w skrypcie - export set PATH=$PATH:~/myscript.
  4. Po dodaniu zrób skrypt startowy lub wyloguj się i zaloguj ponownie.
  5. Uruchom skrypt za pomocą scriptname.
jaypal singh
źródło
Próbowałem to zrobić, ale nie mam uprawnień dostępu do folderu / usr / local / bin. Używam komputera uniwersyteckiego.
Rameez Hussain
1
Czy możesz mi powiedzieć, co rozumiesz przez „źródło skryptu startowego”?
Rameez Hussain
1
Pozyskanie skryptu startowego oznacza wykonanie go, aby nowo ustawiony parametr zmiennej PATH był pobierany przez powłokę. Można to zrobić, robiąc . .bashrc. To znaczy, po prostu wstaw, .a spacenastępnie nazwę skryptu startowego.
jaypal singh
Nie wiem na czym polega problem z systemem. Stworzyłem nowy skrypt powłoki o nazwie „hello” z po prostu „echo” hello ”. Zmieniłem jego uprawnienia i próbowałem ./hello. To nie działa. mówi
Rameez Hussain
Jakie zmiany wprowadziłeś w skryptach startowych?
jaypal singh
20

Tylko upewnij się, że jest wykonywalny, używając chmod +x. Domyślnie bieżącego katalogu nie ma na PATH, więc musisz go wykonać jako ./script.sh- lub w inny sposób odwołać się do niego kwalifikowaną ścieżką. Ewentualnie, jeśli naprawdę potrzebujesz script.sh, musisz dodać ją do ŚCIEŻKI. (Być może nie masz dostępu do modyfikowania ścieżki systemowej, ale prawie na pewno możesz zmodyfikować ŚCIEŻKĘ własnego bieżącego środowiska.) Zakłada się również, że skrypt zaczyna się od czegoś podobnego#!/bin/sh .

Możesz także użyć aliasu, który nie jest tak naprawdę związany ze skryptami powłoki, ale tylko powłoką i jest prosty:

alias script.sh='sh script.sh'

Co pozwoliłoby ci używać po prostu script.sh(dosłownie - to nie zadziała dla żadnego innego *.shpliku) zamiast sh script.sh.

ziesemer
źródło
Hej! Dzięki za odpowiedź. Próbowałem wcześniej używać aliasów. Ale nic się nie stało. Umieściłem go zaraz po wierszu „#! / Usr / local / bin / bash”. Jak myślisz, co jest nie tak?
Rameez Hussain
1
W skrypcie nie można zdefiniować aliasu - należy go zadeklarować jako część bieżącego środowiska. Więc po prostu uruchom aliaspolecenie w wierszu poleceń powłoki, a wtedy dostępny będzie alias do uruchomienia polecenia.
ziesemer
17

W tym przykładzie plik zostanie wywołany myShell

Przede wszystkim musimy utworzyć ten plik, możemy po prostu zacząć od wpisania:

sudo nano myShell

Zauważ, że nie umieściliśmy .shrozszerzenia? To dlatego, że kiedy uruchamiamy go z terminala, musimy tylko wpisać myShell, aby uruchomić nasze polecenie!

Teraz, w nano, najwyższa linia MUSI być #!/bin/bashwtedy możesz opuścić nową linię przed kontynuowaniem.

Dla celów demonstracyjnych dodam podstawową Hello World!odpowiedź

Więc wpisuję następujące:

echo Hello World!

Następnie mój przykład powinien wyglądać następująco:

#!/bin/bash
echo Hello World!

Teraz zapisz plik, a następnie uruchom następujące polecenie:

sudo chmod +x myShell

Teraz stworzyliśmy plik wykonywalny, do którego możemy go przenieść /usr/bin/za pomocą następującego polecenia:

sudo cp myShell /usr/bin/

Aby upewnić się, że komputer może go poprawnie wykonać, będziemy musieli ponownie uruchomić komputer

użyłem sudo shutdown -r now

Gratulacje! Nasze polecenie jest już gotowe! W terminalu możemy wpisać myShelli należy powiedziećHello World!

potrójny
źródło
1
Nie należy umieszczać własnych plików /usr/bin- wiele systemów dostosowuje się /usr/local/bindo tego celu i rezerwuje /usr/binwyłącznie dla systemu operacyjnego.
tripleee
Nie ma potrzeby tworzenia sudo chmodwłasnego pliku.
tripleee
Nie ma potrzeby ponownego uruchamiania komputera. Co najwyżej powinieneś
zaopatrzyć się
14

Musisz włączyć bit programu dla programu.

chmod +x script.sh

Następnie możesz użyć ./script.sh

Możesz dodać folder do ŚCIEŻKI w swoim .bashrcpliku (znajdującym się w katalogu domowym). Dodaj ten wiersz na końcu pliku:

export PATH=$PATH:/your/folder/here
Uku Loskit
źródło
Zapomniałem wspomnieć, że ustawiłem już odpowiednie uprawnienia. Użyłem polecenia „chmod 755 script.sh”
Rameez Hussain
6

Możesz wpisać sudo install (nazwa skryptu) / usr / local / bin / (co chcesz wpisać, aby wykonać wspomniany skrypt)

np .: sudo install quickcommit.sh /usr/local/bin/quickcommit wprowadź hasło

teraz może działać bez .sh i w dowolnym katalogu

JoelWass
źródło
3

Dodaj . (bieżący katalog) do zmiennej PATH.
Możesz to zrobić, edytując plik .profile.
wstaw następującą linię do pliku .profile
PATH=$PATH:.

Upewnij się, że dodałeś #!/bin/bashlinię Shebang ( ) na początku skryptu i sprawiłeś, że skrypt jest wykonywalny (używa chmod +x <File Name>).

Arpit Tyagi
źródło
0

Oto mój skrypt zapasowy, który da ci pomysł i automatyzację:

Serwer: Ubuntu 16.04 PHP: 7.0 Apache2, Mysql itp ...

# Make Shell Backup Script - Bash Backup Script
    nano /home/user/bash/backupscript.sh
        #!/bin/bash
        # Backup All Start
        mkdir /home/user/backup/$(date +"%Y-%m-%d")
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_rest.zip /etc -x "*apache2*" -x "*php*" -x "*mysql*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_apache2.zip /etc/apache2
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_php.zip /etc/php
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_mysql.zip /etc/mysql
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_rest.zip /var/www -x "*html*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_html.zip /var/www/html
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/home_user.zip /home/user -x "*backup*"
        # Backup All End
        echo "Backup Completed Successfully!"
        echo "Location: /home/user/backup/$(date +"%Y-%m-%d")"

    chmod +x /home/user/bash/backupscript.sh
    sudo ln -s /home/user/bash/backupscript.sh /usr/bin/backupscript

zmień / home / user na katalog użytkownika i wpisz: backupscript w dowolnym miejscu terminala, aby uruchomić skrypt! (zakładając, że / usr / bin jest na twojej ścieżce)

Tarik
źródło
0

Wpisz "#!/bin/sh"przed skryptem. Następnie zapisz jak script.shna przykład. skopiuj go do $HOME/bin lub $HOME/usr/bin
Katalog może być różny dla różnych dystrybucji Linuksa, ale kończą się na 'bin' i znajdują się w katalogu domowym cd $HOME/bin lub $HOME/usr/bin
Typie. chmod 700 script.sh
Możesz go uruchomić, wpisując run.sh na terminalu. Jeśli to nie działa, spróbuj chmod +x run.sh zamiast chmod 700 run.sh

Gyan Prakash
źródło
Części tej odpowiedzi, które nie przekształcają informacji z bardzo starych istniejących odpowiedzi, są mylone.
tripleee
0

Ustaw dowolny plik jako wykonywalny


Załóżmy, że masz plik wykonywalny o nazwie migrate_linux_amd64 i chcesz uruchomić ten plik jako polecenie takie jak „migruj”

  1. Najpierw przetestuj plik wykonywalny z lokalizacji pliku:
[oracle@localhost]$ ./migrate.linux-amd64 
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version
  1. Upewnij się, że masz uprawnienia do pliku,
    -rwxr-xr-x 1 oracle oinstall 7473971 May 18 2017 migrate.linux-amd64
    jeśli nie, uruchomchmod +x migrate.linux-amd64

  2. Następnie skopiuj plik do /usr/local/bin. Ten katalog jest własnością root, użyj sudo lub przełącz się na root i wykonaj następującą operację

sudo cp migrate.linux-amd64 /usr/local/bin
sudo chown oracle:oracle /user/local/bin/migrate.linux.amd64
  1. Następnie utwórz link symboliczny, jak poniżej
sudo ln /usr/local/bin/migrate.linux.amd64 /usr/local/bin/migrate
sudo chown oracle:oracle /usr/local/bin/migrate
  1. Na koniec dodaj / usr / local / bin do swojej ścieżki lub profilu użytkownika
export PATH = $PATH:/usr/local/bin
  1. Następnie uruchom polecenie jako „migruj”
[oracle@localhost]$ migrate
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version
Guru
źródło
-1

Właśnie:

/path/to/file/my_script.sh
DimiDak
źródło