bash 正在改变我的 tr 语句

-1 shell bash quoting wildcards

使用跟踪选项 -v 和 -x 以下代码运行 bash (4.1.2) 脚本

for Option in "$@"; do
OptName=$(echo $Option | tr [:lower:] [:upper:])
Run Code Online (Sandbox Code Playgroud)

结果是

+ for Option in '"$@"'
echo $Option | tr [:lower:] [:upper:]
++ echo -debug
++ tr '[:lower:]' '[:upper:]'
+ OptName=-DEBUG
Run Code Online (Sandbox Code Playgroud)

这是我所期望的。但是,在同一主机上运行具有相同 bash 版本的另一个用户会导致

+ for Option in '"$@"'
echo $Option | tr [:lower:] [:upper:]
++ echo -debug
++ tr r r
+ OptName=-debug
Run Code Online (Sandbox Code Playgroud)

请注意,翻译命令已更改为“tr r r”。到目前为止,只有这个用户,所以它必须是环境中的某些东西(对吗?)。

关于可能导致这种情况的任何建议?

Arc*_*mar 8

你有一个名为rso的文件[:upper:]被扩展为r.

尝试

tr '[:lower:]' '[:upper:]' 
Run Code Online (Sandbox Code Playgroud)

(编辑)我的测试

%_ ls
%_ echo [:upper:]
[:upper:]
%_ touch r
%_ echo [:upper:]
r
%_
Run Code Online (Sandbox Code Playgroud)

bash 分几个阶段解析您的命令行,其中之一是“globbing”,也就是文件名扩展。因此,当 bash 看到 时tr [:lower:] [:upper:],它会找到 tr 二进制文件,然后看到[ ... ]括号并说“啊,所以您想匹配以以下字符之一命名的文件::, l, o, w, e, or r。我明白了一个名为r- 给你!

如果没有 r 文件,bash 不能也不会扩展[...]通配符。