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/sh
conchas 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)?
shell
command-substitution
Michael Ekstrand
fonte
fonte
`...`
. 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)csh
não tem$(...)
(mas não faz muito sentido usá-los ou ensiná-los).$()
- shift + 4,9, shift + 0 - 5 pressionamentos de tecla;Respostas:
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.
fonte
$()
melhor, mas os backticks são mais fáceis e mais KISS; poderia ser uma consequência pavloviana do TOC da programação geral.`
é Altrg + E, (estranho o tipo), enquanto$
,(
,)
não precisa de nenhum modificador.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? .
fonte
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)
fonte
/bin/sh
deve 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 conformidadesh
para procurá-la no caminho retornado porgetconf PATH
.