Jeśli piszę
::
w bash shell otrzymuję:
-bash: ::: command not found
Ale tylko jeden :
powoduje brak wyników. Dlaczego to?
command-line
bash
NerdOfLinux
źródło
źródło
Odpowiedzi:
:
Shell wbudowaną vs nieistniejące::
:
Powłoka wbudowane polecenie istnieje (zwróć uwagę na różnicę pomiędzy zewnętrznym i wbudowanych komend ), który nic nie robi; po prostu zwraca sukces, tak jaktrue
polecenie.:
Wbudowany jest standardowe i zdefiniowane przez standard POSIX , gdzie jest znany również jako „narzędzia” zerowej. Jest często używany do testowania lub uruchamiania nieskończonych pętli jak wwhile : ; do ...;done
Jednak
::
- dwa znaki dwukropka razem - są interpretowane jako jedno „słowo” dla powłoki i zakłada się, że jest to polecenie wprowadzone przez użytkownika. Powłoka przejdzie proces sprawdzania wbudowanych, a następnie dowolnego katalogu wPATH
zmiennej pod kątem istnienia tego polecenia. Ale nie ma wbudowanego::
ani zewnętrznego polecenia::
. Dlatego powoduje to błąd.Jaki jest typowy format błędu?
Zatem to, co widzisz, nie jest 3 dwukropkami, ale to, co wpisałeś, wkleiło się do standardowego formatu błędu.
Zauważ też, że
:
mogą przyjmować argumenty wiersza poleceń, tzn. Legalne jest:W takim przypadku powłoka uzna to za dwa „słowa”, z których jedno jest poleceniem, a drugie parametrem pozycyjnym. To również nie spowoduje błędu! (Zobacz także notę historyczną (w dalszej części tej odpowiedzi) na temat używania
:
parametru z parametrami pozycyjnymi).W muszlach innych niż bash
Pamiętaj, że formatowanie może również różnić się w zależności od powłoki. Dla
bash
,ksh
imksh
zachowanie jest spójne. Na przykład domyślna/bin/sh
powłoka Ubuntu (która jest w rzeczywistości/bin/dash
):gdzie 1 to numer polecenia (odpowiednik numeru wiersza w skrypcie).
csh
dla kontrastu nie generuje żadnego komunikatu o błędzie:W rzeczywistości, jeśli uruchomisz
strace -o csh.trace csh -c ::
, dane wyjściowe śledzenia wcsh.trace
pliku ujawnią, żecsh
kończy się ze statusem wyjścia 0 (bez błędów). Aletcsh
generuje błąd (jednak bez wypisywania swojej nazwy):Komunikaty o błędach
Ogólnie rzecz biorąc, pierwszym elementem w komunikacie o błędzie powinien być proces lub funkcja wykonująca (powłoka próbuje wykonać
::
, dlatego komunikat o błędzie pochodzi z powłoki). Na przykład tutaj proces wykonawczy tostat
:W rzeczywistości POSIX definiuje funkcję perror () , która zgodnie z dokumentacją przyjmuje argument łańcuchowy, a następnie wyświetla dwukropek komunikat o błędzie, a następnie znak nowej linii. Zacytować:
Argumentem łańcuchowym
perror()
technicznie może być cokolwiek, ale oczywiście dla jasności jest to zazwyczaj nazwa funkcji lubargv[0]
.Z kolei GNU ma swój własny zestaw funkcji i zmiennych do obsługi błędów , z których programista może korzystać
fprintf()
dostderr
strumieniowania. Jak pokazuje jeden z przykładów na połączonej stronie, można zrobić coś takiego:Nota historyczna
W starej powłoce Uniksa i Thompsona
:
użytogoto
instrukcji (która według użytkownika o nazwie Perderabo w tym wątku nie była wbudowaną powłoką). Cytat z instrukcji:Możesz więc zrobić coś takiego, aby stworzyć nieskończony skrypt pętli:
źródło
command.com
i Windows 'cmd.exe
mają podobną, ale odwrotną sytuację::
jest to wyraźnie etykieta goto (a nie polecenie) i często zmienia przeznaczenie jako znak komentarza (np:: This is a comment
.).Ostatni dwukropek jest tylko częścią domyślnego komunikatu „nie znaleziono”:
Powodem, dla którego pojedynczy dwukropek nie produkuje nic,
:
jest prawidłowe polecenie - chociaż nie robi nic (oprócz powrotuTRUE
). ZSHELL BUILTIN COMMANDS
sekcjiman bash
:Czasami zobaczysz to w konstrukcjach takich jak
Zobacz na przykład Jaki jest cel wbudowanego dwukropka?
źródło
Wypróbuj dowolne inne nieistniejące polecenie, a zobaczysz, że
:
służy ono normalnie po angielsku:źródło
Dodany dwukropek jest częścią samego komunikatu o błędzie. Jeśli jeden wpisze
cd ow
, spowoduje tobash: cd: ow: No such file or directory
, co pokazuje, że błąd polega na wstawieniu dodatkowego dwukropka: No such file or directory
źródło
trzeci jest odstępem od formatowania
w bash a
:
jest pustą instrukcją voidźródło
otrzymujesz 3 dwukropki, ponieważ format błędu zawiera dwukropek:
źródło