
Qual é a diferença entre ${1-default_string_value}
e${1-`echo default_string_value`}
Por que usar o segundo formulário em vez do primeiro?
Editar:
Eu vi o segundo formulário usado em vários lugares, por exemplo, como um alias git relativamente amploabbrev = !sh -c 'git rev-parse --short ${1-`echo HEAD`}' -
Minha intuição é que esta segunda forma é usada modificando trechos existentes (por exemplo, pesquisados no Google) que precisam usar um comando como valor padrão, mas posso estar negligenciando algo, daí esta pergunta.
Responder1
Do ponto de vista funcional não faz diferença. É apenas menos eficiente. Algumas outras notas sobre esse código:
- sai
`...`
sem${1...}
aspas, o que significa que estão sujeitos a split + glob, o que não faz sentido aqui. -
é uma má escolha de valor$0
para esse script embutido. Isso tornaria as mensagens de erro bastante confusas, por exemplo.`...`
é a forma obsoleta de substituição de comando.$(...)
é preferido hoje em dia, embora neste caso específico não faça diferença.
Observe também que quando o comando contém metacaracteres do shell (|&;<>()$`\"' \t\n*?[#~=%"
, incluindo SPC que na linguagem sh delimita argumentos de comando), então git
executa um shell para interpretar o valor doapelidocom "$@"
anexo a ele. Então, aqui, acabamos correndo sh -c 'sh -c...'
.
Para otimizá-lo ainda mais, você pode alterá-lo para:
git config --global alias.abbrev '!
abbrev() {
exec git rev-parse --short "${1-HEAD}"
}
abbrev'
O que economiza alguns garfos e executivos.
Responder2
Use a segunda forma para tornar as coisas mais lentas.
De acordo com perf
isso, são necessários cerca de 3 milhões de ciclos de clock para rodar bash -c 'echo hello'
na minha máquina. Esperamos que demore menos do que isso para fazer a substituição do comando, mas ainda será muito mais do que apenas ter a string fixa.
Se echo
fosse substituído por algo que fizesse muito mais, talvez id -u
fosse uma maneira de substituir o valor do comando. Isso leva ao segundo motivo para usar o segundo formulário, pode ser para consistência - todas as outras atribuições são para substituir um comando, então aqui use echo como comando.