chdir()到主目录

chdir()到主目录,c,unix,chdir,C,Unix,Chdir,我正在使用chdir()C函数允许用户更改目录 但是,该函数无法识别“~”。我是否需要进行任何显式转换,以便chdir无法识别~的含义?因为我的坏了。还是我做错了什么?Tilde扩展由shell处理,而不是由系统调用处理。您可以使用getenv()读取环境变量HOME,然后将其用作chdir()的参数 有一些系统调用来获取这些信息,这些信息在单个系统上可能更可靠,但它们不是完全可移植的。例如,请参见注释,其中指定了波浪形展开的语义: 2.6.1瓷砖扩展 “波浪形前缀”由单词开头的一个不带引号的字

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


但是,该函数无法识别“~”。我是否需要进行任何显式转换,以便
chdir
无法识别~的含义?因为我的坏了。还是我做错了什么?

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

有一些系统调用来获取这些信息,这些信息在单个系统上可能更可靠,但它们不是完全可移植的。例如,请参见

注释,其中指定了波浪形展开的语义:

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


请特别注意,如果我的用户名是
me
,则
cd~
cd~me
的结果可能不同!具体来说,
HOME
环境变量可以设置为与
getpwnam()
返回的值不同的值。我已经使用这项技术25年了,把我的
家设置在我想要的地方,少数几个程序不认识
cd~
cd~me
之间的区别,这是我生活中的一些(许多)祸害。

chdir(getenv(“HOME”)
。是
chdir()
如果参数为空,是否保证不会崩溃?如果是的话,这就可以了;否则,一点错误检查就可以了!它不会崩溃,但肯定会失败,你可能想知道。据我所知,这并不能保证。这里有一个代码片段,供任何希望使用后一种方法的人使用。当您需要展开
~username
时,您需要使用
getpwnam()
而不是
getpwuid()
来查找主目录。+1指出
~
~me
引用不同的源来完成工作-很高兴知道。但是,尽管POSIX指定了tilde扩展,但它在shell一章中,而不是在系统调用中。