![bash 正在改变我的 tr 语句](https://linux22.com/image/92963/bash%20%E6%AD%A3%E5%9C%A8%E6%94%B9%E5%8F%98%E6%88%91%E7%9A%84%20tr%20%E8%AF%AD%E5%8F%A5.png)
使用跟踪选项 -v 和 -x 以下代码运行 bash (4.1.2) 脚本
for Option in "$@"; do
OptName=$(echo $Option | tr [:lower:] [:upper:])
结果是
+ for Option in '"$@"'
echo $Option | tr [:lower:] [:upper:]
++ echo -debug
++ tr '[:lower:]' '[:upper:]'
+ OptName=-DEBUG
这正是我所期望的。但是,另一个用户从同一主机运行相同的 bash 版本会导致
+ for Option in '"$@"'
echo $Option | tr [:lower:] [:upper:]
++ echo -debug
++ tr r r
+ OptName=-debug
请注意,翻译命令已更改为“tr r r”。到目前为止,只有这一个用户,所以它必须是环境中的某种东西(对吗?)。
对于可能导致此问题的原因有什么建议吗?
答案1
r
您有一个名为so 的文件[:upper:]
扩展为r
.
尝试
tr '[:lower:]' '[:upper:]'
(编辑)我的测试
%_ ls
%_ echo [:upper:]
[:upper:]
%_ touch r
%_ echo [:upper:]
r
%_
bash 分几个阶段解析您的命令行,其中之一是“通配”,又称文件名扩展。因此,当 bash 看到 时tr [:lower:] [:upper:]
,它会找到 tr 二进制文件,然后看到括号[ ... ]
并说“啊,所以您想匹配使用以下字符之一命名的文件::
、l
、o
、w
、e
或r
。我明白了一个名为r
-- 给你!
如果没有 r 文件,bash 不能也不会扩展[...]
通配符。