Скрипт не работает при передаче в bash через -c

Скрипт не работает при передаче в bash через -c

Почему это работает:

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

$ ./test.sh
Thu

но не как команда, переданная bash:

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

Я использую это на macOS.

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

решение1

В вашем однострочном коде $1строка заключена в двойные кавычки:

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

Это означает, что он будет расширен интерактивной оболочкой. Если первый позиционный параметр, $1, пуст, он расширит его до пустой строки, что приведет к awkпрограмме, которая просто выведет свой ввод:

awk '{print }'

Экранируйте $in $1as, \$1чтобы остановить оболочку от попыток ее расширить. Ваша полная команда будет выглядеть так

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

В вашем варианте скрипта $1находится в строке в одинарных кавычках. Поэтому оболочка не будет пытаться ее развернуть.

Однако в этом конкретном случае было бы лучше использовать просто

date +%a

для печати сокращенного названия дня. См. также strftime(3)руководство ( man 3 strftime).

В более новых bashверсиях (выпуск 4.2+, т.е. не спо умолчанию bashна macOS, но с установленным через egДомашнее пиво),

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

сделает то же самое без вызова каких-либо внешних команд.

Связанный контент