Como anexar várias linhas a um arquivo com bash, com "-" na frente da string

9

Pergunta muito semelhante a Como anexar várias linhas a um arquivo com bash, mas eu quero iniciar o arquivo --e também anexá-lo, se possível.

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

O problema está iniciando o arquivo com "-" fornece:

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

Existe uma maneira de escapar do --? Existem alternativas? Não sei como executar várias linhas usando echo, e catnão é uma boa opção, gostaria de tê-lo em um script automatizado.

SuckerForMayhem
fonte

Respostas:

17

A maioria dos comandos que aceitam --foocomo opção também aceitam --por si só como um marcador "fim de opções, início de argumentos" - para que você possa fazer:

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

Mas a resposta mais específica ao seu exemplo exato é que o primeiro argumento para printf é um especificador de formato, e você está dificultando as coisas do que o necessário, não usando printf para suas habilidades de formatação. Essa seria a melhor maneira de fazer o que você deseja:

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

Isso diz ao printf para pegar cada argumento recebido e imprimi-lo, seguido por uma nova linha. Mais fácil do que repetir a \nsi mesmo e evita o principal --problema que você estava enfrentando. E remove a necessidade de escapar quaisquer %sinais de que suas cordas pode conter.

Quanto a como fazer várias linhas echo, você pode usar:

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

Ou, de maneira muito mais portável:

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

Ou usando o gato junto com um documento aqui:

cat >>.rspec-test <<EOF
--no-color
--format-doc
--no-profile
EOF
godlygeek
fonte