Перенаправление stderr приводит к тому, что команда чтения не печатает вывод - PullRequest
1 голос
/ 23 апреля 2019

Код как

#!/bin/bash

exec 3>&1 4>&2
exec 1>/tmp/stdout.log
exec 2>/tmp/stderr.log
PS4='+ (Line $LINENO) '
set -x
echo "This goes to /tmp/stdout.log"
echo "This goes to /tmp/stderr.log" 1>&2
cmd1="$(uname -a)"
cmd2="$(uname +-a)"

exec 1>&3
read -n 1 -s -r -p "Please do manually Installation of package ,Press any key to continue"



exec 1>&3 2>&4
exec 3>&- 4>&-

Я пытался восстановить exec 1>&3, поэтому чтение - это эхо, но оно не отображается, когда я делаю это нормально echo "hello" показывает, но не с read.

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

1 Ответ

2 голосов
/ 23 апреля 2019

Вы ожидаете, что read напечатает до stdout, но печатает до stderr, как показано этой командой:

> read -p "prompt" 2>/dev/null # this command will print nothing

Загляни в свой /tmp/stderr.log. Там будет отсутствующее приглашение.

Чтобы восстановить способность read печатать на экране, вместо восстановления stdout, вам необходимо восстановить stderr:

exec 2>&4
read -n 1 -s -r -p "Please do manually Installation of package ,Press any key to continue"

В качестве альтернативы, как отмечено в комментариях, вместо восстановления stderr отдельной командой вы можете восстановить его только для команды read:

read -n 1 -s -r -p "<shortened for clarity>" 2>&4
...