我正在编写一个脚本来检测和格式化 Raspberry Pi 的 USB 驱动器。我让脚本完美地适用于通过 USB 适配器插入的 sd 卡。当我尝试使用 USB3 硬盘时它失败了。隔离故障表明脚本中的通配符扩展和重定向处理存在问题。
当我执行
lsblk -n -o NAME,SIZE,TYPE /dev/sd* 2>/dev/null
在根终端中,输出为空,没有任何 USB 设备,插入时为空:
sda 3.7G disk
└─sda1 3.7G part
sda1 3.7G part
当我在脚本中以这种方式运行它时:
#!/bin/bash
xtra='/dev/sd* 2>/dev/null'
DETECTOR="lsblk -n -o NAME,SIZE,TYPE $xtra"
zenity --info --text="Remove all USB devices" --width=620 --height=200
not_in=$($DETECTOR)
zenity --info --text="Insert USB device to format" --width=420 --height=100
usb_in=$($DETECTOR)
# Get the difference which is inserted USB device and partitions on it
delta=$(diff <(echo "$not_in") <(echo "$usb_in"))
drive=(${delta//[^[:ascii:]]/}) # Delete the non-ASCII characters
echo -e "$not_in\n$usb_in\n\n${drive[@]}\n\n$delta"
得到的是:
lsblk: /dev/sd*: not a block device
lsblk: 2>: not a block device
lsblk: /dev/null: not a block device
lsblk: 2>: not a block device
lsblk: /dev/null: not a block device
sda 3.7G disk
└─sda1 3.7G part
sda1 3.7G part
1c1,3 < --- > sda 3.7G disk > sda1 3.7G part > sda1 3.7G part
1c1,3
<
---
> sda 3.7G disk
> └─sda1 3.7G part
> sda1 3.7G part
我不明白如何在数组变量($drive)中只获取插入的设备及其分区。lsblk 命令的解释方式与 bash 正确扩展 sd* 并将 stderr 指向 /dev/null 的命令行调用以及它在脚本上下文中的运行方式有所不同。
我已经阅读了与不同 shell 如何解释通配符和重定向有关的类似问题,但这仅涉及 bash。
我能想出的唯一解决方法是创建临时文件,这既不优雅也不吸引人: