โอเคนี่ยังไม่เสร็จ แต่ฉันหมดเวลาแล้ว
ดังนั้นฉันใช้คำสั่ง df เพราะฉันรู้ว่านี่จะมีจุดเชื่อมต่อในตอนท้าย จากนั้นฉัน grep มันด้วยรูปแบบของการขึ้นบรรทัดใหม่เฉือน จากนั้นฉันก็อยากจะตัดทุกอย่างหลังจากออกจากช่องว่างแรก แต่การตัดออกใช้ไม่ได้ในตอนนี้ ไม่รู้จริง ๆ ว่าฉันทำอะไรผิดและฉันต้องเริ่มทำงานให้กับงานของฉันในตอนนี้ แต่บางทีคุณอาจปรับปรุงคุณลักษณะการทุบตีได้ ขออภัยไม่มีเวลาค้นหาคู่มือเพื่อค้นหาความผิดพลาดของฉัน แต่เราเกือบจะถึงแล้ว:
การแก้ไข:
foo=$(df -h | grep -e ' /$'); loo=${foo%%" "*}; echo $loo
ตอนนี้มันใช้งานได้ ลองมัน :)
แก้ไข: โอ้ฉันเพิ่งรู้ว่าฉันใช้ lvg ดังนั้น disk0s [0-4] จะถูกแปลเป็น disk1 ดังนั้นลองทดสอบและบอกฉันว่านี่แสดงดิสก์ที่ถูกต้องที่คุณไม่ได้ใช้ lvg หรือไม่
แก้ไข 2: ยังคงไม่ทำงานสำหรับกลุ่มโลจิคัลวอลุ่มที่เข้ารหัส แต่ถ้าคุณสามารถทดสอบอันนี้ได้โดยไม่ต้องใช้ FileVault ก็ควรใช้งานได้
foo=$(mount | grep -e ' / '); foo=${foo%%" "*}; diskutil list | grep "[0-99]:" | grep ${foo##"/dev/"} | grep EFI)
นี่จะมองหา EFI บนดิสก์ที่เมาท์เป็นรูทดังนั้นมักจะเป็น MacintoshHD
แก้ไข 3: นี่ยอดเยี่ยมมากที่จะฆ่าเวลาในที่ทำงาน โอเคฉันเดาว่าสิ่งนี้ควรให้คำตอบที่ถูกต้องแก่คุณ มันสามารถทำได้แม้ว่าจะเป็น 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
ดังนั้นควรให้พาร์ติชัน EFI ในฮาร์ดไดรฟ์เดียวกันกับโฟลเดอร์รูทของคุณ MacintoshHD
แก้ไข 4 (หวังว่าเวอร์ชั่นสุดท้าย)
#!/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
และนี่คือคำอธิบาย
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
ตอนนี้ส่วนอื่นของสคริปต์พยายามค้นหาฮาร์ดไดรฟ์ที่ถูกต้องเมื่อเผชิญหน้ากับ FileVault ที่สร้างโวลุ่มที่เข้ารหัส จากนั้นฟังก์ชั่นจะตัดฮาร์ดไดรฟ์นี้ลงไปยังข้อมูลดิสก์บนฮาร์ดไดรฟ์นี้โดยมองหา EFI เป็นคำหลัก
นี่คือลิงค์เกี่ยวกับการตัดสตริงในทุบตีการ
ตัดสตริง
แก้ไข 5: เอาล่ะ การย้ำอีกครั้งของสคริปต์นี้ มากไปมากถึงพื้นฐาน
#!/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"
เพื่อให้เสร็จสมบูรณ์นั่นคือรายการดิสดิซูลของฉัน:
/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
และสิ่งนี้จะเกิดขึ้นเมื่อฉันรันสคริปต์:
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$
ฉันคิดว่าทำไมมันไม่ได้ผลสำหรับคุณจนถึงตอนนี้ โดยพื้นฐานแล้วถ้ามันไม่ได้ผลผมก็ต้องการข้อมูลสองอย่างจากคุณ ก่อนอื่นฉันต้องรู้เอาต์พุตของคุณสำหรับคำสั่ง 'mount' ฉันมีลักษณะเช่นนี้:
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)
อย่างที่คุณเห็นมันให้จุดเมานต์ '/' บน 'disk1' ฉันเดาเอาเองว่าถ้า FileVault ปิดอยู่มันจะให้จุดเมานท์ของคุณบน disk0 แต่บางทีฉันผิดและไม่มีระบบที่ FileVault ถูกปิด ดังนั้นหากจุดเมานต์ของคุณยังอยู่ใน disk1 ในขณะที่ EFI อยู่บน disk0 ก็ควรกลับมาว่างเปล่าหรือมีเพียง / dev / เนื่องจากเป็นสิ่งที่ฉันเพิ่มด้วยตนเอง ในทางกลับกันถ้าฉันจำได้อย่างถูกต้องคุณมีพาร์ติชัน EFI ใน disk1 ด้วย
อย่างไรก็ตามสิ่งที่สองที่ฉันต้องการก็คือคุณรันสคริปต์นี้ด้วยคำสั่ง 'bash -x script' เพื่อให้มันแสดงสิ่งที่มันทำในขณะที่มันกำลังทำงานอยู่ ด้วยวิธีนี้เราสามารถเห็นสิ่งที่ผิดพลาด
อย่างไรก็ตามฉันหวังว่ามันจะใช้งานได้และเราไม่ต้องไปไกลขนาดนี้ แต่ถ้าไม่เราต้องหาวิธีอื่นเพื่อหาฮาร์ดไดรฟ์หลัก
อย่างไรก็ตามทดสอบมัน ไชโย!
foo=$(df -h | grep -e ' /$'); loo=${foo%%" "*}; echo $loo
และ `ผลิต ID ไดรฟ์ที่ไม่ถูกต้องfoo=$(mount | grep -e ' / '); foo=${foo%%" "*}; diskutil list | grep "[0-99]:" | grep ${foo##"/dev/"} | grep EFI; echo $foo
ทั้งผลิต / dev / disk0s2 มากกว่า / dev / disk0s1 ฉันจะทดสอบสคริปต์อีกต่อไปของคุณในวันพรุ่งนี้ คุณสามารถอธิบายสิ่งที่น่าสนใจการใช้งาน %% และ ## อักขระของคุณกำลังทำอยู่เพราะฉันไม่พบเอกสารใด ๆ เช่นใน $ {maindrive %% "" *} หรือไม่ ฉันกระตือรือร้นที่จะเรียนรู้