在命令执行前阻止 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")"
我有一个启动脚本 /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.
我也试过: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")"