在命令执行前阻止 Bash 扩展通配符

Stop Bash from expanding a wildcard before command execution

我有一个启动脚本 /init 可以启动 Linux 嵌入式系统。在那里我有一个函数可以计算来自 SD-Card

的分区
get_number_of_partitions () { ls ${SDCARD_DEV}p* 2> /dev/null | wc -l; }

它适用于某些 busybox 版本,但不适用于所有版本。期望是对分区进行计数,例如 /dev/mmcblk0p1 /dev/mmcblk0p2。当我向下追踪时,我发现在 non-working 情况下, p*ls 命令之前扩展为 proc 。导致计算 ${SDCARD_DEV} 的 1 个实例 + 来自 proc children.

的大约 100 个项目

我也试过:ls ${SDCARD_DEV}"p*" 结果相同。

我能想到的唯一方法是 ${SDCARD_DEV} 以白色结尾 space,例如

SDCARD_DEV="/dev/ "

因此,正在执行的命令是

ls /dev/ p*

而不是

ls /dev/p*

禁用通配符扩展不会解决此问题。首先,ls 本身不会进行通配符扩展,它依赖于 shell 在调用它之前扩展通配符。其次,ls 仍然会将它们视为两个单独的参数,它不会将 p* 解释为要在 /dev.

中匹配的文件

理想情况下,您首先应该弄清楚为什么要将 space 添加到变量中,然后进行修复。如果没有,您可以在使用变量之前将其删除:

SDCARD_DEV="$(sed 's/ *$//' <<< "$SDCARD_DEV")"