2011-11-23 71 views
0

我有一個運行在Linux上的BASH/shell腳本,但它有時在使用blkid獲​​取驅動器標籤時出現問題.. blkid獲​​取驅動器標籤和UUID給定的驅動器。 BLKID輸出的BASH/shell腳本,blkid失敗,驅動器標籤中有換行符

例子:

# blkid /dev/sda1 
/dev/sda1: LABEL="Home" UUID="f1e5e82b-1c75-4fd7-8841-6ad766152dcf" TYPE="ext2" 

當驅動器標籤有一個換行符將出現問題...我已經包含相關功能。這個問題似乎與eval命令..有人可以幫助我嗎?

blkid_name_generator() { 
    #Gather blkid output and filter out required device 
    if [ ! -f /tmp/blkid.txt ]; then 
     blkid -c /dev/null > /tmp/blkid.txt 
    fi 
    blkid_cleaner & 
    LABEL="" 
    LABEL1="" 
    eval $(cat /tmp/blkid.txt | grep "[email protected]:" | cut --delimiter=" " -f 2- | sed -e 's/ /;/g') 
    LABEL1=${LABEL//;/ } # akita beta4 fix: remove newlines below 
    LABEL=`echo $LABEL1 | tr -d '\n'` # akita beta5 fix, remove newlines from drive label 
    #Generate drive label 
    [ "$LABEL" = "" ] && ONEDRVLABEL="[email protected]\n \n " || ONEDRVLABEL="${LABEL}\n([email protected])\n " 
    echo "${LABEL}" and "${ONEDRVLABEL}" 
} 

blkid_name_generator /dev/sda1 
+0

什麼是blkid_cleaner?它修改/tmp/blkid.txt的內容嗎? – Kashyap

+0

當然,最明顯的修復方法是拒絕錯誤的卷名稱。 – sehe

+0

是的,嘗試了各種忽略狡猾標籤的方式......每當有新行時,我都會收到'eval'的錯誤...我不確定,blkid_cleaner沒有安裝,但可以使用發佈的功能而不是實現我想要的 – sc0ttman

回答

1

,這裏是我的bash片段:

我的測試文件是:
/dev/sda1: LABEL="Boot" UUID="fdc5e51d-3da6-4edf-bf07-6397b1765797" TYPE="ext2" 
/dev/sda2: LABEL="Root" UUID="f883df24-1b93-46fb-8990-840774c380c4" TYPE="ext4" 
/dev/sda3: LABEL="Usr" UUID="ba759de3-e0e4-4603-a324-f11dc25fa784" TYPE="reiserfs" 
/dev/sdb1: LABEL="Persis 
tents" UUID="50b81ef0-a38b-4677-b9d9-9548b29ce2bb" TYPE="ext4" 
/dev/sdc1: LABEL="Tempo 
raries" UUID="a649c535-1a8a-4b2b-b0a0-4afbdc60a3bc" TYPE="reiserfs" 
/dev/sdd1: LABEL="Usr 
Portage" UUID="a228148e-6405-4bbe-990f-df6eaebb1b1d" TYPE="reiserfs" 
/dev/sda1: LABEL="Boot" UUID="fdc5e51d-3da6-4edf-bf07-6397b1765797" TYPE="ext2" 
/dev/sda2: LABEL="Root" UUID="f883df24-1b93-46fb-8990-840774c380c4" TYPE="ext4" 

這裏是由bash的片段處理後,我的測試文件:

/dev/sda1: LABEL="Boot" UUID="fdc5e51d-3da6-4edf-bf07-6397b1765797" TYPE="ext2" 
/dev/sda2: LABEL="Root" UUID="f883df24-1b93-46fb-8990-840774c380c4" TYPE="ext4" 
/dev/sda3: LABEL="Usr" UUID="ba759de3-e0e4-4603-a324-f11dc25fa784" TYPE="reiserfs" 
/dev/sdb1: LABEL="Persistents" UUID="50b81ef0-a38b-4677-b9d9-9548b29ce2bb" TYPE="ext4" 
/dev/sdc1: LABEL="Temporaries" UUID="a649c535-1a8a-4b2b-b0a0-4afbdc60a3bc" TYPE="reiserfs" 
/dev/sdd1: LABEL="UsrPortage" UUID="a228148e-6405-4bbe-990f-df6eaebb1b1d" TYPE="reiserfs" 
/dev/sda1: LABEL="Boot" UUID="fdc5e51d-3da6-4edf-bf07-6397b1765797" TYPE="ext2" 
/dev/sda2: LABEL="Root" UUID="f883df24-1b93-46fb-8990-840774c380c4" TYPE="ext4" 

希望這有助於!

0

我看不出有什麼你腳本正打算(從丟失的位間隔)做的。

這就是我想出了:

blkid | perl -ne 'print "$1\n" if m/LABEL="(.*?)"/o' 

它會顯示這(在我的系統):

test^J123 
WIN7VIRT 
TEMP 

注意標籤中的換行符是如何描繪爲^J?通過十六進制編碼器查看顯示它確實是一個兩字符組合0x5e 0x4a

希望你可以進一步瞭解這一點。


PS: '證據' 是換行實際上是在正確的卷標

tune2fs /dev/sdc1 -l 
tune2fs 1.41.14 (22-Dec-2010) 
Filesystem volume name: test 
123 
Last mounted on:   /media/9868d90c-aede-4e7a-b105-d9312f8b17ab 
Filesystem UUID:   9868d90c-aede-4e7a-b105-d9312f8b17ab 
Filesystem magic number: 0xEF53 
Filesystem revision #: 1 (dynamic) 
... 

和塊級:

dd if=/dev/sdc1 count=10 | xxd | grep 123 
0000470: b105 d931 2f8b 17ab 7465 7374 0a31 3233 ...1/...test.123 
0

感謝這個問題...我可以找到另一個問題的解決方案。實施例(SDA2 = NTFS分區):

BLKID的/ dev/SDA2

分段錯誤(核心轉儲)

很難找到這個問題的故障排除指南(ubuntu的基於OS或任何其他)

背後的原因是NTFS分區中格式不正確的LABEL。 (當然,我們不能看到,作爲新行; - ) 解決方案:清除標籤與GParted;然後重寫它或設置一個新的LABEL。