我试图在C中编写命令cd,而不使用exec函数,我已经执行了cd -P版本,但是我似乎找不到一种方法来执行cd (cd -L),因为函数chdir解析符号链接,因此我的cd -L的行为类似于cd -P。
对于cd -P,我做了一个函数,它选择了我们想要到达的路径作为参数,并且在我的文件中有一个类似于$OLDPWD的变量old_pwd (我使用getenv("PWD")来初始化它),如果参数是空的,我只是在$HOME上使用chdir,如果参数是"-“,我在变量old_pwd上使用chdir,最后如果它是路径,我在该路径上使用chdir。如果您对如何更改当前目录而不解析任何符号链接有想法,我将非常感激!
发布于 2022-11-20 19:19:34
POSIX 路径分解通过一条路径逐步地工作,从头到尾解析符号链接。这是POSIX chdir()解释路径的方式,它与cd -P的行为是一致的。
cd -L需要不同的行为:表单..的步骤相对于给定路径中的其他文字步骤进行解释,而不管是否有任何步骤指定符号链接。这种行为不同于chdir(),所以您必须自己实现它,这在很大程度上是在将结果传递给chdir()之前解析和处理路径中的.和..的外观的问题。
上面链接的cd POSIX规范提供了一个详细的算法,说明cd -L应该如何执行所需的路径操作。因此,我删除了我在这个答案的早期版本中提出的算法,并用与POSIX官方规范相关的说明替换了有关它的说明。
备注:
CDPATH和与之关联的cd的一些目录搜索语义。详细信息在链接规范中。如果您要使用完整的POSIX语义,那么您将需要处理这个问题;否则,我怀疑是否有很多人会注意到该特性的缺失。-P的效果是将指定的路径按原样传递给chdir(),条件是任何目标路径实际上都是指定的,或者如果没有指定路径,则将$HOME的值传递给chdir()。-L生效时,相对路径将根据$PWD的当前值进行解释。前导..路径步骤的处理考虑到了这一点。..之前的领先路径(根据标准路径解析规则(包括符号链接遍历)解释)未指定目录,则..处理将导致cd失败。那是,- `dir1/dir2/..` and `dir1/symlink-to-dir3/..` are both ok, and both are equivalent to `dir1`, but- `dir1/regular-file/..`, `dir1/not-a-filename/..`, and similar are erroneous.-L也没有给出-L,那么-P行为是默认的。https://stackoverflow.com/questions/74510712
复制相似问题