为什么sb-posix:chdir似乎没有改变(truename ".")和(load ...)对cwd的看法?
CL-USER> (sb-posix:getcwd)
"directory-B"
CL-USER> (sb-posix:chdir "directory-A")
0
CL-USER> (sb-posix:getcwd)
"directory-A"
CL-USER> (truename ".")
#P"directory-B"
CL-USER> (sb-posix:chdir "/tmp")
0
CL-USER> (truename ".")
#P"directory-B"
CL-USER> (load "some-file-under-dirA.asd")
; Evaluation aborted on #<SB-INT:SIMPLE-FILE-ERROR "~@<Couldn't load ~S: file does not exist.~@:>" {CE86631}>.发布于 2015-09-29 22:27:11
sb 存储库上有一个小广告。
A few functions in sb-posix don't correspond directly to their C
counterparts.让我们来看看getcwd:
来自这里的C语言
函数将在buf指向的数组中放置当前工作目录的绝对路径名,并返回buf。复制到数组的路径名不应包含符号链接的组件。size参数是buf参数指向的字符数组的大小(以字节为单位)。如果buf是空指针,则不指定getcwd()的行为。
如果我们得到了这个函数的帮助,或者是从存储库中得到的:
“以字符串形式返回进程的当前工作目录。”
这里的问题是SBCL电流定向器被固定在特殊变量中:
*default-pathname-defaults*这就是为什么当您调用truename和“。SBCL显示该变量中的当前目录,该目录不受真正改变shows环境或posix进程的调用shows:chdir的影响。如果您还想更改SBCL目录(在slime中您可以使用cd,然后键入新目录),您可以按下面的方式进行,但是要小心,因为您正在修改包含路径名的特殊变量,例如,它将不能很好地处理slime (我所显示的命令):
╭─anquegi@toshiba-debian ~/learn/lisp/StackOverFlow/testDirs ‹ruby-2.2.1@laguna›
╰─$ tree 148 ↵
.
├── dirA
└── dirB
└── factorial.lisp
2 directories, 1 file那就让我们去黏液吧
; SLIME 2015-06-01
CL-USER> (sb-posix:getcwd)
"/home/anquegi/learn/lisp/StackOverFlow/testDirs"
CL-USER> *default-pathname-defaults*
#P"/home/anquegi/learn/lisp/StackOverFlow/testDirs/"
CL-USER> (sb-posix:chdir "dirB")
0
CL-USER> (sb-posix:getcwd)
"/home/anquegi/learn/lisp/StackOverFlow/testDirs/dirB"
CL-USER> *default-pathname-defaults*
#P"/home/anquegi/learn/lisp/StackOverFlow/testDirs/"
CL-USER> (setf *default-pathname-defaults* (sb-ext:native-pathname (format nil "~A~A" (sb-posix:getcwd) "/")))
#P"/home/anquegi/learn/lisp/StackOverFlow/testDirs/dirB/"
CL-USER> (load "factorial")
T
CL-USER> (factorial 3)
6请注意转换路径名中的字符串并添加"/",我不知道为什么SBCL采用这种工作方式。sb-posix与sbcl路径的分离
https://stackoverflow.com/questions/32660907
复制相似问题