Seguindo seu pergunta anterior , parece que você quer ambos algum texto não interpretado e algum texto interpretado indo para um arquivo. Nesse caso, use dois cat
s diferentes (ou echo
s):
cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF
Há algumas coisas acontecendo aqui: em primeiro lugar, o heredoc sintaxe com <<
. Se você incluir aspas nessa sequência terminadora, como na primeira acima, o heredoc inteiro não será interpretado - sem parâmetros e sem substituições. Se você não usa aspas, como no segundo cat
acima, variáveis como $1
serão substituídas por seus valores e as substituições de comando serão incluídas o texto. Você escolhe entre citar a string "EOF" ou não se você quer ou não substituições.
Para colocar os dois cat
s no mesmo arquivo, estamos usando o >>
redirecionamento para o segundo (e qualquer posterior) redirecionamentos: isso significa anexar ao arquivo. Para o primeiro, usamos um único >
para limpar o arquivo e começar de novo.
Observe que, mesmo quando as variáveis são substituídas , qualquer variável adicional sinais de dólar no valor dessa variável não são re-substituídos:
foo='$bar'
bar=hello
cat <<EOF
$foo
EOF
produzirá:
$bar
sem substituir o valor de $bar
.
No entanto, se você está fornecendo um "$" no argumento para este script inteiro, você precisa escapar dele na linha de comando ou colocar a coisa toda entre aspas simples. Alternativamente, substituição de comandos como em sua outra pergunta permite colocar o conteúdo de um arquivo inteiro diretamente, incluindo qualquer cifrão no conteúdo do arquivo. Certifique-se de citar a string de substituição aqui:
oo.sh "$(cat myfile)"
obterá o corpo de myfile
como $1
e poderá usar cat
ou echo
conforme necessário. As mesmas limitações da minha resposta se aplicam: há um limite de quanto tempo os argumentos da linha de comando podem ser, e se o arquivo puder ficar mais longo do que isso, você deve encontrar outra abordagem. Você pode descobrir qual é o limite no seu sistema com getconf ARG_MAX