我使用chdir() C函数来允许用户更改目录。
但是,该函数不能识别“~”。我需要做任何显式转换吗,这样chdir就不会识别~的意思了?因为我的坏了。还是我做错了什么?
发布于 2012-02-29 11:34:59
波浪号扩展由shell处理,而不是由系统调用处理。您可以使用getenv()读取环境变量HOME,然后将其用作chdir()的参数。
有一些系统调用来获取这些信息,这些调用在单个系统上可能更可靠,但它们不是完全可移植的。例如,看看getpwuid().
发布于 2012-02-29 11:54:33
请注意,POSIX指定了代字号扩展的语义:
2.6.1 Tilde扩展
“代字号前缀”由单词开头的未加引号的<tilde>字符组成,后面是单词中第一个未加引号的<slash>之前的所有字符,如果没有<slash>,则由单词中的所有字符组成。在赋值(参见XBD变量赋值)中,可以使用多个代字号前缀:在单词的开头(即,在赋值的<equals-sign>之后),在任何未加引号的<colon>之后,或者同时使用这两个前缀。赋值中的波浪号前缀由第一个未加引号的<colon>或<slash>终止。如果代字号前缀中没有任何字符被引用,则<tilde>后面的代字号前缀中的字符将被视为用户数据库中可能的登录名。可移植登录名不能包含XBD Other environment Variables中LOGNAME环境变量说明中给出的集合以外的字符。如果登录名为null (即,代字号前缀仅包含代字号),则代字号前缀将替换为变量HOME的值。如果未设置HOME,则不指定结果。否则,代字号前缀应替换为初始工作目录的路径名,该路径名与使用POSIX.1-2008的系统接口卷中定义的getpwnam()函数获得的登录名相关联。如果系统无法识别登录名,则结果未定义。
特别要注意,如果我的用户名是me,则cd ~和cd ~me的结果可能不同!具体来说,可以将HOME环境变量设置为与getpwnam()返回的值不同的值。我已经使用这种技术(超过25年)将我的HOME设置在我想要的地方,少数不能识别cd ~和cd ~me之间的区别的程序是我生活中的一些(许多)祸害。
https://stackoverflow.com/questions/9493234
复制相似问题