You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何通过bash -ilc间接调用compgen时行为异常?

Bash中compgen保留环境变量形式补全的间接调用问题

直接在bash中调用compgen时,传入指向目录的环境变量,若变量未被提前解析,补全结果能保留变量形式:

> cd /tmp
> mkdir files
> touch files/aa files/ab
> export MY_FILES=/tmp/files
> echo "$MY_FILES/"
/tmp/files
> compgen -v -A file -- "$MY_FILES/"  # 非预期结果
/tmp/files/ab
/tmp/files/aa
> echo "\$MY_FILES/"
$MY_FILES/
> compgen -v -A file -- "\$MY_FILES/" # 预期结果
$MY_FILES/ab
$MY_FILES/aa

但通过间接方式调用时(即使使用登录shell),该功能失效:

> bash -ilc 'echo "\$MY_FILES/"; compgen -v -A file -- "\$MY_FILES/"'
$MY_FILES/
> echo $?
1

从echo的输出可以确认转义是正确的,问题不在字符串转义环节。

将命令写入脚本调用,同样失效:

> cat run-compgen
#!/bin/bash -il

echo "\$MY_FILES/"
compgen -v -A file -- "\$MY_FILES/"
echo $?

> ./run-compgen
$MY_FILES/
1

以下是已尝试但无效的解决方案:

  • 使用登录shell:无论登录shell还是交互式shell,都无法解决问题。
  • 调整变量转义方式:不转义变量时虽有输出,但不符合预期;尝试2、3、4个反斜杠转义$,也没有效果。
  • 检查变量存在性:执行bash -c env能看到变量,说明嵌套shell中变量已正确识别。
  • 排除环境干扰:在干净的Docker容器中测试,问题依然存在:
    > docker run -it ubuntu bash # 启动干净的Ubuntu容器
    # 容器内操作:
    > cd /tmp
    > mkdir files
    > touch files/aa files/ab
    > export MY_FILES=/tmp/files
    > bash -ilc 'compgen -v -A file -- "\$MY_FILES/"'
    

内容的提问来源于stack exchange,提问作者Flogo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:46:16