Почему это работает:
$ 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 $1
as, \$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
сделает то же самое без вызова каких-либо внешних команд.