【问题标题】:implementing cd command using chdir() in linux在 linux 中使用 chdir() 实现 cd 命令
【发布时间】:2010-06-19 03:44:15
【问题描述】:

我正在编写自己的 shell 程序。我目前正在使用 chdir 实现 cd 命令。 我想使用以下选项实现 chdir:

-P 不要跟随符号链接
-L 跟随符号链接(默认)

我发布了question here previously asking to know if a path is a symbolic link or actual path。但是有了这些信息,我无法获得有关如何继续解决上述问题的任何想法。

谢谢

【问题讨论】:

  • 你有这个功能的好用例吗?我认为任何现有的 shell 都不会这样做,我认为任何用户都不会这样做,但也许他们是。看起来就像是神秘的 unix 复杂性,没有太多最终用户的好处。当最终用户关心目录是否是符号链接时,符号链接“功能”将失败。最终用户不应该关心。虽然我可以看到递归文件遍历实用程序(例如 tar 和 scp 具有不遵循符号链接的选项)的更多有效用例,但对于执行 cd 的交互式 shell,价值是什么并不明显。只是好奇。
  • Bash 提供cd -Pcd -L(默认为cd -L)。当您完成 cd -P 后,cd .. 会带您进入物理文件系统层次结构,即使您通过符号链接到达那里,但如果您已经完成 cd -L 到达那里,那么 @987654328 @ 从符号链接的名称中去掉一个元素,让你“升级”一个级别。

标签: linux chdir


【解决方案1】:

也许我理解错了,但你只是想要(伪代码):

is_symlink = method_from_other_question();
if(is_symlink and arg(-P))
    fail("Can't switch directory -- is a symlink");

如果您已经尝试过类似的方法但它不起作用,请将代码包含在您的问题中,我们可以帮助调试它

【讨论】:

    【解决方案2】:

    Shell 通常会使用很多技巧来找到真正的目录名称。为了方便我们的用户,他们还伪造了很多东西。例如:

    $ pwd
    /home/auser
    $ ls -l
    adir -> some/place/
    some/
    $ cd adir
    $ pwd
    /home/auser/adir
    $ cd ..
    $ pwd
    /home/auser
    

    看起来合乎逻辑?再看一遍:/home/auser/some/place 中的.. 指向/home/auser/some,而不是/home/auser 而是cd .. 带你到后者。

    IOW,除了在内存中始终保留当前目录的绝对路径并在执行cd 时对其进行完全解析(并检查其中的每个元素),别无他法。

    是的,它不可靠。过去有一次我设法欺骗了 bash,它显示了我当前目录的完全错误的绝对路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 2012-06-09
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多