Como listar “menuentries” do GRUB na linha de comando?

19

Existe uma maneira de recuperar a lista de títulos "menuentries" do GRUB?

Eu preciso de um resultado em um formato que grub-set-default aceitará. por exemplo.

"Ubuntu"
"Memory test (memtest86+)"
etc.
    
por madneon 20.03.2015 / 17:50

5 respostas

26

Usando awk

awk -F\' '/menuentry / {print $2}' /boot/grub/grub.cfg 

fornece uma lista completa de todas as entradas do menu em grub.cfg .

    
por A.B. 20.03.2015 / 18:02
5

Exatamente isso tem me incomodado há mais de um ano - então eu fiz um script rápido e sujo para fazer isso. Espero que isso ajude os outros?

Isso empilha os nomes em uma fila de push / pop, mas não na indexação de menus, para que pudesse ser melhor, mas eu fui o mais longe possível.

gawk  'BEGIN {                                                                                                                       
  l=0                                                                                                                                
  menuindex= 0                                                                                                                       
  stack[t=0] = 0                                                                                                                     
}                                                                                                                                    

function push(x) { stack[t++] = x }                                                                                                  

function pop() { if (t > 0) { return stack[--t] } else { return "" }  }                                                              

{                                                                                                                                    

if( $0 ~ /.*menu.*{.*/ )                                                                                                             
{                                                                                                                                    
  push( $0 )                                                                                                                         
  l++;                                                                                                                               

} else if( $0 ~ /.*{.*/ )                                                                                                            
{                                                                                                                                    
  push( $0 )                                                                                                                         

} else if( $0 ~ /.*}.*/ )                                                                                                            
{                                                                                                                                    
  X = pop()                                                                                                                          
  if( X ~ /.*menu.*{.*/ )                                                                                                            
  {                                                                                                                                  
     l--;                                                                                                                            
     match( X, /^[^'\'']*'\''([^'\'']*)'\''.*$/, arr )                                                                               

     if( l == 0 )                                                                                                                    
     {                                                                                                                               
       print menuindex ": " arr[1]                                                                                                   
       menuindex++                                                                                                                   
       submenu=0                                                                                                                     
     } else                                                                                                                          
     {                                                                                                                               
       print "  " (menuindex-1) ">" submenu " " arr[1]                                                                               
       submenu++                                                                                                                     
     }                                                                                                                               
  }                                                                                                                                  
}                                                                                                                                    

}' /boot/grub/grub.cfg

Aqui você pode ver uma captura de tela da minha caixa mostrando sua execução

    
por Lucien Murray-Pitts 01.08.2017 / 19:54
4

Color Screen (versão curta)

Use a roda de rolagem do mouse, Início , Fim , PgUp , PgDn , e para navegar no menu.

Capturadeteladetexto(versãolonga)

Oscriptbashusawhiptailemvezdedialogparaexibiromenu.Umavantageméquevocêpodecopiaraimagemdoterminalparaaáreadetransferênciacomotextoecole-onestesitecomotexto.Outrasvantagensincluem:

  • Suportepararodaderolagemdomouse
  • Desempenhomaisrápido
  • dialognãoestáinstaladoporpadrãonoUbuntuServerouLubuntu.whiptailestáincluídoporpadrão.

Aquiestáumacapturadeteladetexto:

GrubVersion:2.02~beta2-36ubuntu3.15┌─────────┤Usearrow,page,home&endkeys.Tabtoggleoption├──────────┐│MenuNo.---------------MenuName---------------││││0Ubuntu↑││1AdvancedoptionsforUbuntu▮││1>0Ubuntu,withLinux4.14.31-041431-generic▒││1>1Ubuntu,withLinux4.14.31-041431-generic(upstart)▒││1>2Ubuntu,withLinux4.14.31-041431-generic(recoverymode)▒││1>3Ubuntu,withLinux4.14.30-041430-generic▒││1>4Ubuntu,withLinux4.14.30-041430-generic(upstart)▒││1>5Ubuntu,withLinux4.14.30-041430-generic(recoverymode)▒││1>6Ubuntu,withLinux4.14.27-041427-generic▒││1>7Ubuntu,withLinux4.14.27-041427-generic(upstart)▒││1>8Ubuntu,withLinux4.14.27-041427-generic(recoverymode)▒││1>9Ubuntu,withLinux4.14.24-041424-generic▒││1>10Ubuntu,withLinux4.14.24-041424-generic(upstart)▒││1>11Ubuntu,withLinux4.14.24-041424-generic(recoverymode)▒││1>12Ubuntu,withLinux4.14.23-041423-generic▒││1>13Ubuntu,withLinux4.14.23-041423-generic(upstart)↓││││││<DisplayGrubBoot><Exit>│││└──────────────────────────────────────────────────────────────────────────┘

DestaqueaentradaepressioneEnter

UseasteclasdenavegaçãoparadestacarumaopçãoepressioneEnterparaverosdriverspré-kernelcarregadosporgrubeosparâmetrosdeinicializaçãopassadosporgrubparaokernelaoinicializá-lo:

menuentry'Ubuntu,withLinux4.14.27-041427-generic'--classubuntu--classgnu-linux--classgnu--classos$menuentry_id_option'gnulinux-4.14.27-041427-generic-advanced-f3f8e7bc-b337-4194-88b8-3a513f6be55b'{recordfailsavedefaultload_videogfxmode$linux_gfx_modeinsmodgzioif[x$grub_platform=xxen];theninsmodxzio;insmodlzopio;fiinsmodpart_gptinsmodext2if[x$feature_platform_search_hint=xy];thensearch--no-floppy--fs-uuid--set=rootf3f8e7bc-b337-4194-88b8-3a513f6be55belsesearch--no-floppy--fs-uuid--set=rootf3f8e7bc-b337-4194-88b8-3a513f6be55bfiecho'LoadingLinux4.14.27-041427-generic...'linux/boot/vmlinuz-4.14.27-041427-genericroot=UUID=f3f8e7bc-b337-4194-88b8-3a513f6be55broquietsplashloglevel=0vga=currentudev.log-priority=3fastbootkaslracpiphp.disable=1crashkernel=384M-2G:128M,2G-:256M$vt_handoffecho'Loadinginitialramdisk...'initrd/boot/initrd.img-4.14.27-041427-generic}Press<Enter>tocontinue

grub-menu.shbashscript

grub-menu.shtemapenasumaopçãoparaajustar:

# Default for hide duplicate and triplicate options with (upstart) and (recovery mode)? HideUpstartRecovery=false

Defina o valor para true (oculte as entradas extras) ou false (liste todas as entradas).

O formato padrão pode ser substituído ao chamar o script usando:

grub-menu.sh short

ou:

grub-menu.sh long

O código:

#!/bin/bash

# NAME: grub-menu.sh
# PATH: $HOME/bin
# DESC: Written for AU Q&A: https://askubuntu.com/q/1019213/307523
# DATE: Apr 5, 2018. Modified: May 7, 2018.

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi

AllMenusArr=()      # All menu options.
# Default for hide duplicate and triplicate options with (upstart) and (recovery mode)?
HideUpstartRecovery=false
if [[ $1 == short ]] ; then
    HideUpstartRecovery=true    # override default with first passed parameter "short"
elif [[ $1 == long ]] ; then
    HideUpstartRecovery=false   # override default with first passed parameter "long"
fi
SkippedMenuEntry=false  # Don't change this value, automatically maintained
InSubMenu=false     # Within a line beginning with 'submenu'?
InMenuEntry=false   # Within a line beginning with 'menuentry' and ending in '{'?
NextMenuEntryNo=0   # Next grub internal menu entry number to assign
# Major / Minor internal grub submenu numbers, ie '1>0', '1>1', '1>2', etc.
ThisSubMenuMajorNo=0
NextSubMenuMinorNo=0
CurrTag=""          # Current grub internal menu number, zero based
CurrText=""         # Current grub menu option text, ie "Ubuntu", "Windows...", etc.
SubMenuList=""      # Only supports 10 submenus! Numbered 0 to 9. Future use.

while read -r line; do
    # Example: "           }"
    BlackLine="${line//[[:blank:]]/}" # Remove all whitespace
    if [[ $BlackLine == "}" ]] ; then
        # Add menu option in buffer
        if [[ $SkippedMenuEntry == true ]] ; then
            NextSubMenuMinorNo=$(( $NextSubMenuMinorNo + 1 ))
            SkippedMenuEntry=false
            continue
        fi
        if [[ $InMenuEntry == true ]] ; then
            InMenuEntry=false
            if [[ $InSubMenu == true ]] ; then
                NextSubMenuMinorNo=$(( $NextSubMenuMinorNo + 1 ))
            else
                NextMenuEntryNo=$(( $NextMenuEntryNo + 1 ))
            fi
        elif [[ $InSubMenu == true ]] ; then
            InSubMenu=false
            NextMenuEntryNo=$(( $NextMenuEntryNo + 1 ))
        else
            continue # Future error message?
        fi
        # Set maximum CurrText size to 68 characters.
        CurrText="${CurrText:0:67}"
        AllMenusArr+=($CurrTag "$CurrText")
    fi

    # Example: "menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu" ...
    #          "submenu 'Advanced options for Ubuntu' $menuentry_id_option" ...
    if [[ $line == submenu* ]] ; then
        # line starts with 'submenu'
        InSubMenu=true
        ThisSubMenuMajorNo=$NextMenuEntryNo
        NextSubMenuMinorNo=0
        SubMenuList=$SubMenuList$ThisSubMenuMajorNo
        CurrTag=$NextMenuEntryNo
        CurrText="${line#*\'}"
        CurrText="${CurrText%%\'*}"
        AllMenusArr+=($CurrTag "$CurrText") # ie "1 Advanced options for Ubuntu"

    elif [[ $line == menuentry* ]] && [[ $line == *"{"* ]] ; then
        # line starts with 'menuentry' and ends with '{'
        if [[ $HideUpstartRecovery == true ]] ; then
            if [[ $line == *"(upstart)"* ]] || [[ $line == *"(recovery mode)"* ]] ; then
                SkippedMenuEntry=true
                continue
            fi
        fi
        InMenuEntry=true
        if [[ $InSubMenu == true ]] ; then
            : # In a submenu, increment minor instead of major which is "sticky" now.
            CurrTag=$ThisSubMenuMajorNo">"$NextSubMenuMinorNo
        else
            CurrTag=$NextMenuEntryNo
        fi
        CurrText="${line#*\'}"
        CurrText="${CurrText%%\'*}"

    else
        continue    # Other stuff - Ignore it.
    fi

done < /boot/grub/grub.cfg

LongVersion=$(grub-install --version)
ShortVersion=$(echo "${LongVersion:20}")
DefaultItem=0

if [[ $HideUpstartRecovery == true ]] ; then
    MenuText="Menu No.     ----------- Menu Name -----------"
else
    MenuText="Menu No. --------------- Menu Name ---------------"
fi

while true ; do

    Choice=$(whiptail \
        --title "Use arrow, page, home & end keys. Tab toggle option" \
        --backtitle "Grub Version: $ShortVersion" \
        --ok-button "Display Grub Boot" \
        --cancel-button "Exit" \
        --default-item "$DefaultItem" \
        --menu "$MenuText" 24 76 16 \
        "${AllMenusArr[@]}" \
        2>&1 >/dev/tty)

    clear
    if [[ $Choice == "" ]]; then break ; fi
    DefaultItem=$Choice

    for (( i=0; i < ${#AllMenusArr[@]}; i=i+2 )) ; do
        if [[ "${AllMenusArr[i]}" == $Choice ]] ; then
            i=$i+1
            MenuEntry="menuentry '"${AllMenusArr[i]}"'"
            break
        fi
    done

    TheGameIsAfoot=false
    while read -r line ; do
        if [[ $line = *"$MenuEntry"* ]]; then TheGameIsAfoot=true ; fi
        if [[ $TheGameIsAfoot == true ]]; then
            echo $line
            if [[ $line = *"}"* ]]; then break ; fi
        fi
    done < /boot/grub/grub.cfg

    read -p "Press <Enter> to continue"

done

exit 0
por WinEunuuchs2Unix 07.04.2018 / 02:14
2

Acabei de descobrir que você pode usar o preenchimento automático (pressionando tab duas vezes) em comandos como grub-reboot ou grub-set-default e ele fornecerá uma lista das entradas do menu de inicialização disponíveis. Você pode então simplesmente copiar o título que você quer literalmente, você não precisa usar um número.

Infelizmente, por alguma razão, minha instalação do Windows 7 não aparece dessa maneira.

    
por DanMan 29.03.2018 / 14:42
2

Esta deve ser a "string" correta ...

awk -F\' '/^menuentry / {print $2}' /boot/grub/grub.cfg|cat -n|awk '{print $1-1,$1="",$0}'

O último tubo exclui o espaço em branco no início de cada linha e corrige a seqüência numérica de acordo com a entrada do número de grub. Exemplo de saída:

0   Ubuntu
1   Memory test (memtest86+)
2   Memory test (memtest86+, serial console 115200)
3   Windows 10 (su /dev/sdc1)

Se você gosta de ver todas as entradas, também as avançadas, você pode usar

awk -F\' '/(^|| )nuentry / {print $2}' /boot/grub/grub.cfg|cat -n|awk '{print $1-1,$1="",$0}'

mas a sequência de números não é adequada para uso com o grub-set-default.

    
por Stefano Bizzarri 25.01.2018 / 00:37