It reads grub.cfg and gets the main entries then lists them.
Double click an os to have it as the next boot os. then after rebooting out of that os it reverts to the default.
Note.
/etc/default/grub file MUST have the default line set to "saved" like this...
GRUB_DEFAULT=saved
if you changed the default to saved from something else then you have to run update-grub
then save this script somewhere, set it's exe flag and launch it.
#!/usr/bin/env gbs3 ' Gambas script file Use "gb.gui" Use "gb.desktop" Private fForm As Form Private lList As ListBox Private cBox As CheckBox Private iTextLen As Integer Public Sub Main() Dim sRet As String, aLines As String[] With fForm = New Form .Spacing = True .Margin = True .Title = "Select OS to boot next boot" .Arrangement = Arrange.Vertical .Foreground = Color.Magenta End With lList = New ListBox(fForm) As "List" lList.Font = Font["Ubuntu,16"] lList.Expand = True aLines = GetMainEntries() lList.List = aLines.Copy() lList.Background = Color.SetAlpha(Color.Cyan, 220) fForm.Width = iTextLen + (Desktop.Scale * 3) fForm.Height = (lList.List.Count + 4) * lList.Font.Height With cBox = New CheckBox(fForm) .Text = "Reboot after setting. (no confirmation)" End With fForm.Show End Public Sub List_Activate() Desktop.RunAsRoot("grub-reboot \"" & Last.Text & "\"", True) fForm.Hide() If Not cBox.Value Then If Message.Question("Next reboot set to...\n " & Last.Text, "Reboot now", "Reboot Later") <> 1 Then Return Endif Shell "reboot" fForm.Close() End Public Sub GetMainEntries() As String[] Dim sEntries As New String[] Dim sLines As String[] = Split(File.Load("/boot/grub/grub.cfg"), "\n", Null, True) Dim bInSub As Boolean Dim iDepth As Integer For Each s As String In sLines If bInSub Then If LTrim(s) Begins "menuentry " Then Inc iDepth Else If Trim(s) = "}" Then Dec iDepth If iDepth < 0 Then bInsub = False Endif Else If LTrim(s) Begins "menuentry " Then sEntries.Add(Split(s, If(InStr(s, "'"), "'", "\""))[1]) iTextLen = Max(iTextLen, lList.Font.TextWidth(sEntries.Last)) Else If LTrim(s) Begins "submenu " Then Idepth = 0 bInSub = True Endif Endif Next Return sEntries End