Como ninhar corretamente Backticks
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-...
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