Разница между подключением файла к sh и вызовом файла оболочки

Это то, что пытались сделать:

$ wget -qO- www.example.com/script.sh | sh

который тихо загружает script и печатает его на stdout, который затем передается в sh. Это, к сожалению, не совсем работает, не дожидаясь ввода пользователя в разных точках, а также несколько синтаксических ошибок.

Это то, что на самом деле работает:

$ wget -qOscript www.example.com/script.sh && chmod +x ./script && ./script

Но какая разница?

Я думаю, что, может быть, в трубке файл не выполняет файл, а выполняет каждую строку отдельно, но я новичок в таких вещах, поэтому не знаю.

Ответ 1

Когда вы подключаетесь к sh, stdin этой оболочки /script будет каналом. Таким образом, script не может принимать, например. пользовательский ввод с консоли. Когда вы обычно запускаете script, stdin - это консоль, где вы можете вводить ввод.

Ответ 2

Вы можете попросить, чтобы оболочка была интерактивной:

$ wget -qO- www.example.com/script.sh | sh -i

Ответ 3

У меня была одна и та же проблема, и после возиться и googling это то, что сработало для меня.

wget -O - www.example.com/script.sh | sh