Предположим, у меня есть файл confirmation.sh
со следующим содержимым:
#!/bin/bash
echo -n "Are you sure [Y/n]? "
read line
case "$line" in
n|N) echo "smth"
;;
y|Y) echo "smth"
;;
esac
и я хочу запустить этот скрипт следующим образом:
cat confirmation.sh | sh
Я вижу, Are you sure [Y/n]?
и сценарий прерывается. В чем проблема?
shell-script
shell
pipe
user-input
Игорь Тимошенко
источник
источник
/bin/bash
в строке bang, но вы используете.sh
расширение и пытаетесь передать скриптsh
. Не проблема, так как ваш код совместим с обоими, но стоит отметить.Ответы:
Как уже говорили другие, это потому , что перенаправление
stdin
ofsh
было прочитано из канала, оно не подключено к терминалу, как обычно. Единственное, что вы можете сделать, чтобы обойти это, -/dev/tty
это заставить скрипт читать из терминала. Например:Обычно вы делаете это только в том случае, если вы специально хотите запретить людям вводить сценарии, например:
Это все равно будет считываться из терминала, даже если пользователь может ожидать, что он автоматически введет
Y
в приглашении. Это обычно для программ, которые ожидают пароль, чтобы сделать это.источник
примечание: спасибо @Graeme за исправление в двух приведенных выше примерах ...
Это намного легче сделать, если вы будете
stdin
честны.Или, поскольку 0 1 2 терминала - это один и тот же файл, просто добавьте:
И ваш
Работает просто отлично.
источник
stderr
хотя. Я, наверное, должен, хотя, я не понимаю, почему.Это сработало для одного аргумента, передаваемого в мой скрипт:
Затем я могу получить доступ к переданным данным в позиционном аргументе (
$1
), который совместим с другими сценариями.От
info test
:источник
Короткий ответ: ты не можешь. Канал перенаправляет стандартный вывод на стандартный ввод, поэтому вы не можете запустить интерактивный скрипт, поскольку вы уже перенаправили вывод первой команды в качестве ввода второй команды в операторе канала.
Возможно, вы хотите сделать что-то вроде этого:
источник
sh confirmation.sh
?