Eu gostaria de copiar o conteúdo de uma variável (aqui chamada var
) em um arquivo.
O nome do arquivo é armazenado em outra variável destfile
.
Estou tendo problemas para fazer isso. Aqui está o que tentei:
cp $var $destfile
Eu também tentei a mesma coisa com o comando dd ... Obviamente o shell pensou que $var
se referia a um diretório e então me disse que o diretório não foi encontrado.
Como faço para contornar isso?
$var
especificar um nome de arquivo ou algum texto que devem ser gravados em um arquivo? Se especificar um texto, qual é o nome do arquivo no qual você gostaria de escrever esse conteúdo?$destdir
deva ser nomeado$destfile
para não enganar ... O nome$destdir
sugere que ele especifica um diretório em vez de um arquivo. Isso tornaria toda a sua questão direta e fácil de entender.Respostas:
Use o
echo
comando:Os
if
testes que$destdir
representam um arquivo.O
>
anexa o texto após truncar o arquivo. Se você deseja apenas anexar o texto$var
ao conteúdo existente do arquivo, use>>
:O
cp
comando é usado para copiar arquivos (para arquivos), não para gravar texto em um arquivo.fonte
]
no"$destdir"]
.echo
também adiciona uma nova linha à sua variável.$var
for-e text to append
, e realmente não escreve o-e
echo $var
depender do shell para expandir sua variável, ele não funciona muito bem com coisas como espaço em branco e caracteres especiais. Você pode usarperl -e 'print($ENV{var})'
, em vez disso, e ele produzirá precisamente o valor da variável.echo
tem o problema de que sevar
contiver algo parecido-e
, será interpretado como um flag. Outra opção éprintf
, masprintf "$var" > "$destdir"
irá expandir quaisquer caracteres de escape na variável, portanto, se a variável contiver barras invertidas, o conteúdo do arquivo não corresponderá. No entanto, comoprintf
apenas interpreta barras invertidas como escapes na string de formato, você pode usar o%s
especificador de formato para armazenar o conteúdo exato da variável no arquivo de destino:printf "%s" "$var" > "$destdir"
fonte
echo "$var" > destfile
errado.printf
é melhor, siga em frente.Nenhuma das respostas acima funciona se sua variável:
-e
-n
-E
\
seguido por umn
e assim eles não podem ser confiados para conteúdos de string arbitrários.
No bash, você pode usar "here strings" como:
Conforme observado no comentário abaixo, a resposta de @Trebawa (formulada na mesma sala que a minha!) Usando
printf
é uma abordagem melhor.fonte
printf
overcat
é que o primeiro é um shell embutido que sempre executa mais rápido do que um binário externo.Se bem entendi, você deseja copiar
$var
em um arquivo (se for uma string).fonte
cp
comando fará com que o shell interprete o primeiro argumento como o nome de um arquivo ou diretório.$var
entre aspas, o conteúdo do arquivo não é 100% igual ao conteúdo de $ var em alguns casos. Por exemplo, ao "ecoar" vars que contêm chaves RSA, você obtém uma chave inválida no arquivo.$var
contiver espaços ou-e
Quando você diz "copiar o conteúdo de uma variável", essa variável contém um nome de arquivo ou contém o nome de um arquivo?
Estou supondo por sua pergunta que
$var
contém o conteúdo que você deseja copiar para o arquivo:Isso irá ecoar o valor de $ var em um arquivo chamado $ destdir. Observe as citações. Muito importante ter "$ var" entre aspas. Também para "$ destdir" se houver um espaço no nome. Para anexar:
fonte
var
contiver-e
echo
encerrar sua lista de opções, assim resolve o problema levantado por @Eric:echo -- "$var" >> "$destfile"
Todos os itens acima funcionam, mas também têm que solucionar um problema (escapes e caracteres especiais) que não precisa ocorrer em primeiro lugar: caracteres especiais quando a variável é expandida pelo shell. Só não faça isso (expansão de variável) em primeiro lugar. Use a variável diretamente, sem expansão.
Além disso, se sua variável contém um segredo e você deseja copiar esse segredo em um arquivo, você pode querer não ter expansão na linha de comando, pois o rastreamento / eco de comando dos comandos do shell pode revelar o segredo. Significa que todas as respostas que usam
$var
na linha de comando podem ter um risco potencial de segurança, expondo o conteúdo da variável para rastreamento e registro do shell.Usa isto:
Isso significa que, no caso da questão do OP:
fonte