escrevendo um comando em um arquivo

1

Estou tendo dificuldade em escrever um comando em um arquivo usando um script bash (NÃO a saída do comando + não quero que o comando seja executado) Eu quero que o arquivo tenha apenas run $(python -c "print('A'*256)") dentro dele.

Eu tentei adicioná-lo em uma variável e, em seguida, passá-lo para um arquivo por echo, isso não funcionou.

Eu também tentei algo como echo "run $(python -c "print('A'*256)")" > file.txt

Também não funcionou, eu realmente tenho alguns erros, então eu assumi que o problema é por causa das múltiplas citações duplas, então eu os alterei para aspas simples. Isso me deu essa saída na execução do arquivo

Então, basicamente, ignorou $(python -c "print('A'*256)") completamente.

Alguma ideia de como resolver isso?

    
por Jack 04.11.2017 / 23:19

3 respostas

3

A maneira mais confiável de obter sequências arbitrárias em redirecionamentos é usar um documento aqui :

cat > file.txt <<'EOT'
run $(python -c "print('A'*256)")
EOT

Isso colocará essa linha única exatamente como está em file.txt . O texto até EOT é dado a cat como sua entrada padrão e cat apenas o expulsa novamente para ser redirecionado. O shell continuará lendo o documento até que EOT apareça no início da linha, para que você possa colocar várias linhas de uma só vez se quiser (se EOT aparecer assim em sua string, use outra coisa - o delimitador é arbitrário).

Como o delimitador é citado no topo, nenhuma expansão é executada no corpo do documento aqui 1 e todos os seus caracteres são passados intactos. O comportamento de here-documents é especificado por POSIX e funciona em qualquer shell.

1 Houve um bug em algumas versões mais antigas do Bash que executaram algumas expansões em certos casos , mas você não vai acertar isso aqui.

    
por 05.11.2017 / 01:30
0

Tente usar caracteres de escape:

echo run \$\(python -c \"print\(\'A\'*256\)\"\) > file.txt

    
por 05.11.2017 / 00:17
0

Uma string com * ambos os tipos de aspas é sempre difícil de manipular. Existem três abordagens:

  • Alterne entre os dois tipos de citações. Coloque as aspas duplas ( " ) dentro de aspas simples ( ' ) e vice-versa.

    Primeiro, divida sua sequência em três partes:

    run $(python -c "print ('A'*256) ")
    ↑---------1----------↑ ↑---2---↑ ↑3↑
    

    onde a primeira e a terceira parte não contêm aspas simples, e a segunda parte não tem aspas duplas. Em seguida, cite-os adequadamente:

    echo 'run $(python -c "print'"('A'*256)"'")'
         ↑----------1-----------↑↑----2----↑↑-3↑
    

    apenas executando os substrings juntos.

  • Cite a string com aspas duplas, e, em seguida, use \" para cada aspas duplas literais que você quer ter ecoado. Substitua também $ por \$

    echo "run \$(python -c \"print('A'*256)\")"
    
  • Uma abordagem que funciona apenas no bash é a citação da string com $'…' . Dentro dessa string, você pode escapar de aspas simples com \' :

    echo $'run $(python -c "print(\'A\'*256)")'
    

É claro que a parte > file.txt é como você esperaria.

    
por 05.11.2017 / 00:08

Tags