Передача сценарію з "читанням" на баш


10

Мені потрібно запустити сценарій по конвеєру через bashз wget(а не працює безпосередньо з Баш).

$ wget -O - http://example.com/my-script.sh | bash

Це не працює, оскільки мій сценарій містить readу ньому заяви. Чомусь вони не працюють при переході на баш:

# Piping to bash works in general
$ echo 'hi'
hi
$ echo "echo 'hi'" | bash
hi

# `read` works directly
$ read -p "input: " var
input: <prompt>

# But not when piping - returns immediately
$ echo 'read -p "input: " var' | bash
$

Замість того, щоб спонукати input:і запитувати значення, як слід, команда read просто переходить мимо bash.

Хто - небудь знає , як я можу конвеєр сценарій з readдо bash?

Відповіді:


16

readзчитується зі стандартного вводу. Але стандартний вхід процесу bash вже прийнятий сценарієм. Залежно від оболонки, або readнічого не прочитає, оскільки оболонка вже прочитала та проаналізувала весь сценарій, або readбуде споживати непередбачувані рядки в сценарії.

Просте рішення:

bash -c "$(wget -O - http://example.com/my-script.sh)"

Більш складне рішення, більше для цілей освіти, ніж для того, щоб продемонструвати гарне рішення для цього конкретного сценарію:

echo '{ exec </dev/tty; wget -O - http://example.com/my-script.sh; }' | bash

Дивовижна подяка Це майже так само елегантно.
Робін Уінслоу

2

Заміна процесу виконує те, що ви хочете:

bash <(wget ...)

Це сказав, що я маю сумніватися у вашій мотивації тут. Якщо ви керуєте веб-сервером (і використовуєте https), можливо, це може мати сенс. Але просто запустити сценарій з Інтернет-сліпого дуже ризиковано.


just running a script from the internet blind is very risky- Так, ми знаємо, що це ризиковано, але люди можуть вибрати довіру сценаріїв певних організацій. Дивіться дискусію в коментарях до відповіді @ Xen2050.
Робін Уінслоу

1

Чи щось не так:

wget -O tmpscript.sh http://example.com/my-script.sh
chmod +x tmpscript.sh
tmpscript.sh

?


"Тому що я повинен створити файл. Я маю на увазі, це спрацює, це просто трохи безладно.
Робін Уінслоу

1
Правда. Хоча це хороший привід для використання /tmp, багато програм використовують тимчасові файли. Мені б не доводилося негайно запускати будь-які завантажені сценарії, не спершу дивлячись ...
Xen2050

Ну, це ваш дзвінок. Дуже багато проектів пропонують ці одне вкладиші, наприклад Докер , Омізш та інші, яких я зараз не можу пригадати. У цьому випадку це сценарій налаштування, який я хочу запустити на нових системах із власного сховища. Я не надто переживаю його вміст, як це я написав.
Робін Уінслоу

3
Я думаю, що хтось, хто знайде це питання (можливо, абсолютно новий користувач), може не знати краще.
Xen2050
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.