Я могу предположить, что такая структура скриптов призвана обеспечить определенную независимость каждого подменю. Если брать ровно те скрипты, которые у вас есть, то:
1. Добавляем код возрата в функцию PMI - просто добавляем строчку "return $g" после "esac". Это не сломает существующий скрипт. Но! Придется разбираться с ошибками выполнения вызовов IPMI меню отдельно.
2. Проверяем код возврата в unem
read b
case $b in
1) clear ; ./1_1_system_menu.sh && exit; unem ;;
2) clear; ./1_1_ipmi_menu.sh && exit; unem ;;
3) clear ; menu ;;
0) exit 0 ;;
esac
" && exit" здесь выполнится, если скрипт возвращает 0, что и произойдет, если PMI() вернет 0. Соответственно, при выборе любого другого варианта выхода не будет.
Однако, несмотря на то, что с такими минимальными изменениями оно может работать как надо, все-таки имеет смысл сделать так, как
jcmvbkbc уже упомянул - не исполнять скрипты, а включать их. Я не согласен по поводу места в скрипте, куда их включать, я бы поставил source до определения функции unem.
И я лично сделал бы это несколько по-другому. Как-то так:
menu.sh
#!/bin/bash
# Insert necessary sub-menus
. ./ipmi_menu.sh
declare -A MAINITEMS
MAINITEMS['System settings']="echo 'System settings selected'"
MAINITEMS['Ipmi tools']="PMI"
MAINITEMS['Back to previous']="break"
MAINITEMS['Exit']="exit"
while :
do
select menuitem in "${!MAINITEMS[@]}"
do
echo "Menu item: $menuitem"
${MAINITEMS[$menuitem]}
done
done
ipmi_menu.sh
#!/bin/bash
PMI(){
echo "PMI functions"
PMI_TITLES=(\
"Sensors check" \
"Writing Motherboard FRU information"\
"Writing MAC address BMC"\
"Wtiting MAC address Motherboard"\
"Back to previous"\
"Exit")
PMIITEMS[1]="echo Sensors check"
PMIITEMS[2]="echo fru information"
PMIITEMS[3]="echo mac address"
PMIITEMS[4]="echo mac address motherboard"
PMIITEMS[5]="break"
PMIITEMS[6]="exit"
select pmiitem in "${PMI_TITLES[@]}"
do
${PMIITEMS[$REPLY]}
done
}
В menu.sh я использую associative array, это сильно упрощает добавление элементов в главное меню.
В ipmi_menu.sh я использую обычный массив, чтобы соблюсти порядок пунктов меню. Тут PMIITEMS[XXX] будет просто имя функции, содержащейся в файле ipmi_menu.sh
В этом примитивном варианте экран не очищается и перерисовка пунктов текущего меню происходит по нажатию ENTER, зато это должно (по идее) работать в любом, даже самом тупом терминале. Если надо красоты, можно select поменять на echo+read, смысл от этого не поменяется, все равно можно брать список функций из массива.