Được rồi, điều này không hoàn thành, nhưng tôi đã hết thời gian.
Vì vậy, tôi sử dụng lệnh df, vì tôi biết rằng cái này sẽ có điểm gắn kết ở cuối. Sau đó, tôi grep nó với một mô hình mới gạch chéo. Và sau đó tôi muốn cắt mọi thứ sau khi đăng xuất không gian đầu tiên. Nhưng việc cắt bỏ không hoạt động ngay bây giờ. Không thực sự biết những gì tôi đang làm sai và tôi phải bắt đầu làm việc cho công việc của mình ngay bây giờ, nhưng có lẽ bạn có thể cải thiện việc cắt bỏ tính năng bash. Xin lỗi, không có thời gian để xem hướng dẫn sử dụng để tìm lỗi của tôi. Nhưng chúng ta gần như ở đó:
Đã sửa:
foo=$(df -h | grep -e ' /$'); loo=${foo%%" "*}; echo $loo
Bây giờ nó hoạt động. Thử nó :)
EDIT: Ồ, tôi mới nhận ra rằng tôi đang sử dụng lvg, do đó, đĩa0s [0-4] sẽ được dịch sang đĩa1. Vì vậy, hãy kiểm tra nó và cho tôi biết nếu điều này hiển thị chính xác cho bạn đúng đĩa bạn không sử dụng lvg.
EDIT 2: Vẫn không hoạt động cho nhóm âm lượng logic được mã hóa, nhưng nếu bạn có thể kiểm tra cái này mà không có FileVault, nó sẽ hoạt động
foo=$(mount | grep -e ' / '); foo=${foo%%" "*}; diskutil list | grep "[0-99]:" | grep ${foo##"/dev/"} | grep EFI)
Điều này sẽ tìm kiếm một EFI trên đĩa mà ist được gắn dưới dạng root, vì vậy thường là MacintoshHD
EDIT 3: Điều này thực sự tuyệt vời để giết thời gian tại nơi làm việc. Được rồi, tôi đoán điều này sẽ cung cấp cho bạn câu trả lời đúng. Nó có thể làm như vậy ngay cả khi nó được mã hóa 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
Vì vậy, điều này sẽ cung cấp cho bạn phân vùng EFI trên cùng ổ cứng với thư mục gốc MacintoshHD của bạn.
EDIT 4 (Hy vọng phiên bản cuối cùng)
#!/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
Và đây là lời giải thích
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
Phần khác của tập lệnh bây giờ cố gắng tìm đúng ổ cứng khi đối mặt với Tập tin mã hóa được tạo bởi FileVault. Sau đó, chức năng này sẽ cắt ổ cứng này xuống thông tin ổ đĩa trên ổ cứng này, tìm kiếm EFI làm từ khóa.
Đây là một liên kết về cắt chuỗi trong bash
Cắt chuỗi
EDIT 5: Được rồi. Một lần lặp khác của kịch bản này. Rất, rất xuống cơ bản.
#!/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"
Để hoàn thành, đó là danh sách đĩa của tôi:
/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
Và điều này xảy ra khi tôi chạy tập lệnh:
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$
Tôi đã nghĩ về lý do tại sao nó không làm việc cho bạn cho đến nay. Vì vậy, về cơ bản, nếu điều đó cũng không hoạt động, tôi cần hai thông tin từ bạn. Đầu tiên, tôi sẽ cần biết đầu ra của bạn cho lệnh 'mount'. Của tôi trông như thế này:
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)
Như bạn thấy, nó cho tôi điểm gắn kết '/' trên 'đĩa1'. Tôi chỉ đơn giản giả định, nếu FileVault bị tắt, nó sẽ cung cấp cho bạn điểm gắn kết của bạn trên đĩa0. Nhưng có lẽ tôi đã sai và tôi không có hệ thống nào tắt FileVault. Vì vậy, nếu điểm gắn kết của bạn cũng nằm trên đĩa1 trong khi EFI ở trên đĩa0, nó sẽ trả về sản phẩm nào hoặc chỉ có / dev / vì đây là những gì tôi đã thêm bằng tay. Mặt khác, nếu tôi nhớ chính xác, bạn cũng có phân vùng EFI trên đĩa1.
Dù sao, điều thứ hai tôi cần là bạn chạy tập lệnh này bằng lệnh 'bash -x script', để nó hiển thị những gì nó làm trong khi nó đang chạy. Bằng cách này, chúng ta có thể thấy những gì sai.
Dù sao, tôi hy vọng nó chỉ hoạt động và chúng ta không cần phải đi đến chiều dài này. Nhưng nếu không, chúng ta phải tìm ra một cách khác để tìm ổ cứng chính.
Dù sao, kiểm tra nó. Chúc mừng!
foo=$(df -h | grep -e ' /$'); loo=${foo%%" "*}; echo $loo
và `tạo ID ổ đĩa sai,foo=$(mount | grep -e ' / '); foo=${foo%%" "*}; diskutil list | grep "[0-99]:" | grep ${foo##"/dev/"} | grep EFI; echo $foo
cả sản xuất / dev / đĩa0s2 thay vì / dev / đĩa0s1. Tôi sẽ kiểm tra kịch bản dài hơn của bạn vào ngày mai. Bạn có thể giải thích những gì bạn quan tâm, việc sử dụng các ký tự %% và ## của bạn đang làm gì vì tôi không thể tìm thấy bất kỳ tài liệu nào về chúng trực tuyến. Tức là trong $ {maindrive %% "" *}? Tôi rất muốn học.