我正在使用chdir()
C函数来允许用户更改目录。
但是,该功能无法识别'〜'。我是否需要进行任何显式转换,因此chdir
无法识别是什么意思?因为我不工作。或者我做错了什么?
答案 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
之间差异的程序是我生命中的一些(很多)。