Por que isso funciona:
$ cat test.sh
#!/bin/bash
cat <(date|awk '{print $1}')
$ ./test.sh
Thu
mas não como um comando passado para o bash:
$ bash -c "cat <(date|awk '{print $1}')"
Thu 2 Apr 2020 12:52:10 BST
Estou executando isso no macOS
$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
Copyright (C) 2007 Free Software Foundation, Inc.
Responder1
No seu one-liner, o $1
está dentro de uma string entre aspas duplas:
"cat <(date|awk '{print $1}')"
Isso significa que ele será expandido pelo shell interativo. Se o primeiro parâmetro posicional, $1
, estiver vazio, ele irá expandi-lo para uma string vazia, resultando em um awk
programa que apenas imprime sua entrada:
awk '{print }'
Escape $
para impedir $1
que \$1
o shell tente expandi-lo. Seu comando completo ficaria assim
bash -c "cat <(date|awk '{print \$1}')"
Na sua variante de script, o $1
está em uma única string entre aspas. O shell, portanto, não tentará expandi-lo.
Neste caso específico, porém, seria melhor usar apenas
date +%a
para imprimir o nome abreviado do dia. Consulte também o strftime(3)
manual ( man 3 strftime
).
Em bash
versões mais recentes (versão 4.2+, ou seja, não com opadrão bash
no macOS, mas com aquele instalado por exemploCerveja caseira),
printf '%(%a)T\n' -1
faria a mesma coisa sem invocar nenhum comando externo.