chdir()到主目录

dar*_*sky 17 c unix chdir

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

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

Ern*_*ill 24

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

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

  • 即`chdir(getenv("HOME"))`. (7认同)
  • 如果参数为NULL,`chdir()`是否保证不会崩溃?如果是这样,那就没问题; 否则,将进行一些错误检查! (2认同)

Jon*_*ler 10

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

2.6.1 Tilde扩展

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

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