为何通过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
相关产品推荐
相关产品推荐

