防止变量替换后的文件名替换(Prevent globbing after variable subs

2019-07-29 06:23发布

什么是使用含有保留通配符(文件名完成)触发一些不需要替换字符shell变量(BASH)最优雅的方式? 这里是例子:

for file in $(cat files); do
   command1 < "$file"
   echo "$file"
done

文件名包含像“[”或“]”字符。 我有两种基本思路:

1)关闭经由集-f通配符:我需要在别的地方

2)在逃生文件的文件名:管道进入标准输入时BASH抱怨“找不到文件”

THX对于任何建议

编辑:唯一的答案缺少的是如何从包含用于通配符时,文件名是在一个shell变量“$文件”,例如命令1 <“$文件”特殊字符名称的文件读取。

Answer 1:

作为替代方案之间切换set -fset +f你也许可以只申请一个set -f到子shell,因为父shell的环境不会受到受此可言:

(
set -f
for file in $(cat files); do
   command1 < "$file"
   echo "$file"
done
)


# or even

sh -f -c '
   for file in $(cat files); do
      command1 < "$file"
      echo "$file"
   done
'


Answer 2:

您可以关闭使用通配符set -f ,然后重新打开它后按照剧本set +f



Answer 3:

使用while read来代替。

cat files | while read file; do
    command1 < "$file"
    echo "$file"
done


文章来源: Prevent globbing after variable substitution