2016-02-08 4 views
2

Я попытался ответить another SO question с помощью простого меню с помощью встроенного оператора select. Код отображает имена из /etc/passwd, и позволяют выбрать имя, давая номер:Почему мое меню с выбором не работает в первый раз?

PS3="Enter a number: " 
select name in $(cut -d: -f1 /etc/passwd) ; do 
    if [ -n "${name}" ]; then 
     break 
    fi 
    echo "Sorry, please enter a number as shown." 
done 
echo "Entry from passwd is: ${name}" 

Штраф за первый раз, за ​​исключением работ. Когда вы дадите правильный ответ в первый раз, он попросит вас повторить попытку.
Я попытался получить более подробное объяснение в первый раз, но я не мог получить воспроизводимую кулинарную книгу. Когда вы копируете этот код на свой сервер и даете правильный ответ, у вас, вероятно, будет такая же проблема. Когда вы повторяете команду (из истории или новой пасты), код теперь показывает проблему. Я попытался получить проблему снова, выйдя из системы и запустившись (иногда это работает) или перезагрузившись.
Я пробовал разные способы, чтобы воспроизвести проблему в других ситуациях (с использованием различных имен переменных, незаходимыми переменными, используя медленный список значений с select name in $(echo One; sleep 1; echo Two; sleep 2; echo Three; sleep 1); и открытием новой оболочки.

я искал другие примеры с select, но я . не можете найти ключи в других постах, как https://stackoverflow.com/a/16750755/3220113 и https://askubuntu.com/a/1716

Я пытался исправить мой код с синхронизацией и что, как представляется, обходным:

PS3="Enter a number: " 
select name in $(cut -d: -f1 /etc/passwd) ; do 
    # is sync needed here? 
    sync 
    if [ -n "${name}" ]; then 
     break 
    fi 
    echo "Sorry, please enter a number as shown." 
done 
echo "Entry from passwd is: ${name}" 

Я не мог воспроизвести е rror, когда я включаю команду sync. Является ли синхронизация действительно рабочим патчем и зачем мне это здесь?

Мне не нужны другие способы написать меню. Я уже нашел графический диалог Dialog from bash script и искал простую замену моего собственного сложного https://unix.stackexchange.com/a/115371/57293.

+0

'sync' предназначен для сброса буферов в файлы, он не имеет ничего общего с переменными оболочки. – Barmar

+0

Я не мог воспроизвести проблему. Это работает впервые для меня. http://ideone.com/ogpver – Barmar

+0

ОК, я смог воспроизвести его, вставив команды в интерактивную оболочку, вместо того, чтобы запускать их в скрипте. – Barmar

ответ

2

Эта проблема возникает только при вводе команд в интерактивном режиме, а не в скрипте. Причина в том, что строка, которую вы вводите после строки select, используется в качестве ответа на приглашение. Поскольку if не находится в меню, он сообщает об ошибке. Тогда он не выполняет команду if, потому что она была прочитана как ответ на приглашение.

Это не проблема в скрипте, потому что команды в скрипте не используются в качестве стандартного ввода.

+0

Вклеивание - это волшебное слово. И не вставлять 'select name в $ (cut -d: -f1/etc/passwd); do 2; если [-n "$ {name}"]; затем перерыв; Fi; echo «Извините, пожалуйста, введите число, как показано.»; сделанный; echo "Entry from passwd: $ {name}" ', но что-то с символами новой строки. «2» - попытка вставить 2 в качестве ответа, но сначала выберите чтение ввода и сообщения bash, что 2 не является командой. –

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