В оболочках POSIX простая команда: Все части являются необязательными, у вас могут быть только перенаправления, только команды, только назначения или комбинации. Если есть перенаправления, но нет команды, перенаправления выполняются (, поэтому Открывает В спецификации POSIX , в В ksh (здесь протестировано с , но не: , затем как при использовании В Однако, за исключением случаев эмуляции других оболочек, в: то есть, когда есть только перенаправления ввода без команд, вне подстановки команд, Однако в то время как комментарии разрешены до, но не после: работает, но: расширяется до нуля. В Обратите внимание, что варианты оптимизирован в том смысле, что содержимое документа (без завершающих символов новой строки )расширяется без использования временного файла или канала, как в противном случае в случае документов здесь, что делает его эффективным мульти -синтаксис цитирования строк. Для переноса на все версии $(
`
zsh
и bash
. Это очень похоже на подстановку команд, но на самом деле это не так. < file var1=value1 > file2 cmd 2> file3 args 3> file4
> file
открывается и усекается file
), но тогда ничего не происходит. Так < file
file
для чтения, но дальше ничего не происходит, так как нет команды. Итак, file
закрывается и все. Если бы $(< file)
была простой подстановкой команды , то она не расширилась бы до нуля. $(script)
, если script
состоит только из перенаправлений, то приводит к неопределенным результатам . Это сделано для того, чтобы обеспечить особое поведение оболочки Korn. ksh93u+
), если скрипт состоит из одной и только одной простой команды(хотя до и после разрешены комментарии до и после ), которые состоят только из перенаправлений (нет команды, нет назначения )и если первое перенаправление является стандартным вводом (fd 0 )только ввод (<
, <<
или<<<
)перенаправление,так:$(< file)
$(0< file)
$(<&3)
(также $(0>&3)
на самом деле, поскольку это один и тот же оператор)$(< file > foo 2> $(whatever))
$(> foo < file)
$(0<> file)
$(< file; sleep 1)
$(< file; < file2)
<&3
)минус завершающие символы новой строки. $(cat < file)
, за исключением того, что cat
$(<${file=foo.txt})
или$(
zsh
то же самое, за исключением того, что это особое поведение запускается только при наличии только одного перенаправления ввода файла(0< file
, нет <&3
, <<
< a < b
...)< file
<&3
<<< here...
zsh
запускает$READNULLCMD
(пейджер по умолчанию ), а когда есть перенаправления ввода и вывода,$NULLCMD
(cat
по умолчанию ), поэтому, даже если $(<&3)
не распознан как этот специальный оператор, он все равно будет работать, как в ksh
, хотя при вызове пейджера для этого (этот пейджер действует как cat
, поскольку его стандартный вывод будет быть трубой ). ksh
$(< a < b)
расширяется до содержимого a
, в zsh
оно расширяется до содержимого a
иb
(или просто b
, если multios
опция отключена ),$(< a > b)
скопирует a
в b
и ничего не расширит и т. д. bash
имеет аналогичный оператор, но с некоторыми отличиями: echo "$(
# getting the content of file
< file)"
echo "$(< file
# getting the content of file
)"
zsh
, только одно перенаправление файла stdin, хотя возврата к $READNULLCMD
нет, поэтому $(<&3)
, $(< a < b)
выполняют перенаправления, но не расширяются. bash
не вызывает cat
, он все же разветвляет процесс, который передает содержимое файла через канал, что делает его гораздо менее оптимизированным, чем в других оболочках. По сути, это похоже на $(cat < file)
, где cat
будет встроенным cat
. $(<${file=foo.txt})
, упомянутом выше, например, что $file
назначение теряется впоследствии ). bash
IFS= read -rd '' var < file
(также работает вzsh
)— это более эффективный способ чтения содержимого текстового файла в переменную. Это также имеет преимущество сохранения завершающих символов новой строки. См. также $mapfile[file]
вzsh
(в модуле zsh/mapfile
и только для обычных файлов ), который также работает с двоичными файлами. ksh
на основе pdksh -имеют несколько вариаций по сравнению с ksh93. Интересно, что вmksh
(одна из тех оболочек, производных от pdksh -), в var=$(<<'EOF'
That's multi-line
test with *all* sorts of "special"
characters
EOF
)
ksh
, zsh
и bash
,лучше всего ограничиться только тем, $(
Вы установили IFS только для новой строки и возврата. Таким образом, $s3ls
после расширения и разбиения на слова будет считаться aws s3 ls --human-readable --summarize s3://ssyssplunk/ --recursive
одним словом. Bash пытается выполнить это единственное слово как команду вместо выполнения aws
с набором аргументов.
Вам действительно не следует хранить команды в переменных. Вместо этого используйте массивы:
s3ls=(aws s3 ls --human-readable --summarize 's3://ssyssplunk/' --recursive)
#...
totalSize=$("${s3ls[@]}" |...)