2013-12-19 5 views
0

В Debian работает следующий код, но в CentOS он просто прерывается без каких-либо ошибок. Какая ошибка? Я не могу этого понять.Bash-Shell Script прерывается без ошибок

echo "Test 1" 
    ANSWER="" 
    read -p "Enter y or n " ANSWER; 
    echo "Test 2" 

Выход выглядит ВСЕГДА так:

Test 1 

Я также попробовал команду чтения без параметра -p, но это тоже не работает:

echo "Test 1" 
    ANSWER="" 
    echo "Enter y or n " 
    read ANSWER; 
    echo "Test 2" 

Выход:

Test 1 
    Enter y or n 

Если я выполняю т. е. команда в командной строке работает, как надо. Сценарий имеет следующий заголовок: #!/Bin/bash

Может ли кто-нибудь помочь?

+0

Что такое вывод 'type read'? – anubhava

+0

@anubhava «read is shell builtin» - на обеих системах – user2966991

+1

отменяет возврат к вашей оболочке или ожидает ввода? Это может быть проблема с буферизацией. – Donovan

ответ

0

@user2966991 - Сценарий, который считывает из stdin, находится внутри большего цикла, который считывает файл через stdin. Это не будет работать. Попробуйте перенаправить ваш stdin в другой обработчик файлов.

Рассмотрите этот пример кода. Это не сработает, потому что и цикл while, и чтение читаются из stdin.

#!/bin/bash 
cat samplefile | while read line; do 
    read -p "$line (y/n)?" ANSWER 
done 

Теперь рассмотрим этот другой код.

#!/bin/bash 
# save stdin to file descriptor 5 
exec 5<&0 

cat samplefile | while read line; do 
    read -p "$line (y/n)?" ANSWER <&5 
done 

# restore stdin and close file descriptor 5 
exec 0<&5 5>&- 

Лично я предпочитаю перенаправление ввода, чем трубу.

cat file | while read var; do 
... 
done 

можно записать в виде

while read var; do 
... 
done < file 

В следующий раз, пожалуйста, напишите сценарий здесь или вы не получите никакого ответа.

+0

@ user3088572 Удивительный! Большое спасибо! Но у меня есть два вопроса к вашему решению. 1. Является ли дескриптор чем-то вроде указателя на адрес хранилища на C++? И если бы я сообщил мне правильно, я могу использовать дескриптор 3 - 9 также или? 2. Почему вы предпочитаете перенаправление ввода, чем трубу? Есть ли увеличение производительности? – user2966991

+0

Да, это указатель на ФАЙЛ. Дескриптор 0 - это stdin, 1 - stdout, а 2 - stderr. Вы определенно можете использовать от 3 до 9. С помощью перенаправления ввода я избегаю запуска дополнительных процессов, которые были бы вредны для вялых загруженных серверов. На здоровой системе вы не заметите разницы. – alvits

+0

@ user3088572 А, ладно. Большое спасибо за эту информацию! :) – user2966991

0

попробовать это

#!/bin/bash 

echo "Test 1" 
read -p "Enter y/n: " ANSWER 
echo " Test 2: ${ANSWER}" 

Вам не нужно Близкий на конце ответа.

+0

Он работает как маленький скрипт, но не в моем большом скрипте. Во второй строке скрипта написано «set -e». Если я прокомментирую это, он не прервется, но также не покажет сообщение со входом.Код выглядит так: ANSWER = "" while [["$ ANSWER" == ""]]; do read -p "Введите y/n:" ANSWER fi – user2966991

+0

@ user2966991 - если он работает как маленький скрипт, который я ожидаю, тогда проблема не входит в этот блок кода. Вы проверили, если в большом скрипте он заполняет входной буфер, который каким-то образом попадает в этот блок? – alvits

+0

Кроме того, set -e используется для отладки, поэтому скрипт выйдет из строя при ошибке. Сценарий сталкивается с условием ошибки, поэтому он прерывается, когда установлен «set -e». – alvits

Смежные вопросы