Shell-Script

mke2fs - 回答腳本中的“覆蓋”問題

  • October 11, 2021

我使用mke2fs實用程序來創建文件系統。如果文件系統已經存在,我會收到確認提示:

~# mkfs.ext4 /dev/xvdf 
mke2fs 1.46.2 (28-Feb-2021)
/dev/xvdf contains a ext4 file system labelled 'Data'
       created on Sun Oct 10 22:06:41 2021
Proceed anyway? (y,N) n

到目前為止,一切都很好。現在我想將此命令放入腳本中,並使其no在這種情況下靜默選擇:

~# echo 'n' | mkfs.ext4 /dev/xvdf 
mke2fs 1.46.2 (28-Feb-2021)
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: c3136577-5ef3-435c-a02c-ebae8d1f4e32
Superblock backups stored on blocks: 
       32768, 98304, 163840, 229376

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

???在這種情況下沒有互動式提示,它只是繼續工作。也嘗試過expect, 並且yes n正如@kjensenxz 稍後所建議的那樣 - 也沒有提示。它不會在等待輸入時卡住 - 毫無疑問,就好像mke2fs神奇地檢測到它是使用管道輸入執行的,然後它甚至沒有嘗試讀取它。

-qflag 對此沒有影響。

該腳本在 alpine linux 上執行,如果這很重要的話。

如果找到文件系統,則沒有選項mkfs.ext4告訴它中止。相反,您需要自己執行該檢查。(我想如果stdinmkfs.ext4連接到終端,只會費心詢問確認,如果沒有,它會假設它不會得到答案,所以無論如何都會繼續。這將是一種類似於並輸出不同佈局的合理方法。)ls``ls | cat

以下是 Pi 上的設備文件系統查詢範例,

file -s /dev/mmcblk0p1
/dev/mmcblk0p1: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "mkfs.fat", sectors/cluster 16, root entries 512, Media descriptor 0xf8, sectors/FAT 32, sectors/track 63, heads 255, sectors 129024 (volumes > 32 MB), reserved 0x1, serial number 0x22e0c711, label: "boot       ", FAT (16 bit)

file -s /dev/mmcblk0p2
/dev/mmcblk0p2: Linux rev 1.0 ext4 filesystem data, UUID=202638e1-4ce4-45df-9a00-ad725c2537bb (needs journal recovery) (extents) (large files)

file -s /dev/mmcblk0p3
/dev/mmcblk0p3: LVM2 PV (Linux Logical Volume Manager), UUID: 40t385-3Q2C-u3Qz-TN5b-1fI1-0oYC-PsMQ3c, size: 27618967552

有很多可能的選項——比我在這裡展示的要多得多——所以尋找“空”的情況可能更容易,只有在預期的設備匹配時才繼續。對於實驗,您可以使用dd if=/dev/zeroor dd if=/dev/urandom,但兩者都有file -sreturndata作為文件類型:

dd if=/dev/zero bs=1M count=100 of=/tmp/100M.dat
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.487274 s, 215 MB/s

lodev=$(losetup --find --show /tmp/100M.dat ); echo $lodev
/dev/loop0

file -s $lodev
/dev/loop0: data

losetup -d $lodev
rm /tmp/100M.dat

程式碼可能是這樣的,

#!/bin/sh
device=/dev/xvdf

magic=$(file -s "$device" 2>&1)
if [ "$magic" = "$device: data" ]
then
   # It isn't an obvious filesystem
   mkfs.ext4 ... "$device"
else
   # Uh oh
   printf "%s\n" "Cowardly refusing to create a filesystem on ${magic%%,*}" >&2
   exit 1
fi

引用自:https://unix.stackexchange.com/questions/672692