Тестирование эквивалентности для статуса выхода

Если я понимаю правильно, Вы запускаете скрипт непосредственно от среды 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

3
18.12.2011, 01:09
1 ответ

Обе командных строки являются портативными. И оба имеют тот же эффект.

Относительно 2-го: В случае, если $foo сбои, echo 0 не оценен, таким образом echo $? печатает статус выхода последней команды - т.е. $foo.

Логические операторы левоассоциативны, т.е. 2-я командная строка эквивалентна:

$ { $foo && echo 0 } || echo $? 

(где первое $ обозначает приглашение оболочки),

Командный язык Shell стандартизирует списки команд, ассоциативность оператора и так далее.

Разделите 2.9.3 из Командного языка Shell, также указывает семантику статуса выхода && оператора:

Статус выхода

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

Относительно Вашего постскриптума: Да, POSIX не позволяет его.

3
27.01.2020, 21:24
  • 1
    Это говорит, что я думаю, но это не помогает мне видеть, почему это должно быть верно. Это следует из спецификаций POSIX или является там некоторой семантикой оболочки, которая может быть применена для наблюдения этого? –  Charles Stewart 16.12.2011, 22:14
  • 2
    Да, посмотрите Командный язык Shell, особенно 2.9.3, который включает 'И Списки' абзац и следующий раздел 'Exit Status'. –  maxschlepzig 16.12.2011, 22:57
  • 3
    я ничего не вижу в разделе 2.9, который говорит что статус выхода cmd1 && cmd2 когда cmd1 имеет статус выхода кроме 0 или 1. Я добавлю немного к своему вопросу подробно остановиться на этом. –  Charles Stewart 16.12.2011, 23:13
  • 4
    @CharlesStewart, более тщательно изучите - я обновил ответ, который теперь включает прямую кавычку из абзаца, на который ссылаются. –  maxschlepzig 16.12.2011, 23:27
  • 5
    Извините за то, чтобы быть тупым. Я был смущен списками команд и полностью неправильно читал ту спецификацию. +1, ясный и корректный. –  Charles Stewart 17.12.2011, 15:22

Теги

Похожие вопросы