Sustitución de parámetros con valor predeterminado: ${1-str} vs ${1-`echo str`}

Sustitución de parámetros con valor predeterminado: ${1-str} vs ${1-`echo str`}

¿Cuál es la diferencia entre ${1-default_string_value}y${1-`echo default_string_value`}

¿Por qué utilizar la segunda forma sobre la primera?

Editar:

He visto la segunda forma utilizada en varios lugares, por ejemplo como un alias de git relativamente extendido.abbrev = !sh -c 'git rev-parse --short ${1-`echo HEAD`}' -

Mi intuición es que esta segunda forma se usa modificando fragmentos existentes (por ejemplo, buscados en Google) que tienen que usar un comando como valor predeterminado, pero podría estar pasando por alto algo, de ahí esta pregunta.

Respuesta1

Desde un punto de vista funcional no hay diferencia. Es simplemente menos eficiente. Algunas otras notas sobre ese código:

  • sale `...`y ${1...}no está entre comillas, lo que significa que están sujetos a split+glob, lo que no tiene sentido aquí.
  • -es una mala elección del valor de $0para ese script en línea. Por ejemplo, los mensajes de error serían bastante confusos.
  • `...`es la forma obsoleta de sustitución de comandos. $(...)Se prefiere hoy en día, aunque en este caso específico no haría ninguna diferencia.

También tenga en cuenta que cuando el comando contiene metacaracteres de shell (|&;<>()$`\"' \t\n*?[#~=%", incluido SPC que en el lenguaje sh delimita los argumentos del comando), luego gitejecuta un shell para interpretar el valor delaliascon "$@"adjunto. Entonces, aquí terminamos corriendo sh -c 'sh -c...'.

Para optimizarlo aún más, puede cambiarlo a:

git config --global alias.abbrev '!
  abbrev() {
    exec git rev-parse --short "${1-HEAD}"
  }
  abbrev'

Lo que ahorra algunas bifurcaciones y ejecutivos.

Respuesta2

Utilice la segunda forma para hacer las cosas más lentas.

Según perfse necesitan alrededor de 3 millones de ciclos de reloj para ejecutarse bash -c 'echo hello'en mi máquina. Con suerte, se necesitará menos que esto para realizar la sustitución del comando, pero seguirá siendo mucho más que simplemente tener la cadena fija.

Si echofuera reemplazado por algo que hiciera bastante más, tal vez id -ule proporcionaría una forma de anular el valor del comando. Esto lleva a la segunda razón para usar la segunda forma, podría ser por coherencia: cualquier otra asignación es para anular un comando, por lo que aquí use echo como comando.

información relacionada