El script no funciona cuando se pasa a bash mediante -c

El script no funciona cuando se pasa a bash mediante -c

¿Por qué funciona esto?

$ cat test.sh
#!/bin/bash
cat <(date|awk '{print $1}')

$ ./test.sh
Thu

pero no como un comando pasado a bash:

$ bash -c "cat <(date|awk '{print $1}')"
Thu  2 Apr 2020 12:52:10 BST

Estoy ejecutando esto en macOS

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
Copyright (C) 2007 Free Software Foundation, Inc.

Respuesta1

En su resumen, $1está dentro de una cadena entre comillas dobles:

"cat <(date|awk '{print $1}')"

Esto significa que será ampliado por el shell interactivo. Si el primer parámetro posicional, $1está vacío, lo expandirá a una cadena vacía, lo que dará como resultado un awkprograma que simplemente imprime su entrada:

awk '{print }'

Escapa del $in $1para \$1evitar que el caparazón intente expandirlo. Su comando completo entonces se vería así

bash -c "cat <(date|awk '{print \$1}')"

En su variante de secuencia de comandos, $1está entre comillas simples. Por lo tanto, el shell no intentará expandirlo.

Sin embargo, en este caso específico, sería mejor usar solo

date +%a

para imprimir el nombre abreviado del día. Consulte también el strftime(3)manual ( man 3 strftime).

En bashversiones más recientes (versión 4.2+, es decir, no con lapor defecto bashen macOS, pero con el instalado a través de, por ejemplocerveza casera),

printf '%(%a)T\n' -1

haría lo mismo sin invocar ningún comando externo.

información relacionada