Bash:ls的子shell行为

Mar*_* T. 3 bash shell scripting ls subshell

我想知道为什么我没有得到相同的输出:

ls -1 -tF | head -n 1

echo $(ls -1 -tF | head -n 1)

我试图获取最后修改过的文件,但是在子shell中使用它有时会得到多个文件?

为什么那样以及如何避免?

123*_*123 6

问题出现是因为你使用了一个不带引号的子shell和-F标志,用于输出附加到文件名的ls输出shell特殊字符.

-F, -
将附加指示符(*/=> @ |之一)分类到条目

可执行文件附加*.

当你跑步

echo $(ls -1 -tF | head -n 1)
Run Code Online (Sandbox Code Playgroud)

然后

$(ls -1 -tF | head -n 1)
Run Code Online (Sandbox Code Playgroud)

将返回一个文件名,如果它恰好是一个可执行文件,也是另一个文件的前缀,那么它将返回两者.

例如,如果你有

test.sh
test.sh.backup
Run Code Online (Sandbox Code Playgroud)

然后它会回来

test.sh*
Run Code Online (Sandbox Code Playgroud)

当回声扩展到

test.sh test.sh.backup
Run Code Online (Sandbox Code Playgroud)

引用子shell可以防止这种扩展

echo "$(ls -1 -tF | head -n 1)"
Run Code Online (Sandbox Code Playgroud)

回报

test.sh*
Run Code Online (Sandbox Code Playgroud)