Źle interpretujesz stronę podręcznika. Po pierwsze, część dotycząca --
sygnalizowania końca opcji nie ma znaczenia dla tego, co próbujesz zrobić. Do -c
nadpisania reszty wiersza poleceń od tego momentu, tak, że nie dzieje się przez obsługi opcji atakujących na wszystkich, co oznacza, że --
zostanie przeniesione na polecenia, nie obsługiwane przez bash jako koniec opcji znacznik.
Drugi błąd polega na tym, że dodatkowe argumenty są przypisywane jako parametry pozycyjne do uruchomionego procesu powłoki, a nie przekazywane jako argumenty do polecenia. Więc to, co próbujesz zrobić, może być wykonane jako:
/bin/bash -c 'echo "$0" "$1"' foo bar
/bin/bash -c 'echo "$@"' bash foo bar
W pierwszym przypadku przekazanie echa parametrów $0
i $1
jawnie, aw drugim przypadku użycie "$@"
do rozwinięcia tak normalnie jak „wszystkie parametry pozycyjne z wyjątkiem 0 $”. Zauważ, że w takim przypadku musimy również przekazać coś do wykorzystania $0
; Wybrałem „bash”, ponieważ $0
normalnie tak właśnie byłoby, ale wszystko inne działałoby.
Jeśli chodzi o przyczyny to zrobić w ten sposób, zamiast po prostu przechodząc żadnych argumentów oddawać bezpośrednio do komendy Państwo listę: uwaga, że dokumentacja mówi „polecenie s odczytywane są z łańcucha”, w liczbie mnogiej. Innymi słowy, ten schemat pozwala na:
/bin/bash -c 'mkdir "$1"; cd "$1"; touch "$2"' bash dir file
Pamiętaj jednak, że lepszym sposobem na osiągnięcie pierwotnego celu może być użycie env
zamiast bash
:
/usr/bin/env -- "ls" "-l"
Jeśli nie potrzebujesz żadnej funkcji udostępnianej przez powłokę, nie ma powodu, aby z niej korzystać - użycie env
w tym przypadku będzie szybsze, prostsze i mniej pisania. I nie musisz myśleć tak ciężko, aby upewnić się, że bezpiecznie poradzi sobie z nazwami plików zawierającymi metaznaki powłoki lub białe znaki.