Działa, ponieważ domyślnie plik wykonywalny przyjmuje się jako skrypt / bin / sh. To znaczy, jeśli nie określiłeś żadnej konkretnej powłoki - jest to #! / Bin / sh.
// jest po prostu ignorowany w ścieżkach - można uznać, że ma on wartość „single” /.
Możesz więc wziąć pod uwagę, że masz skrypt powłoki z pierwszym wierszem:
/usr/bin/env go run $0 $@ ; exit
Co robi ta linia? Działa „env” z paramentami „uruchom $ 0 $ @”. tam jest polecenie „go”, a „run $ 0 $ @” to argumenty i kończy skrypt. $ 0 to nazwa skryptu. $ @ to oryginalne argumenty skryptu. Więc linia biegnie dalej, która uruchamia ten skrypt z jego argumentami
Istnieją dość interesujące szczegóły, jak wskazano w komentarzach, że dwa ukośniki są zdefiniowane w implementacji, a skrypt ten stałby się poprawny POSIX, gdyby podał trzy lub więcej ukośników. Zobacz http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html, aby uzyskać szczegółowe informacje na temat tego, w jaki sposób ukośniki powinny być obsługiwane w ścieżkach.
Zauważ też, że istnieje inny błąd w skrypcie: $ @ zamiast tego poprawne jest użycie „$ @”, ponieważ w przeciwnym razie, jeśli jakikolwiek parametr zawiera spacje, zostanie podzielony na wiele parametrów. Na przykład nie możesz przekazać nazwy pliku ze spacjami, jeśli nie używasz „$ @”
Ten konkretny skrypt oczywiście opiera się na idei, że „//” jest równe „/”
//&>/dev/null;x="${0%.*}";[ ! "$x" -ot "$0" ]||(rm -f "$x";cc -o "$x" "$0")&&exec "$x" "$@"
...