Źle interpretujesz stronę podręcznika. Po pierwsze, część dotycząca --sygnalizowania końca opcji nie ma znaczenia dla tego, co próbujesz zrobić. Do -cnadpisania 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 $0i $1jawnie, 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ż $0normalnie 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 envzamiast 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 envw 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.