Usando backticks ou dollar em shell scripts

9

Estou ocupado escrevendo scripts shell (usando o Bash), onde preciso preencher alguma variável do resultado retornado de outro comando.

Então, eu estou usando uma sintaxe como esta:

VAR=`command 2>/dev/null`

Mas, ao procurar informações sobre shells de script, descobri frequentemente que o acima pode ser alcançado usando a seguinte sintaxe também:

VAR=$(command 2>/dev/null)

Ambos estão trabalhando para mim (recebi o resultado esperado em ambos os casos) e, portanto, estou me perguntando se ainda posso usar os dois formulários de forma intercambiável ou se tenho que me ater a um formulário para garantir a conformidade com a evolução futura do Concha ?

Justin
fonte
Os links da belacqua oferecem muitas informações sobre as diferenças e o uso. Fechando, pois não está relacionado a um problema do Ubuntu, mas a um problema de programação. Eu recomendo seguir os links mencionados acima.
Luis Alvarado

Respostas:

13

Use dólar. Os backticks são semi-obsoletos , porque são mais complicados de usar (consulte o link), e não há vantagens para eles, a menos que você esteja praticando golfe de código e absolutamente precise salvar um único caractere. Eles provavelmente não serão removidos das conchas populares tão cedo, então você estará seguro de usar por enquanto.

l0b0
fonte
3

Fique com a notação de cifrão $()sempre que puder. Os backticks ficam complicados / confusos quando você começa a fazer citações aninhadas. Ex:

$ FOO=`echo "foo's"`
$ echo $FOO
foo's

Substituir os backticks por $()produz a mesma saída e é mais fácil de ler (menos aspas de ângulos de variação para discernir):

$ FOO=$(echo "foo's")
$ echo $FOO
foo's

Isso e cada aspas (aspas simples, aspas duplas, backtick) significa algo diferente no shell, portanto, usar $ pode ajudar a remover um nível de complexidade. E o desenvolvedor que o segue agradece, pois ele / ela terá mais facilidade para descobrir o que você fez.

Aaron
fonte
Os backticks nem sequer podem ser aninhados funcionalmente.
Bernhard
@ Bernhard Meu exemplo mostra o que eu tinha em mente com essa afirmação.
Aaron