【问题标题】:Why does `cd ..` reflect symlink traversal, whereas `ls ..`does not? [closed]为什么 `cd ..` 反映符号链接遍历,而 `ls ..` 没有? [关闭]
【发布时间】:2015-11-28 01:23:31
【问题描述】:
ls ..

表示“列出上层目录的文件和目录。”

当我按照符号链接更改目录时,ls .. 不按照符号链接。它只是显示了 real 上层目录。

例如,当目录结构如下时,

r ┬ a - b - sub@
  └ sub

sub@ 是指向sub 目录的符号链接)

cd a/b/sub 之后的ls ..command 在r 目录中提供文件,因为我在r/sub 中。不是b 目录的。但是cd .. 命令将我带到b 目录。

如何使用ls 命令显示目录b 中的文件?

【问题讨论】:

  • 你为什么要支持一个明显跑题的问题?
  • @m0skit0 Shell 脚本正在编程。这个问题在 Super User、Unix 和 Stack Overflow 之间重叠。
  • @FUZxxl,shell 脚本 编程,我坚信(作为在“bash”和“shell”中都获得金徽章的人),但我是仍然不相信这很适合这里。这更像是“基本的 UNIX 工具的行为如何?”,而不是与脚本使用特别相关的任何内容。
  • @FUZxxl 在问题的任何地方都没有说明这是一个脚本。当然,问题不在于脚本,而在于工具本身。

标签: linux bash shell ls cd


【解决方案1】:

一个目录不知道你用什么符号链接来访问它; .. 是一个实际的目录条目,它指向 real 父目录。但是当你使用 shell 命令cd .. 时,bash 会作弊。它知道你用什么路径到达那里(它在$PWD),所以它只是删除最后一个组件并更改到结果目录。

您可以使用"${PWD%/*}" 而不是.. 来为其他命令自己使用相同的技巧:

ls "${PWD%/*}"

【讨论】:

  • 请不要使用${PWD%/*};这有几个问题。请改用$(dirname $PWD)
  • @FUZxxl 什么问题?我知道的唯一一个是dirname 返回. 的极端情况,并且替换不会在这里不适用。
  • @FUZxxl,如果你要尝试推广最佳实践,至少要做到dirname "$PWD"。否则,您创建的错误比您修复的要多。
  • @EtanReisner 对,$(dirname "$PWD") 更好。替换在foo//bar 之类的路径或根目录上无法正常工作。它也可能在相对路径上失败。它在foo/bar/ 上也失败了。 dirname 使用fairly complex algorithm 处理所有可能的情况。
  • 再一次,如果你还是要使用子shell,你可以(cd .. && ls)。函数呢? symls() ( cd "$@" && ls )?您可以像symls .. 一样使用它,或者发疯似的使用symls -P .. 来完全取消对路径的引用。
猜你喜欢
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
相关资源
最近更新 更多