# possibility 1:
echo "line 1" >> greetings.txt
echo "line 2" >> greetings.txt
# possibility 2:
echo "line 1
line 2" >> greetings.txt
# possibility 3:
cat <<EOT >> greetings.txt
line 1
line 2
EOT
Estou escrevendo um script bash para procurar um arquivo, se ele não existir. Em seguida, crie-o e anexe-o a ele:
Host localhost
ForwardAgent yes
Então, "line then new line 'tab' then text"
, acho que é um formato sensível.
Eu sei que você pode fazer isso:
cat temp.txt >> data.txt
Mas parece estranho desde suas duas linhas. Existe uma maneira de acrescentar que neste formato:
echo "hello" >> greetings.txt
printf '%s\n %s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt
Ou, se for uma guia literal que você deseja (em vez dos quatro espaços da sua pergunta):
printf '%s\n\t%s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt
Você pode obter o mesmo efeito com echo
, mas exatamente como varia de implementação para implementação, enquanto printf
é constante.
echo -e "Hello \nWorld \n" >> greetings.txt
Outra abordagem é usar tee
tee -a ~/.ssh/config << END
Host localhost
ForwardAgent yes
END
Algumas linhas de escolha da página de manual de tee
:
The tee utility copies standard input to standard output, making a copy in zero or more files.
-a - Append the output to the files rather than overwriting them.
SED pode anexar uma linha ao final de um arquivo da seguinte forma:
sed -i '$ a text to be inserted' fileName.file
$
seleciona o final do arquivo, o a
diz para anexar e, depois disso, o texto a ser inserido. Então, claro, o nome do arquivo.
Fonte:
link
========== EDITAR ============
Esta abordagem tem algum benefício adicional do que outras soluções?
Sim, essa abordagem tem o benefício adicional de acrescentar a qualquer arquivo retornado em uma pesquisa, como:
find . -name "*.html" -exec sed -i '$ a </html>' {} \;
Eu usei o exemplo acima para inserir a tag html final que estava faltando em cada página html dentro de vários diretórios.
===================================
Eu usei o sed porque ele pode ser usado com o sudo. Por exemplo:
sudo sed -i '$ a text to be inserted' fileName.file
a alternativa é muito feia como:
sudo bash -c "echo a text to be inserted >> fileName.file"
e ainda mais feio quando feito com ssh.
Outro forro é:
echo "Greetings 1" >> greetings.txt && echo "Greetings 2" >> greetings.txt
Eu prefiro que a opção -e
seja considerada, pois isso dá mais controle:
echo -e "Greeting 1\nGreetings 2\n" >> greetings.txt
Pode-se emular cat >> out.txt
com Perl ou Python para obter o mesmo efeito. Perl:
perl -e 'open(fh,">>","./out.txt");while(<>){printf(fh "%s",$_)};close(fh);'
E Python:
python -c 'import sys;f=open(sys.argv[1],"a");l=[i for i in sys.stdin];f.write("".join(l))' out.txt
Note que para python você terá que pressionar Ctrl + D duas vezes. Consulte a pergunta relacionada no stackoverflow para obter mais informações.
Aqui está um exemplo para anexar várias linhas em um arquivo:
{
echo ' directory "/var/cache/bind";'
echo ' listen-on { 127.0.0.1; };'
echo ' listen-on-v6 { none; };'
echo ' version "";'
echo ' auth-nxdomain no;'
echo ' forward only;'
echo ' forwarders { 8.8.8.8; 8.8.4.4; };'
echo ' dnssec-enable no;'
echo ' dnssec-validation no;'
} >> your_file.txt
Além da resposta principal, caso o arquivo precise de permissões de superusuário, apenas adicionar sudo
na frente de echo
não funcionará.
Isso ocorre porque o shell quebra os comandos e, embora echo
tenha sido executado como root, mas >>
foi executado com privilégios normais.
Isso funcionará para o superusuário:
sudo su -c "echo 'Line 3' >> greetings.txt"