我一直在尝试file
命令,但遇到了一些有趣的事情。当我尝试循环访问文件夹的所有文件并调用file
命令时,.swap和.swp文件的输出表现出怪异的行为。当前文件夹中的所有3个字母的文件/文件夹名称都作为交换文件的有效扩展名打印。
file --extension .test.swp
输出.test.swp: ???
,但在循环中调用它具有不同的输出。区别可以在下面看到。这似乎只有在
file --extension
touch a.txt b c def 123 456
for file in `find . -type f`; do
echo $file "->" `file --extension $file` ;
done
echo "test" > .test.swp
echo "-------------"
for file in `find . -type f`; do
echo $file "->" `file --extension $file` ;
done
这将在添加交换文件之前和之后打印输出。
./def -> ./def: ERROR: (null)
./a.txt -> ./a.txt: ERROR: (null)
./456 -> ./456: ERROR: (null)
./123 -> ./123: ERROR: (null)
./c -> ./c: ERROR: (null)
./b -> ./b: ERROR: (null)
-------------
./def -> ./def: ERROR: (null)
./.test.swp -> ./.test.swp: 123 456 def
./a.txt -> ./a.txt: ERROR: (null)
./456 -> ./456: ERROR: (null)
./123 -> ./123: ERROR: (null)
./c -> ./c: ERROR: (null)
./b -> ./b: ERROR: (null)
有人可以解释这种奇怪的行为吗?
编辑:我的Shell是GNU bash版本3.2.57
答案 0 :(得分:3)
原因是您没有引用
`file --extension $file`
它返回???
的{{1}},然后将其作为文件名通配符处理。所以您的输出与您写的一样
.test.swp
通配符echo $file "->" ???
与所有3个字符的文件名匹配,因此将显示这些文件名。
更改为:
???
除非有充分的理由,否则应始终引用变量和命令替换。请参阅I just assigned a variable, but echo $variable shows something else(它讨论变量,但是命令替换的工作方式相同)。