为什么这个 shell 脚本中的 basename 是必需的?

Why is basename in this shell script necessary?

我找到了这个 shell 脚本(</code>、<code> 是目录):

mv "" ""  ||  exit               # Make  a subdirectory of 
cd "/$(basename "")"  ||  exit   # Change directories for simplicity
for f in *; do
    mv "$f" "${f%.*}.txt"            # Add or change the extension
done

它将第二个目录移动到第一个目录中(因此第二个目录成为第一个目录的子目录)并且第二个目录中的所有文件都将具有“.txt”扩展名。我不明白为什么 cd "/" 不起作用 basename 没有从给定目录中删除文件名?有人可以解释一下这部分: cd "/$(basename "")" 有效吗?另外 $2 需要用单独的引号 ("") 因为 basename?

basename删除前导目录信息。假设使用如下参数调用 sript:

$$> script usr/local/foo usr/local/bar

现在 </code> 等于 <code>usr/local/bar

如果只执行 cd /,命令将如下所示:

cd usr/local/foo/usr/local/bar

但实际上应该是

cd usr/local/foo/bar

正在从 usr/local/bar 中删除此目录前缀是 basename 所做的。

https://www.geeksforgeeks.org/basename-command-in-linux-with-examples/

Also needs to be in separate quotes("") because of basename?

是的,外部扩展集 "/$(...)" 和内部扩展集 "" 都需要被引用以防止 word splitting 出现问题,否则会破坏命令</code> 包含空格(或 shell 全局字符)。</p> <p>参见例如<a href="https://unix.stackexchange.com/q/118433/170373">Quoting within $(command substitution) in Bash</a> 在 unix.SE 了解详情。</p> <p>(其实也应该是<code>cd -- "/$(basename -- "")"来防范-开头的filenames/paths。)