Есть ли более изящный способ сделать это (оболочка bourne)?Bourne Shell: Изящный способ получить статус выхода
IsThereAnyApplesLeft
applesLeft=$?
Обычно в C или Java, я хотел бы сделать:
applesLeft=IsThereAnyApplesLeft
Есть ли более изящный способ сделать это (оболочка bourne)?Bourne Shell: Изящный способ получить статус выхода
IsThereAnyApplesLeft
applesLeft=$?
Обычно в C или Java, я хотел бы сделать:
applesLeft=IsThereAnyApplesLeft
статус Выход обычно используется неявное, как это:
if IsThereAnyApplesLeft;then
echo "Apples left"
fi
Try:
applesLeft=$(IsThereAnyApplesLeft > /dev/null)$?
И да, вы, чтобы использовать $?
нет никакого способа избежать этого.
+1 Умный! И, предполагая, что нет выхода для stdout (или stderr), перенаправление может быть опущено. –
Что не изящного о $?
?
Согласно the Advanced Bash Scripting Guide, нет другого способа получить код выхода, кроме $?
- ну, они не указали другой способ его получения, кроме $?
. Если бы был другой способ, он, несомненно, был бы указан в разделе «Выходной код» в приведенной выше ссылке.
Вот только если вы хотите сохранить статус выхода. Если вы собираетесь использовать только один статус, вы можете использовать его непосредственно в тесте 'if IsThereAnyApplesLeft; затем эхо «да»; else echo "no"; fi' – mpez0
Две части кода не сопоставимы. Пример вашего bash - это создание подпроцесса для запуска исполняемого файла под названием «IsThereAnyApplesLeft», ожидающего завершения этого подпроцесса и сохранения кода выхода подпроцесса в переменной $? так что вы можете проверить его и действовать соответствующим образом.
Это на самом деле довольно сложное взаимодействие, и для того же, что и в C, требуется значительный объем кода. Вам нужно будет обработать подпроцесс fork(), иметь родительский wait4pid() на pid ребенка, в то же время в случае, когда ребенок вызывает execl() в файле IsThereAnyApplesLeft, чтобы он выполнялся. Одним из преимуществ использования языка сценариев оболочки является то, что он скрывает от вас подобные вещи.
Для сравнения, ваш фрагмент кода C просто вызывает функцию C и сохраняет результат в локальной переменной. Это будет выглядеть так: bash:
IsThereAnyApplesLeft()
{
echo 498
}
applesLeft=`IsThereAnyApplesLeft`
echo "there are $applesLeft apples left."
+1 Если вам действительно не нужен фактический код выхода; но я обычно не хочу, чтобы за пределами c – guns
Не забывайте условия короткого замыкания: IsThereAnyApplesLeft && echo «Яблоки слева» – pra