Например, один из простых способов установки Docker:
curl -sSL https://get.docker.com/ | sh
Тем не менее, я также видел некоторые из них, которые выглядят так (на примере Docker):
sh -c "$(curl -sSL https://get.docker.com/)"
Похоже, они функционально одинаковы, но есть ли причина использовать один над другим? Или это просто предпочтение / эстетическая вещь?
(Обратите внимание, будьте очень осторожны при запуске скрипта из неизвестного происхождения.)
vulnerable to server-side detection
фразу. Это приводит к сообщению в блоге, которое объясняет очень подробно, как они достигают этого. TL; DR: поместите сон в ваш скрипт и наблюдайте за задержкой приема на сервере.Я считаю, что они практически идентичны. Однако есть редкие случаи, когда они разные.
$(cmd)
заменяется результатамиcmd
. Если длина этой команды результата превысит значение максимальной длины аргумента, возвращаемоеgetconf ARG_MAX
, она урезает результат, что может привести к непредсказуемым результатам.Опция pipe не имеет этого ограничения. Каждая строка вывода
curl
команды будет выполнена поbash
мере ее поступления из канала.Но ARG_MAX обычно находится в диапазоне 256 000 символов. Для установки докера я был бы уверен, используя любой метод. :-)
источник
ARG_MAX
, показанной ниже , bash ограничивает отдельный аргумент до 131072 байта в моей системе приgetconf ARG_MAX
печати2097152
. Но в любом случае, ошибка или усечение, это не сработает.В
curl -sSL https://get.docker.com/ | sh
:Обе команды,
curl
иsh
, начнутся одновременно в соответствующих подоболочкахSTDOUT from
curl
будет передан как STDINsh
(это то|
, что делает pipe, )Тогда как в
sh -c "$(curl -sSL https://get.docker.com/)"
:Команда подстановки,
$()
будет выполнена первой, т.е.curl
будет выполнена первой в подоболочкеПодстановка команды
$()
, будет заменена на STDOUT изcurl
sh -c
(неинтерактивная оболочка без входа в систему) выполнит STDOUT изcurl
источник
Одно из различий между ними (взятое из других ответов в Интернете) состоит в том, что если вы не загрузите весь сценарий сразу, он может обрезать сценарий на полпути в неизвестной точке и изменить значение команды на казнены. Так что, кажется, сначала лучше загрузить весь файл, а затем оценить его.
источник