Dando seguimento a sua pergunta anterior , parece que você quer tanto um texto não-interpretada e algum texto interpretado entrar em um arquivo. Nesse caso, use dois cat
s diferentes echo
:
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: primeiro, a sintaxe do heredoc<<
. Se você incluir aspas nessa sequência terminadora, como na primeira acima, todo o heredoc não será interpretado - sem parâmetros e sem substituições. Se você não usar aspas, como no segundo cat
acima, variáveis como $1
serão substituídas por seus valores e substituições de comandos serão incluídas no texto. Você escolhe entre citar a sequência "EOF" ou não, com base em se deseja ou não substituições.
Para colocar os dois cat
s no mesmo arquivo, estamos usando o >>
redirecionamento para o segundo (e mais tarde) redirecionamentos: isso significa anexar ao arquivo. Para o primeiro, usamos um único >
para limpar o arquivo e começar do zero.
Observe que, mesmo quando as variáveis são substituídas , quaisquer cifrões adicionais no valor dessa variável não são re-substituídos:
foo='$bar'
bar=hello
cat <<EOF
$foo
EOF
irá produzir:
$bar
sem substituir $bar
o valor de.
No entanto, se você estiver fornecendo um "$" no argumento para todo esse script, precisará escapá-lo na linha de comando ou incluir tudo entre aspas simples. Como alternativa, a substituição de comandos , como em sua outra pergunta, permite inserir diretamente o conteúdo de um arquivo inteiro, incluindo quaisquer cifrões no conteúdo do arquivo. Certifique-se de citar a cadeia de substituição aqui:
oo.sh "$(cat myfile)"
obterá o corpo de myfile
como $1
e pode então cat
ou echo
como necessário. As mesmas limitações da minha resposta são aplicáveis: há um limite para quanto tempo os argumentos da linha de comando podem durar e se o seu arquivo pode demorar mais do que isso, você deve encontrar outra abordagem. Você pode descobrir qual é o limite no seu sistema comgetconf ARG_MAX
$1
) contém cifrões.' Não se for o primeiro parâmetro da linha de comandos. A substituição foi realizada antes que seu script fosse executado. Você tem que escapar na linha de comando.