【问题标题】:Stop Bash from expanding a wildcard before command execution在命令执行之前阻止 Bash 扩展通配符
【发布时间】:2021-07-12 16:07:32
【问题描述】:

我有一个启动脚本/init,它可以启动 Linux 嵌入式系统。在那里我有一个计算 SD 卡分区的函数

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

它适用于一些 busybox 版本,但不是所有版本。期望是计算分区,例如/dev/mmcblk0p1 /dev/mmcblk0p2。当我追踪时,我发现在不工作的情况下,p*ls 命令之前扩展为proc。导致计算 1 个 ${SDCARD_DEV} 实例 + 来自 proc 孩子的大约 100 个项目。

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

【问题讨论】:

  • $SDCARD_DEV的值是多少?
  • $SDCARD_DEV 看起来像/dev/mmcblk0
  • 停止扩展不会有帮助,因为ls 本身不会执行扩展。

标签: linux bash busybox


【解决方案1】:

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

SDCARD_DEV="/dev/ "

因此,正在执行的命令是

ls /dev/ p*

而不是

ls /dev/p*

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

理想情况下,您应该首先弄清楚为什么将空间添加到变量中,然后解决这个问题。如果没有,您可以在使用变量之前将其删除:

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

【讨论】:

    猜你喜欢
    • 2018-10-12
    • 1970-01-01
    • 2011-04-29
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    相关资源
    最近更新 更多