Stai interpretando la pagina man in modo errato. In primo luogo, la parte relativa alla --
segnalazione della fine delle opzioni è irrilevante rispetto a ciò che stai cercando di fare. Gli -c
override il resto della linea di comando da quel momento in poi, in modo che non è più in corso è attraverso la gestione delle opzioni di bash a tutti, il che significa che la --
sarebbero passati attraverso il comando, non gestite da bash come un fine di marcatore opzioni.
Il secondo errore è che argomenti aggiuntivi vengono assegnati come parametri posizionali al processo della shell avviato, non passati come argomenti al comando. Quindi, quello che stai cercando di fare potrebbe essere fatto come uno di:
/bin/bash -c 'echo "$0" "$1"' foo bar
/bin/bash -c 'echo "$@"' bash foo bar
Nel primo caso, passando echo i parametri $0
ed $1
esplicitamente, e nel secondo caso, usando "$@"
per espandere normalmente come "tutti i parametri posizionali tranne $ 0". Si noti che in quel caso dobbiamo passare anche qualcosa da usare $0
; Ho scelto "bash" poiché è quello che $0
sarebbe normalmente, ma qualsiasi altra cosa funzionerebbe.
Per quanto riguarda il motivo è fatto in questo modo, invece di passare tutti gli argomenti si danno direttamente al comando vi elenco: nota che la documentazione dice "comando s vengono letti dalla stringa", plurale. In altre parole, questo schema ti consente di fare:
/bin/bash -c 'mkdir "$1"; cd "$1"; touch "$2"' bash dir file
Tuttavia, tieni presente che un modo migliore per raggiungere il tuo obiettivo originale potrebbe essere quello di utilizzare env
piuttosto che bash
:
/usr/bin/env -- "ls" "-l"
Se non hai bisogno di nessuna delle funzionalità fornite da una shell, non c'è motivo di usarla - l'utilizzo env
in questo caso sarà più veloce, più semplice e meno digitazione. E non devi pensarci tanto per essere sicuro che gestirà in modo sicuro nomi di file contenenti metacaratteri di shell o spazi bianchi.