¿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, $1
está 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, $1
está vacío, lo expandirá a una cadena vacía, lo que dará como resultado un awk
programa que simplemente imprime su entrada:
awk '{print }'
Escapa del $
in $1
para \$1
evitar 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, $1
está 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 bash
versiones más recientes (versión 4.2+, es decir, no con lapor defecto bash
en 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.