Shell-Script
mke2fs - 回答腳本中的“覆蓋”問題
我使用
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
神奇地檢測到它是使用管道輸入執行的,然後它甚至沒有嘗試讀取它。
-q
flag 對此沒有影響。該腳本在 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/zero
ordd if=/dev/urandom
,但兩者都有file -s
returndata
作為文件類型: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