Pergunta

Ou eu perdi alguma reação ou backlashing não parece funcionar com muita lote de programador.

$ echo "hello1-`echo hello2-\`echo hello3-\`echo hello4\`\``"

hello1-hello2-hello3-echo hello4

Desejado

hello1-hello2-hello3-hello4-hello5-hello6-...
Foi útil?

Solução

Usar $(commands) em vez de:

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4

$(commands) Faz a mesma coisa que os backticks, mas você pode aninhá -los.

Você também pode estar interessado em expansões da faixa de bash:

echo hello{1..10}
hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10

Outras dicas

Se você insistir em usar backticks, a seguir pode ser feita

$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"

você tem que colocar barragem, \\ \\\\ \\\\\\\\ por 2x e assim por diante, é muito feio, use $(commands) como outros sugeridos.

Sempre que você quiser avaliar um uso de comando command substitution:

$(command)

Sempre que você quiser avaliar um uso da expressão aritmética expression substitution:

$((expr))

Você pode aninhar isso assim:

Digamos que o arquivo1.txt tenha 30 linhas de comprimento e o arquivo2.txt tem 10 linhas de comprimento, do que você pode avaliar uma expressão como esta:

$(( $(wc -l file1.txt) - $(wc -l file2.txt) ))

que emitiria 20 (a diferença no número de linhas entre dois arquivos).

É muito mais fácil se você usar o Bash's $(cmd) Sintaxe de substituição de comando, que é muito mais amigável para ser aninhado:

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4

Às vezes, o ninho de backtick pode ser substituído por xargs e tubos

$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1
hello1 hello2 hello3 hello4

A desvantagem desta solução é:

  • Todos os argumentos devem ser fornecidos na ordem inversa (4 → 1);
  • Todos os argumentos se tornam separados pelo espaço (solucionável com tr):

    $ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1 | tr ' ' '-'
    hello1-hello2-hello3-hello4
    


Vamos mostrar um caso de uso real.

A seguir, os comandos funcionam em Bash, mas não no TCSH (o ninho de backtick não é muito bom no TCSH)

$ ls $(dirname $(which bash))
$ ls `dirname \`which bash\``

Eles podem ser substituídos com

$ which bash | xargs dirname | xargs ls
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top