为什么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}>.
答案 0 :(得分:2)
sb-posix repository上有一些广告:
A few functions in sb-posix don't correspond directly to their C
counterparts.
让我们来看看getcwd:
来自here
getcwd()函数应该放置当前的绝对路径名 buf指向的数组中的工作目录,并返回buf。该 复制到数组的路径名不应包含任何组件 象征性的联系。 size参数是以字节为单位的大小 buf参数指向的字符数组。如果buf为null 指针,getcwd()的行为未指定。
如果我们在粘液中或repository:
获得此功能的帮助“以字符串形式返回进程的当前工作目录。”
这里的问题是SBCL当前的directoy固定在特殊变量中:
*default-pathname-defaults*
这就是为什么当你打电话给truename和“。” SBCL向您显示该变量内的当前目录,该变量不受调用sb-posix:chdir的影响,它真正改变了sb-posix环境或posix进程。如果你想更改SBCL目录(你可以使用slime,cd然后输入新目录),你可以按照以下步骤进行操作,但要小心,因为你正在修改一个包含路径名的特殊变量,例如它不会适用于粘液(我已经展示过的命令):
╭─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路径分开