Почему чтение управляет не, выбирают интерактивные варианты, когда выполнено sh?

htonl() и ntohl() функции в библиотеке C с обратным порядком байтов на самом деле ничего не делают (они - "нет" s). Таким образом, тот же код может использоваться и на БЫТЬ и на машины LE; скомпилированный с lib C на машине LE, те функции зеркально отразят байты, но на БЫТЬ машиной, они оставят их тем же, так как сетевой порядок байтов является обратным порядком байтов, и хост уже является обратным порядком байтов.

Другими словами, в Вашем примере, БЫТЬ машиной никогда ничего не изменяет. Только машина LE B делает.

6
11.07.2014, 22:56
2 ответа

Когда вы перенаправляете вывод curl в sh , вы делаете текст сценария стандартным вводом оболочки, которая принимает его как команды для запуска. После этого нечего читать . Даже если бы он попытался, он ничего не получил бы от входа терминала, потому что он не подключен к нему. Канал заменил стандартный ввод для процесса sh .

Следующая проблема заключается в том, что read -i является не функцией POSIX sh , а скорее расширением, поддерживаемым bash . Ubuntu использует тире , минимальную POSIX-совместимую оболочку с минимальными расширениями, как / bin / sh по умолчанию. Вот почему он специально отклоняет параметр -i (хотя он поддерживает -p ).

Если вы сами используете более функциональную оболочку, вы можете попробовать что-то вроде:

bash <(curl http://example.com/provisioning.sh)

, который создает канал для bash для чтения вывода curl из и предоставляет это как аргумент файла сценария. В этом случае стандартный ввод сценария по-прежнему подключен к терминалу, и чтение будет работать (но обратите внимание на большое предостережение под строкой).


Я также отмечу, что « curl | sh » обычно неодобрительно на как очевидную проблему безопасности, но вам лучше всего известно, ситуация, в которой находится ваш скрипт.

7
27.01.2020, 20:27

Другой, более переносимый способ сделать это — создать другой файловый дескриптор:

exec 3<>/dev/tty
read -u 3 -p "Gimme some stuff: " stuff

Я обнаружил, что здесь :https://superuser.com/questions/834502/possible-to-get-a-bash-script-to-accept-input-from-terminal-if-its-stdin-has-bee

В моем случае я быстро нашел замену в своем скрипте, чтобы это работало:

exec 3<>/dev/tty
read_cmd="read -u 3"

$read_cmd -p "name: " my_name
$read_cmd -p "email: " my_email
$read_cmd -s -p "password: " my_password
0
27.01.2020, 20:27

Теги

Похожие вопросы