Передача сценария с надписью «read» в bash


10

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

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

Это не работает, потому что в моем сценарии есть readоператоры. По какой-то причине они не работают при подключении к bash:

# 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:и запроса значения, как и должно быть, команда чтения просто передается 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

Ну, это твой звонок. Множество проектов предлагают эти однострочники, например Docker , ohmyzsh и другие, которые я сейчас не могу вспомнить. В этом случае это скрипт установки, который я хочу запустить на новых системах из своего собственного репозитория. Я не слишком беспокоюсь о его содержании, как я это написал.
Робин Уинслоу

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