Cómo agregar varias líneas a un archivo con bash, con "-" delante de la cadena

9

Pregunta muy similar a Cómo agregar varias líneas a un archivo con bash pero quiero comenzar con el archivo --y también agregarlo al archivo, si es posible.

printf "--no-color\n--format-doc\n--no-profile\n" >> ~/.rspec-test

El problema es iniciar el archivo con "-" me da un:

-bash: printf: --: invalid option
printf: usage: printf [-v var] format [arguments]

¿Hay alguna forma de escapar del --? ¿Hay alguna alternativa? No estoy seguro de cómo hacer varias líneas usando echo, y catno es una buena opción, me gustaría tenerlo en un script automatizado.

SuckerForMayhem
fuente

Respuestas:

17

La mayoría de los comandos que aceptan --foocomo opción también aceptan --por sí mismos como un marcador de "fin de opciones, inicio de argumentos", por lo que podría hacer:

printf -- "--no-color\n--format-doc\n--no-profile\n" >> ~/.rspec-test

Pero la respuesta más específica a su ejemplo exacto es que el primer argumento para printf es un especificador de formato, y está haciendo las cosas más difíciles de lo necesario al no usar printf para sus capacidades de formateo. Esta sería una mejor manera de hacer lo que quieres:

printf "%s\n" --no-color --format-doc --no-profile >> ~/.rspec-test

Eso le dice a printf que tome cada argumento que obtenga e imprima, seguido de una nueva línea. Es más fácil que repetirlo \nusted mismo y evita el --problema principal al que se enfrentaba. Y elimina la necesidad de escapar de cualquier %señal que puedan contener sus cadenas.

En cuanto a cómo hacer múltiples líneas echo, puede usar:

echo -ne "--no-color\n--format-doc\n--no-profile\n" >> ~/.rspec-test

O, mucho más portátil:

{ echo --no-color; echo --format-doc; echo --no-profile; } >> ~/.rspec-test

O usando cat junto con un documento aquí:

cat >>.rspec-test <<EOF
--no-color
--format-doc
--no-profile
EOF
Godlygeek
fuente