从带有.swp文件的循环调用时,为什么文件输出不同?

时间:2019-04-30 17:01:09

标签: bash shell sh

我一直在尝试file命令,但遇到了一些有趣的事情。当我尝试循环访问文件夹的所有文件并调用file命令时,.swap和.swp文件的输出表现出怪异的行为。当前文件夹中的所有3个字母的文件/文件夹名称都作为交换文件的有效扩展名打印。

file --extension .test.swp输出.test.swp: ???,但在循环中调用它具有不同的输出。区别可以在下面看到。这似乎只有在

  • 有一个for循环
  • 使用file --extension
  • 有一个.swp / .swap文件,该文件不为空
  • 有些文件/文件夹中只有三个字符。
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

1 个答案:

答案 0 :(得分:3)

原因是您没有引用

`file --extension $file`

它返回???的{​​{1}},然后将其作为文件名通配符处理。所以您的输出与您写的一样

.test.swp

通配符echo $file "->" ??? 与所有3个字符的文件名匹配,因此将显示这些文件名。

更改为:

???

除非有充分的理由,否则应始终引用变量和命令替换。请参阅I just assigned a variable, but echo $variable shows something else(它讨论变量,但是命令替换的工作方式相同)。