Intereting Posts
Как изменить текущий каталог графически только с помощью клавиатуры? Объединить изображения гибких дисков в Raspbian Как остановить повторяющиеся сообщения об ошибках в сообщениях и auditd.log? Сервер Fedora как точка доступа текстовый файл csv transpose / pivot Как подтвердить скорость передачи данных 1000 Мбит / с в DD-WRT? копирование нескольких файлов в несколько каталогов shell или perl-скрипт для проверки группы имеют права чтения Функция Bash для scp файла не работает Превращение стандартного вывода в одну команду как настроить клиент linux для использования информации ntp, предоставляемой через dhcp? Супер-медленная скорость локальной сети, если только скачивание через FTP-клиент Chrome Как добавить невидимый водяной знак к изображениям в командной строке? Бесплатная ОС (без проприетарного программного обеспечения или драйверов) с текущим программным обеспечением? Шифрование PKCS7

перенаправление stdin для скрипта, запрашивающего ввод

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

$ echo 'q = raw_input("question ?"); print "\ngot: ", q' | python - < <(echo answer) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'answer' is not defined 

Я знаю, что могу заставить его работать с этим:

 $ python <(echo 'q = raw_input("question ?"); print "\ngot: ", q') < <(echo answer) question ? got: answer 

но это замена процесса. Можно ли заставить его работать только с перенаправлением?

Да, может быть. Один из способов – открыть TTY и взаимодействовать с ним:

 #!/usr/bin/env expect package require Tcl 8.5 gets stdin line; puts "stdin: $line" set tty [open /dev/tty r+] chan configure $tty -buffering none puts -nonewline $tty "nimi sina li seme? " set name [gets $tty] gets stdin line; puts "stdin: $line" puts $tty "name: $name" 

Который имеет результаты, таким образом, приведенные выше сохраненные ./prompt , chmod +x , установленный ./prompt и т. Д.

 $ (echo foo; echo bar) | ./prompt stdin: foo nimi sina li seme? Bob stdin: bar name: Bob $ 
 $ echo 'q = ...' | python - < <(echo answer) 

Это не сработает, так как вы дважды перенаправляетесь на stdin python. (В дальнейшем) перенаправление < <(echo answer) вступает в силу, а python получает только answer на слово в качестве сценария для запуска.

Открытие /dev/tty (или даже /dev/stderr ) может работать, даже если stdin перенаправлен.

 $ echo foo | python -c 'import sys; s = sys.stdin.readline(); print "from stdin:", s; t = open("/dev/tty", "r"); s = t.readline(); print "from tty:", s;' 

Конечно, это требует, чтобы скрипт работал с tty, а не с cron или подобным.