Alguma razão para usar ou ensinar `...` substituição para novos desenvolvimentos?

16

Entendo que a $(...)sintaxe de substituição de comando mais moderna é preferida à `sintaxe antiga , devido à sintaxe de aninhamento e escape mais fácil e menos propensa a erros.

Além disso, parece que a maioria das /bin/shconchas de estilo no uso moderno suporta $(…):

  • bater
  • ash (e, portanto, BusyBox, para a maioria dos Linux embarcados)
  • traço
  • FreeBSD / bin / sh

E $(…)é especificado pelo IEEE 1003.1.

Então, eu tenho 2 perguntas muito relacionadas:

  • Existe alguma razão para usar `no novo desenvolvimento de scripts de shell, a menos que você conheça um sistema antigo específico em que o script precisará executar?
  • Existe alguma razão para não ensinar os alunos de programação UNIX apenas a escrever $(...)e discutir `apenas como uma variante obsoleta que eles provavelmente encontrarão se estiverem lendo os scripts de shell de outros desenvolvedores (e podem ser necessários se estiverem trabalhando com um sistema realmente antigo ou fora do padrão) por algum motivo)?
Michael Ekstrand
fonte
7
Não, não faz sentido usar ou ensinar `...`. Existe apenas para portabilidade reversa com o shell Bourne (como o shell Bourne tinha ^(o mesmo que |) para portabilidade reversa com o shell Thomson). Observe, no entanto, que (t)cshnão tem $(...)(mas não faz muito sentido usá-los ou ensiná-los).
Stéphane Chazelas
2
É uma coisa Groucho Marx `; {)
Goldilocks
2
Espere, os backticks estão obsoletos? Alguém tem uma referência canônica explicando o porquê? (Caracteres estranhos sintaxe são muito difíceis de pesquisar.)
MathematicalOrchid
11
Mais fácil de digitar. `` - 2 teclas pressionam; $()- shift + 4,9, shift + 0 - 5 pressionamentos de tecla;
Vi.
3
@MathematicalOrchid stackoverflow.com/questions/9405478/… parece muito bom. Os backticks são muito difíceis de aninhar adequadamente, especialmente quando há cotações adicionais.
Michael Ekstrand

Respostas:

19

Como os back-ticks são frequentemente usados, faz sentido ensinar essa construção sintática.

Obviamente, a $()substituição de comandos de estilo deve ser enfatizada como o estilo padrão (e o construto em conformidade padrão).

Por que os back-ticks ainda são populares? Porque eles salvam um caractere na digitação e são indiscutivelmente menos pesados ​​para os olhos.

maxschlepzig
fonte
18
Eu não caracterizaria "menos pesado no olho" como uma característica, mas um erro ...
jasonwryan
11
Normalmente eu uso barras invertidas em casos simples e $ () em casos complexos. Mas muitos scripts estão usando os bastões até agora, e os graduados precisavam ser capazes de escopo com eles.
peterh - Restabelece Monica
@jasonwryan Nesse caso, o bug não é por causa da brevidade, mas por questões arbitrárias. Ou seja, usar backticks é mais fácil para os olhos, mas não é por isso que é depreciado. A menos que você esteja tentando dizer que o açúcar é ruim por definição e todos nós devemos preferir o que quer que seja ... Na verdade, eu gosto da aparência de $()melhor, mas os backticks são mais fáceis e mais KISS; poderia ser uma consequência pavloviana do TOC da programação geral.
Goldilocks
@goldilocks uma vez que você ficar mais velho, legibilidade é muito mais difícil de qualquer maneira: acentos graves são praticamente invisíveis em código na minha idade ...
jasonwryan
3
Em um teclado francês, por exemplo, `é Altrg + E, (estranho o tipo), enquanto $, (, )não precisa de nenhum modificador.
Stéphane Chazelas
5

Eu não os usaria para programação, e ensinar o uso da substituição de backtick em scripts de shell como obsoleto é bom (este parece ser o consenso). Eu não acho que eles sejam inerentemente maus, no entanto, e (pelo menos a julgar pelo seu tutorial médio da linha de comando do Linux) eles ainda são frequentemente usados ​​em snippets / one-liners simples, onde provavelmente não serão aninhados e coisas que você só vou fazer uma vez.

Consulte Substituição de comandos: reticulares ou cifrão / parênteses? .

jaymmer - Restabelecer Monica
fonte
1

Evito usar o $()construto porque não é portátil - no mundo real. Você listou quatro conchas - há muito mais variações do que as que existem por aí (uma ordem de magnitude?). Tente executar seu script no Solaris / bin / sh e veja como vai.

Por outro lado, quando você para de suportar sistemas antigos? você nunca pode progredir para novas maneiras de fazer as coisas? Eu acho que você deve confiar em seu próprio julgamento, e se você pode ver uma vantagem definitiva do novo caminho em relação ao antigo, então siga em frente ... este não é um deles (pessoalmente, acho as báticas muito mais claras - elas não podem ser confundido com a substituição da variável shell, que é uma coisa diferente)

Murray Jensen
fonte
11
O POSIX não especifica que /bin/shdeve estar em conformidade. O Solaris /bin/shé realmente muito não-conforme - embora o Solaris 9/10 / ... seja oficialmente compatível com POSIX. O $()é apenas um construto que ele não entende. Mas há muito mais que ele não entende ou é interpretado de maneira diferente. A maneira portátil de obter uma conformidade shpara procurá-la no caminho retornado por getconf PATH.
precisa saber é o seguinte