Jak działa wywoływanie poleceń w powłoce
Nie, to nie jest polecenie. Sposób, w jaki działają powłoki, polega na wpisaniu wiersza tekstu. Pierwsze słowo będzie traktowane jako polecenie, a jeśli polecenie nie jest jednym z poleceń wbudowanych w powłokę, powłoka sprawdzi wszystkie lokalizacje wymienione w PATH
zmiennej środowiskowej .
Co się stanie, jeśli polecenie, które chcesz uruchomić, znajduje się w tym samym katalogu, w którym aktualnie się znajdujesz, ale ten katalog nie znajduje się na liście PATH
katalogów? Właśnie wtedy musisz użyć ./
. Jest to dokładnie to samo co robisz /bin/bash
- mówisz powłoce, gdzie znajduje się żądane polecenie, pełną ścieżkę do niego. A w przypadku ./ mówisz do powłoki „zajrzyj do tego katalogu”. Tak ważną częścią jest to, że musisz znajdować się w tym samym katalogu, w którym znajduje się plik.
Oczywiście, aby faktycznie uruchomić plik wykonywalny, musi on mieć ustawiony bit pliku wykonywalnego, więc musisz to zrobić chmod +x ./my_file
.
Więc ważne kroki:
cd
gdzie zapisałeś plik; jeśli jest w ~/Downloads
środku, tocd ~/Downloads
- Uruchom
chmod +x ./truecrypt-7.2-setup-x86
, mówi „zrób plik truecrypt-7.2-setup-x86, który jest w tym katalogu wykonywalny”
- A teraz rób
sudo ./truecrypt-7.2-setup-x86
Zauważ, że użycie ./
nie jest przypadkowym zachowaniem, ale w rzeczywistości jest standardem określonym przez standard Przenośnego Systemu Operacyjnego (znany również jako POSIX) , w szczególności zobacz sekcję „Wyszukiwanie i wykonywanie poleceń”.
Odtworzenie błędu
$ # my script is in ~/Downloads folder
$ stat -c "%n" /home/xieerqi/Downloads/my_script.sh
/home/xieerqi/Downloads/my_script.sh
$ # if I run sudo ./my_script.sh, we get an error
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
$ # of course the command not found because file is not in ./, not in this dir
$ # this is not sudo's problem
$ # but sudo does indeed show the same error even if you're in same directory
$ cd ./Downloads/
$ sudo ./my_script.sh
[sudo] password for xieerqi:
sudo: ./my_script.sh: command not found
UWAGA : podany przez komunikat o błędzie sudo
jest oczywiście mylący, więc należy o tym pamiętać; należy jednak pamiętać, że nie było to sedno pytania zadawanego przez OP.
Dokumentacja i referencje
Z bash
podręcznika 4.3 sekcja „WYKONYWANIE POLECEŃ”:
Jeśli nazwa nie jest ani funkcją powłoki, ani wbudowanym i nie zawiera ukośników, bash przeszukuje każdy element PATH w poszukiwaniu katalogu zawierającego plik wykonywalny o tej nazwie.
Od Dlaczego potrzebujesz ./ (kropka-ukośnik) przed nazwą skryptu, aby uruchomić go w bash? :
Działa z ./, ponieważ POSIX określa, że nazwa polecenia zawierająca / będzie używana bezpośrednio jako nazwa pliku, co pomija wyszukiwanie w $ PATH. Możesz użyć pełnej ścieżki dla tego samego efektu, ale ./ jest krótszy i łatwiejszy do napisania.
./
Część komendy mówi „Spójrz w bieżącym katalogu i wykonać polecenia«truecrypt-7.2-setup-x86»stąd”. Musisz uruchomić to polecenie z katalogu, w którym rozpakowałeś plik.