2013-06-22 16 views
9
$ bash -c 'echo "0 is $0 1 is $1"' abc def 
0 is abc 1 is def 

$ echo 'echo "0 is $0 1 is $1"' > bashtest 

$ bash bashtest abc def 
0 is bashtest 1 is abc 

Drugi bieg jest odpowiednikiem gdybym odwrócił testu bash w shellscript z shebang a następnie prowadził ją bezpośrednio ...

Zasadniczo zastanawiam się, dlaczego abc nie zawsze jest $1. Staje się $0 po uruchomieniu z bash -c.

Odpowiedz

10

Ja też tego nie wiedziałem. Ale man page wspomina go:

-c ciąg: Jeśli opcja -c, to polecenia odczytywane są z ciąg. Jeśli po ciągu występują argumenty, są one przypisane do parametrów pozycyjnych, zaczynając od $ 0.

Sekcja ARGUMENTS ma jeszcze bardziej szczegółowe wyjaśnienie:

ARGUMENTY

Jeśli argumenty pozostają po przetworzeniu opcji i ani -c, ani opcja -s został podany, przyjmuje się, że pierwszym argumentem jest nazwa pliku zawierającego polecenia powłoki z zakresu . Jeśli bash zostanie wywołany w ten sposób , $ 0 jest ustawione na nazwę pliku, a parametry pozycyjne - są ustawione na pozostałe argumenty. Bash odczytuje i wykonuje polecenia z tego pliku, a następnie kończy działanie. Status wyjścia Basha to wyjście z ostatniego polecenia wykonanego w skrypcie. Jeśli nie zostaną wykonane żadne komendy, stan wyjścia wynosi 0. Najpierw próbuje się otworzyć plik w bieżącym katalogu, a jeśli żaden plik nie zostanie znaleziony, to powłoka przeszuka katalogi w PATH dla skryptu.

+0

To rozsądne, tak myślę. Na pewno nie mają dobrego produktu do ustawienia "0 $". Powinienem był po prostu przejrzeć stronę podręcznika; wstyd mi. –

+0

@janos Thx do edycji! to naprawdę sportowiec !! – hek2mgl

+0

@janos Naprawdę fajny artykuł. :) Chciałbym spędzić komentarz. Mam tylko konto "google +". Nie możesz zezwolić na anonimowe komentarze? Uwaga będzie przez chwilę AFK, ale wróć tu później ... – hek2mgl

Powiązane problemy