Bourne Shell: изящный способ получить статус выхода - PullRequest
2 голосов
/ 16 апреля 2010

Есть ли более изящный способ сделать это (оболочка Борна)?

IsThereAnyApplesLeft
applesLeft=$?

Обычно в c или java я бы делал:

applesLeft=IsThereAnyApplesLeft

Ответы [ 4 ]

6 голосов
/ 16 апреля 2010

Статус выхода обычно используется неявно, как это:

if IsThereAnyApplesLeft;then
   echo "Apples left"
fi
3 голосов
/ 16 апреля 2010

Попробуйте:

applesLeft=$(IsThereAnyApplesLeft > /dev/null)$?

И да, вы должны использовать $?, чтобы избежать этого, нет способа.

0 голосов
/ 16 апреля 2010

Два куска кода не сопоставимы напрямую. Ваш пример bash создает подпроцесс для запуска исполняемого файла с именем «IsThereAnyApplesLeft», ожидая завершения этого подпроцесса и сохраняя код выхода подпроцесса в переменной $? так что вы можете проверить это и действовать соответственно.

Это на самом деле довольно сложное взаимодействие, и чтобы сделать то же самое в C, потребовалось бы значительное количество кода. Вы должны были бы выполнить fork () подпроцесса, чтобы родительский wait4pid () находился в дочернем pid, в то же время в дочернем процессе вызывая execl () для файла "IsThereAnyApplesLeft", чтобы запустить его. Одним из преимуществ использования языка сценариев оболочки является то, что он скрывает подобные вещи от вас.

Для сравнения, ваш фрагмент кода C просто вызывает функцию C и сохраняет результат в локальной переменной. Это будет выглядеть в bash:

IsThereAnyApplesLeft()
{
        echo 498
}

applesLeft=`IsThereAnyApplesLeft`
echo "there are $applesLeft apples left."
0 голосов
/ 16 апреля 2010

Что не изящно в $??

Согласно Расширенному руководству по написанию сценариев Bash , нет другого способа получить код выхода, кроме $? - ну, в нем нет другого способа получить его кроме $?. Если бы был другой способ, он наверняка был бы указан в разделе «Код выхода» в приведенной выше ссылке.

...