Если я понимаю правильно, Вы запускаете скрипт непосредственно от среды GUI, не из терминала.
Терминал - то, что предоставляет сценарию способ получить вход. Если Вы запускаете скрипт от GUI через запись меню или сочетание клавиш, вход сценария ни к чему не подключен (это, ничто не называют /dev/null
), поэтому когда Вы просите читать строку, read
команда говорит, что нет ничего для чтения (конец файла).
У Вас есть два решения: измените способ, которым Вы называете свой сценарий или изменяете Ваш сценарий. Первый более прост и позволяет Вашему сценарию иногда выполняться в терминале. Последний более сложен, но более гибок.
Можно легко изменить сценарий для выполнения в терминале. Вместо того, чтобы установить сочетание клавиш для /path/to/script
, установите сочетание клавиш для xterm -e /path/to/script
или gnome-terminal -e /path/to/script
или безотносительно эмулятора терминала Вы предпочитаете. Окно терминала появится, как только Вы нажимаете клавишу и исчезнете, когда Ваш сценарий завершается.
С другой стороны, можно изменить сценарий для чтения входа через окно GUI вместо от его стандартного входа. Zenity является общим выбором для этого (существует Пакет Ubuntu Установите zenity http://bit.ly/software-small). В Вашем сценарии можно использовать [ -t 0 ]
протестировать, работает ли это в терминале.
if [ -t 0 ]; then
echo "What is your favorite color?"
read -r color
else
color=$(zenity --entry --text "What is your favorite color?")
fi
Обе командных строки являются портативными. И оба имеют тот же эффект.
Относительно 2-го: В случае, если $foo
сбои, echo 0
не оценен, таким образом echo $?
печатает статус выхода последней команды - т.е. $foo
.
Логические операторы левоассоциативны, т.е. 2-я командная строка эквивалентна:
$ { $foo && echo 0 } || echo $?
(где первое $
обозначает приглашение оболочки),
Командный язык Shell стандартизирует списки команд, ассоциативность оператора и так далее.
Разделите 2.9.3 из Командного языка Shell, также указывает семантику статуса выхода && оператора:
Статус выхода
Статус выхода И список должен быть статусом выхода последней команды, которая выполняется в списке.
Относительно Вашего постскриптума: Да, POSIX не позволяет его.
cmd1 && cmd2
когда cmd1 имеет статус выхода кроме 0 или 1. Я добавлю немного к своему вопросу подробно остановиться на этом. – Charles Stewart 16.12.2011, 23:13