Ok, isso não está completo, mas fiquei sem tempo.
Então, eu uso o comando df, porque eu sei que isso terá o ponto de montagem no final. Então eu grep-lo com um padrão de slash newline. E então eu queria cortar tudo após o primeiro espaço sair. Mas o recorte não funciona agora. Não sei realmente o que estou fazendo de errado e tenho que começar a trabalhar para o meu trabalho agora, mas talvez você possa melhorar o corte do recurso bash. Desculpe, não há tempo para procurar o manual para encontrar o meu erro. Mas estamos quase lá:
Corrigido:
foo=$(df -h | grep -e ' /$'); loo=${foo%%" "*}; echo $loo
Agora funciona. Experimente:)
EDITAR:
Ah, acabei de perceber que estou usando um lvg, portanto disk0s [0-4] será traduzido para disk1. Então, teste-o e diga-me se isso está mostrando corretamente o disco certo que você não está usando um lvg.
EDIT 2:
Ainda não está funcionando para o grupo de volume lógico criptografado, mas se você pudesse testar este sem o FileVault, ele deveria funcionar
foo=$(mount | grep -e ' / '); foo=${foo%%" "*}; diskutil list | grep "[0-99]:" | grep ${foo##"/dev/"} | grep EFI)
Isso procuraria por um EFI no disco no qual ele é montado como root, então geralmente MacintoshHD
EDIT 3:
Isso é ótimo para matar o tempo no trabalho. Ok, acho que isso deveria lhe dar a resposta certa. Ele pode fazer isso mesmo se for criptografado pelo FileVault.
#!/bin/bash
maindrive=$(mount | grep -e " / ")
maindrive_exact=${maindrive%%" "*}
maindrive_reduced=${maindrive_exact##"/dev/"}
if [ "$(diskutil list | grep Unlocked)" = "" ]
then
diskline=$(diskutil list | grep "[0-99]:" | grep $maindrive_reduced | grep EFI)
diskline_cut1=${diskline##*"B "}
diskline_cut2=${diskline##*" "}
echo "/dev/$diskline_cut2"
else
alldisk=$(diskutil list)
alldisk_cut1=${alldisk##*${maindrive_reduced}}
alldisk_cut2=${alldisk_cut1#*"Logical Volume on "}
alldisk_cut3=${alldisk_cut2%%" "*}
echo /dev/$alldisk_cut3
fi
Portanto, isso deve fornecer a partição EFI no mesmo disco rígido que a sua pasta raiz MacintoshHD.
EDIT 4 (Esperemos que a versão final)
#!/bin/bash
maindrive=$(mount | grep -e " / ")
maindrive_exact=${maindrive%%" "*}
maindrive_reduced=${maindrive_exact##"/dev/"}
function getdisknumber {
diskline=$(diskutil list | grep "[0-99]:" | grep $maindrive_reduced | grep EFI)
diskline_cut1=${diskline##*"B "}
diskline_cut2=${diskline##*" "}
echo "/dev/$diskline_cut2"
}
if [ "$(diskutil list | grep Unlocked)" = "" ]
then
getdisknumber
else
alldisk=$(diskutil list)
alldisk_cut=${alldisk#*${maindrive_reduced}}
alldisk_cut=${alldisk_cut#*"Logical Volume on "}
alldisk_cut=${alldisk_cut%%" "*}
alldisk_cut=${alldisk_cut%s*}
maindrive_reduced=$alldisk_cut
getdisknumber
fi
E aqui está a explicação
Okay, as ask in the comment, the explanation what %%,%,##,# means.
All those symbols cut out information of a string.
%%pattern cuts out the biggest pattern matching part to the right.
%pattern cuts out the smallest pattern matching part to the right.
##pattern cuts out the biggest pattern matching part to the left
#pattern cuts out the smallest pattern matching part to the left
A outra parte do script agora tenta encontrar o disco rígido certo quando confrontado com um Volume criptografado criado pelo FileVault. Em seguida, a função corta esse disco rígido até as informações do disco neste disco rígido, procurando EFI como uma palavra-chave.
Aqui está um link sobre o corte de strings no bash
Cortando strings
EDIT 5:
Tudo bem. Outra iteração desse script. Muito, muito para baixo ao básico.
#!/bin/bash
## Find the main hard drive
maindrive=$(mount | grep -e " / ")
maindrive=${maindrive#/dev/}
maindrive=${maindrive%%" "*}
## Checking for FileVault
if [ "" != "$(diskutil list /dev/disk1 | grep "Unlocked Encrypted")" ]
then
maindrive=$(diskutil list | grep "Logical Volume on")
maindrive=${maindrive#*"Logical Volume on "}
maindrive=${maindrive%s*}
fi
## Checking for EFI
EFI_DRIVE=$(diskutil list /dev/$maindrive | grep EFI)
EFI_DRIVE=${EFI_DRIVE##*" "}
echo "/dev/$EFI_DRIVE"
Para completar, essa é a minha lista de diskutil:
/dev/disk0
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *250.1 GB disk0
1: EFI EFI 209.7 MB disk0s1
2: Apple_CoreStorage 249.2 GB disk0s2
3: Apple_Boot Recovery HD 650.0 MB disk0s3
/dev/disk1
#: TYPE NAME SIZE IDENTIFIER
0: Apple_HFS Macintosh HD *248.8 GB disk1
Logical Volume on disk0s2
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Unlocked Encrypted
E isso acontece quando eu executo o script:
Joes-MacBook-Pro:EFI_Script joe$ chmod +x EFI_Script
Joes-MacBook-Pro:EFI_Script joe$ ./EFI_Script
/dev/disk0s1
Joes-MacBook-Pro:EFI_Script joe$
Eu pensei em por que isso não funcionou para você até agora. Então, basicamente, se isso não funcionar, eu preciso de duas informações suas. Primeiro, precisarei saber sua saída para o comando 'mount'. O meu parece assim:
Joes-MacBook-Pro:EFI_Script joe$ mount
/dev/disk1 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)
Como você pode ver, ele me fornece o ponto de montagem '/' on 'disk1'. Eu simplesmente presumi que, se o FileVault estivesse desativado, ele forneceria o seu ponto de montagem no disco0. Mas talvez eu esteja errado e não tenha nenhum sistema no qual o FileVault esteja desligado. Então, se o seu ponto de montagem também estiver no disco1 enquanto a EFI estiver no disco0, ele deve retornar vazio ou apenas com / dev /, já que é isso que eu adicionei manualmente. Por outro lado, se bem me lembro, você também tinha uma partição EFI no disk1.
De qualquer forma, a segunda coisa que eu preciso é que você execute este script com o comando 'bash -x script', para que ele mostre o que ele faz enquanto está rodando. Desta forma, podemos ver o que está errado.
De qualquer forma, espero que funcione e não tenhamos que ir a esse tamanho. Mas se não, temos que descobrir outra maneira de encontrar o disco rígido principal.
De qualquer forma, teste-o.
Felicidades!