18

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

但是,该功能无法识别“~”。我是否需要进行任何显式转换,所以chdir不知道 ~ 是什么意思?因为我的不工作。还是我做错了什么?

4

2 回答 2

24

波浪号扩展由 shell 处理,而不是系统调用。您可以使用getenv()读取环境变量HOME,然后将其用作chdir().

有一些系统调用来获取这些信息,这在单个系统上可能更可靠,但它们并不是完全可移植的。例如,查看getpwuid()。

于 2012-02-29T03:34:58.683 回答
11

请注意,POSIX指定了波浪号扩展的语义:

2.6.1 波浪号扩展

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

特别注意,如果我的用户名是,和me的结果可能不一样!具体来说,环境变量可以设置为不同于. 我一直在使用这种技术(超过 25 年)来设置我想要的位置,而少数几个程序无法识别它们之间的区别并且是我生活中的一些(许多)祸根。cd ~cd ~meHOMEgetpwnam()HOMEcd ~cd ~me

于 2012-02-29T03:54:33.493 回答