La maggior parte dei comandi che accettano --foocome opzione accetta anche --da sola come marcatore "fine delle opzioni, inizio degli argomenti", quindi puoi fare:
printf -- "--no-color\n--format-doc\n--no-profile\n" >> ~/.rspec-test
Ma la risposta più specifica al tuo esempio esatto è che il primo argomento di printf è un identificatore di formato e stai rendendo le cose più difficili del necessario non usando printf per le sue capacità di formattazione. Questo sarebbe un modo migliore per fare quello che vuoi:
printf "%s\n" --no-color --format-doc --no-profile >> ~/.rspec-test
Questo dice a printf di prendere ogni argomento che riceve e stamparlo, seguito da una nuova riga. Più facile che ripetere \nte stesso ed evita il --problema principale che stavi affrontando. E rimuove la necessità di sfuggire a qualsiasi %segno che le stringhe potrebbero contenere.
Per quanto riguarda come fare più righe con echo, è possibile utilizzare:
echo -ne "--no-color\n--format-doc\n--no-profile\n" >> ~/.rspec-test
O, molto più portabilmente:
{ echo --no-color; echo --format-doc; echo --no-profile; } >> ~/.rspec-test
O usando cat insieme a qui-doc:
cat >>.rspec-test <<EOF
--no-color
--format-doc
--no-profile
EOF