Kiedy chcę uruchamiać .sh
pliki w Terminalu, muszę je umieścić sh
przed nimi.
Czy jest jakiś sposób, aby tego uniknąć, a tym samym zaoszczędzić pisania?
Kiedy chcę uruchamiać .sh
pliki w Terminalu, muszę je umieścić sh
przed nimi.
Czy jest jakiś sposób, aby tego uniknąć, a tym samym zaoszczędzić pisania?
Odpowiedzi:
Jeśli uruchamiasz swój skrypt z powłoki, tak naprawdę nie potrzebujesz #!/bin/sh
shebang, jak opisano w tej odpowiedzi - każdy system uniksopodobny, którego używałem, w tym OS X, ustawi się domyślnie, /bin/sh
jeśli nie zostanie określony konkretny interpreter ( ale to dobry pomysł, ponieważ inne niż powłoki nie będą wiedziały, jak wykonać skrypt, chyba że podasz shebang.)
Nie potrzebujesz również .sh
rozszerzenia. Ci zrobić konieczność ustalenia uprawnień wykonywalnych, np
$ chmod +x script.sh
(Jest $
to znak zachęty powłoki; używam go do zilustrowania poleceń wydawanych interaktywnej powłoce. Nie wpisuj jej!)
Myślę jednak, że masz problem z tym, że utworzyłeś skrypt, np. script.sh
W bieżącym katalogu, i próbujesz go wykonać, po prostu pisząc script.sh
. na przykład
$ cat >script.sh
echo hello, world
^D
$ chmod +x script.sh
$ script.sh
-bash: script.sh: command not found
( ^D
oznacza control- D. Ten zapis znajdziesz w wielu artykułach o używaniu Uniksa).
Fakt, że script.sh
w tym przypadku jest to skrypt powłoki, to tylko połowa problemu; Twoim problemem jest to, że domyślnie powłoka nie przeszuka programu w bieżącym katalogu. Działa to jednak:
$ sh script.sh
hello, world
ponieważ sh
bierze skrypt za argument.
Możesz wykonać skrypt - lub ponownie dowolny plik wykonywalny - w bieżącym katalogu, jeśli jest oznaczony jako plik wykonywalny (tj. chmod +x
), Określając, że chcesz uruchomić ten w bieżącym katalogu:
$ ./script.sh
hello, world
Możesz także przenieść skrypt do katalogu na swoim PATH
. Polecam /usr/local/bin
to, jeśli skrypt ma być używany w całym systemie lub bin
katalog w domu, jeśli skrypt jest tylko dla Ciebie. Ten ostatni wymaga dodania $HOME/bin
, które rozwija się do nowego katalogu bin, do twojego PATH
poprzez dodanie następujących linii do twojego .profile
w katalogu domowym:
PATH=$HOME/bin:$PATH
export PATH
Na koniec możesz, jeśli chcesz, faktycznie dodać bieżący katalog do swojego PATH
, co pozwoli ci po prostu przejść do katalogu zawierającego script.sh
- lub dowolny inny plik wykonywalny - i wpisać
$ script.sh
wykonać to. Jednak nie zalecam tej praktyki , ponieważ osoba atakująca może teraz nakłonić cię do uruchomienia dowolnego pliku wykonywalnego, upuszczając skrypt wykonywalny (o nazwie, powiedzmy, ls
) w katalogu, w którym się znajdziesz. Jeśli jednak naprawdę chcesz to zrobić, po prostu dodaj do swojego .profile
:
PATH=.:$PATH
export PATH
sl
i lls
czy l
... to znaczy, literówek. Wystarczy wyjechać .
poza $PATH
. Ponadto niekoniecznie (lub nie należy) ufać wszystkim w systemie. Na przykład, załóżmy, że istnieje jakiś exploit, który umożliwia atakującemu upuść dowolny plik do jakiegoś katalogu, ale muszą Państwo wykonać ten plik, aby eskalować do lepszego wykorzystania (np, zbierać dane i telefon domowy). Obrona w głębi!
/tmp
innym katalogu z możliwością zapisu na całym świecie.
/tmp
i in. przyjechać z terytorium.
Nie musisz dzwonić, sh
jeśli plik skryptu jest oznaczony jako wykonywalny. W takim przypadku możesz nazwać to moim imieniem, tak jak każde inne polecenie z istniejącej powłoki.
Aby być w pełni poprawnym, będziesz chciał zrobić dwie rzeczy:
Zmodyfikuj skrypt, tak aby zawierał dyrektywę shebang na górze skryptu:
#!/bin/sh
... To powiedziałoby powłoce, którego interpretera użyć do uruchomienia skryptu; w tym przypadku /bin/sh
plik wykonywalny.
Oznacz skrypt jako wykonywalny za pomocą komendy chmod :
chmod u+x scriptname.sh
Po wykonaniu obu tych czynności możesz uruchomić skrypt, wpisując nazwę pliku skryptu w wierszu polecenia. Musisz znajdować się w tym samym katalogu co skrypt, chyba że wykonasz dodatkowy krok dodawania folderu zawierającego do zmiennej PATH . Jeśli nie obchodzi Cię, która powłoka uruchamia skrypt, nie musisz określać kroku pierwszego, sh
ale często lepiej jest być precyzyjnym i ustawić „shebangsh”.
/bin/sh
, chociaż nie ranią.
ksh
skryptów na HP-UX - ale dobrze wiedzieć, że nie jest to absolutnie konieczne.
exec
syscall, dostaniesz ENOEXEC
(błąd formatu exec ). Przepraszam za to, @bmike, @ ChrisW.Rea. Zamierzam teraz edytować moją odpowiedź.