测试带有尾部斜杠的链接吗?

测试带有尾部斜杠的链接吗?

我创建于/tmp/test/

mkdir somedir
ln -s somedir/ somelink

我想要仅循环遍历目录:

for file in */ ; do 
  if [[ -d "$file" && ! -L "$file" ]]; then
    echo "$file is a directory";
  fi;
done

但为什么会出现这样的情况somelink is a directory呢?

而没有斜线它就不会出现?

for file in * ; do 
...

zsh 有区别吗?

答案1

给定参数中的尾部斜杠-L导致符号链接始终被解析(即在 lstat(2) 调用的级别)。参见 POSIX.1基本定义、一般概念、路径名解析,或 Linux 中的“尾部斜杠”路径解析(2)

这并不是特定于桀骜

您可以使用一个简单的参数扩展去掉尾部斜杠:

[[ … -L "${file%/}" … ]]

上面的代码应该可以在任何类似 Bourne 的 shell 中工作(克什,,短跑,巴什,桀骜等)。

相关内容