Команда «Read» в bash-скрипте пропускается - PullRequest
6 голосов
/ 02 августа 2011

Я создаю скрипт для обновления моего дистрибутива Linux, если мне нужно стереть HD или мне нужно установить Linux на другую машину. Так что этот скрипт в основном устанавливает все программы, которые мне обычно нужны. В начале есть команда «read», которая спрашивает, хочу ли я установить все пакеты автоматически или нет. Если я выбираю нет, для каждой не найденной программы следует спросить меня, хочу ли я установить ее, и я использую этот код

if [[ $installall == "yes" ]]; then
    echo " Installing $sciprog..."
    sudo apt-get install -y $sciprog >/dev/null
    {
        scitest=`dpkg -s $sciprog | grep Status`
    } 2>${HOME}/musthave.errorlog
    if [[ $scitest != "Status: install ok installed" ]]; then
        echo " I've encountered problems installing $sciprog that I can't resolve. "
        echo " Consider installing $sciprog manually. "
        {
            echo "=========="
            echo " $sciprog"
        } >>${HOME}/musthave.notinstalled
    else
        echo " $sciprog installed correctly!"
        {
            echo "=========="
            echo " $sciprog"
        } >>${HOME}/musthave.installed
    fi
else
    echo " Seems like $sciprog is not installed... Do you want to download it?"
    echo " Type 'y' for yes."

    read secondyn ### THIS IS THE GUILTY COMMAND ###

    if [[ $secondyn == "y" ]]; then
        echo " Installing $sciprog ..."
        sudo apt-get install -y $sciprog >/dev/null
        {
            checkinstall=`dpkg -s $sciprog | grep Status`
        } 2>>${HOME}/musthave.errorlog
        if [[ $checkinstall != "Status: install ok installed" ]]; then
            echo " I've encountered problems installing $sciprog that I can't resolve. "
            echo " Consider installing $sciprog manually. "
            {
                echo "=========="
                echo " $sciprog"
            } >>${HOME}/musthave.notinstalled
        else
            echo " $sciprog installed correctly!"
            {
                echo "=========="
                echo " $sciprog"
            } >>${HOME}/musthave.installed
        fi
    else
        echo " Skipping $sciprog ..."
        {
            echo "=========="
            echo " $sciprog"
        } >>${HOME}/musthave.notinstalled
    fi
### some more code which works as expected. All the code above is inside a 
### while...do...done loop which reads line by line the file at the end
done <${HOME}/file.list

Но если я запускаю скрипт, он пропускает команду read в предложении else и предполагает, что он равен "n" ...

Я не могу понять почему, внутри циклов if...then...else...fi есть и другие функции чтения, и они работают как положено ...

Есть идеи?

Ответы [ 3 ]

12 голосов
/ 03 августа 2011

Соответствующие части кода еще не завершены, но на основе комментариев я собираюсь догадаться, что ваш цикл while выглядит так:

while read -r ... ; do 
    # do stuff ...

    # read user input
    read -r var

done < file

Из этого сразу же становится очевидной проблема: внутренняя read получает свой ввод из того же места, что и внешний цикл, а именно из stdin, который был перенаправлен с file, а не от пользователя.Для немного более переносимой альтернативы, которая не зависит от поддержки на уровне ядра /dev/tty, просто используйте другой дескриптор файла, отличный от stdin, для цикла while.

while read -r ... <&9; do
    # loop stuff

    # stdin still attached to the terminal untouched, 
    # so this reads from the terminal as expected
    read -r var 

done 9< file

Обратите внимание, что в этом примере используется fd 9для файла, оставив fd 0 (stdin) в покое.Посмотрите на BashFAQ 089 для более подробной информации.

7 голосов
/ 02 августа 2011

Попробуйте прочитать с управляющего оконечного устройства:

read secondyn </dev/tty
1 голос
/ 03 августа 2011
read secondyn < /proc/${PPID}/fd/0

Это будет смотреть на вход родителя, который все еще должен быть стандартным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...