Недавно я столкнулся с этим действительно аккуратным синтаксисом в контексте создания bash
функций, которые могут принимать аргумент или поток из STDIN (то есть могут передаваться по конвейеру).На первый взгляд, я понимаю, что здесь происходит, но я хотел бы немного больше объяснить фактическую механику того, как это работает.
Вот синтаксис (согласно названию): ${1:-$(</dev/stdin)}
И в контексте его можно использовать как:
log(){
echo -e >&1 "INFO: ${1:-$(</dev/stdin)}"
}
Разрешить следующее использование:
$ log foo
INFO: foo
В качестве альтернативы, вы также можете сделать это
mv -v foo.ext bar.ext | log
INFO: renamed 'foo.ext' -> 'bar.ext'
Это замечательно, потому что это единственный лаконичный метод, который я когда-либо видел для включения функций аргументов и конвейеров с помощью функций bash
(к сожалению, я забыл, где я сейчас с этим столкнулся).
Теперь я понимаю (или думаю, что понимаю) большую часть того, что происходит здесь, по крайней мере, поверхностно, но я был бы признателен за более глубокое понимание.Вот как я понимаю это, а затем мои оставшиеся вопросы:
${1:-$(</dev/stdin)}
${1}
, очевидно, является аргументом по умолчанию, который функция принимает ${1:-x}
является ли расширение переменной / скобки 'отступлением' к строке 'x'
, если $1
в противном случае пусто (или не установлено?).В этом случае возврат к подпрограмме процесса STDIN. $()
- это, очевидно, процесс подстановка команд - и, наконец,
</dev/stdin
- это, очевидно, перенаправление от стандартноговход, который позволяет трубе работать вообще.
По сути, это говорит о том, что если $1
не заполнен аргументом, вернитесь к использованию STDIN - что я доволен концептуально.
Итак, вот мои вопросы:
- Я никогда не видел перенаправления (
<
) внутри процесса подстановки команд, без фактической команды, предшествующей ей (например, $(cat < somefile.ext)
).Итак, что же на самом деле происходит (мимолетно), когда подстановка команды process получает перенаправление без вызова другой команды? - Почему необходимо обернуть перенаправление STDIN в процесс подстановка команд вообще?(на самом деле, когда я пишу это, мне приходит в голову, я не проверял это без, но я буду держать это простым).
- Это безопасно ?Я использовал его с многострочным STDIN, и он до сих пор не сломался.Где это может упасть (если где-нибудь?).