chdir()到主目录

时间:2012-02-29 03:33:16

标签: c unix chdir

我正在使用chdir() C函数来允许用户更改目录。

但是,该功能无法识别'〜'。我是否需要进行任何显式转换,因此chdir无法识别是什么意思?因为我不工作。或者我做错了什么?

2 个答案:

答案 0 :(得分:24)

Tilde扩展由shell处理,而不是由系统调用处理。您可以使用getenv()来读取环境变量HOME,然后将其用作chdir()的参数。

有系统调用可以获得在单个系统上可能更可靠的信息,但它们不是完全可移植的。例如,请查看getpwuid().

答案 1 :(得分:10)

请注意POSIX指定代字号扩展的语义:

  

2.6.1 Tilde扩展

     

“代字号前缀”由单词开头的不带引号的<tilde>字符,后跟单词中第一个未引用的<slash>之前的所有字符,或者所有字符组成如果没有<slash>,这个词。在赋值(请参阅XBD变量赋值)中,可以使用多个波浪号前缀:在单词的开头(即,在赋值的<equals-sign>之后),跟随任何不带引号的<colon>,或者都。分配中的波浪号前缀由第一个未加引号的<colon><slash>终止。如果没有引用tilde-prefix中的任何字符,则<tilde>后面的tilde-prefix中的字符将被视为来自用户数据库的可能登录名。可移植登录名不能包含XBD其他环境变量中LOGNAME环境变量描述中给出的集合之外的字符。如果登录名为null(即,tilde-prefix仅包含波形符),则tilde-prefix将替换为变量HOME的值。如果未设置HOME,则结果未指定。否则,tilde-prefix应替换为与使用POSIX.1-2008的系统接口卷中定义的getpwnam()函数获得的登录名关联的初始工作目录的路径名。如果系统无法识别登录名,则结果未定义。

请特别注意,如果我的用户名为me,则cd ~cd ~me的结果可能不一样!具体来说,HOME环境变量可以设置为与getpwnam()返回的值不同的值。我一直在使用这种技术(超过25年)将HOME设置为我想要的地方,以及少数无法识别cd ~cd ~me之间差异的程序是我生命中的一些(很多)。