O script não funciona quando passado para o bash via -c

O script não funciona quando passado para o bash via -c

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 $1está 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 awkprograma que apenas imprime sua entrada:

awk '{print }'

Escape $para impedir $1que \$1o shell tente expandi-lo. Seu comando completo ficaria assim

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

Na sua variante de script, o $1está 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 bashversões mais recentes (versão 4.2+, ou seja, não com opadrão bashno macOS, mas com aquele instalado por exemploCerveja caseira),

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

faria a mesma coisa sem invocar nenhum comando externo.

informação relacionada