Substituição de parâmetro com valor padrão: ${1-str} vs ${1-`echo str`}

Substituição de parâmetro com valor padrão: ${1-str} vs ${1-`echo str`}

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 $0para 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 gitexecuta 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 perfisso, 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 echofosse substituído por algo que fizesse muito mais, talvez id -ufosse 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.

informação relacionada