1

例如,我有一堆这样的文件名:

[foo

我正在编写一些代码来收集它们并对其进行一些处理。

(setf a (car (uiop:directory-files "/path/to/dir")));;for simplicity
                                              ;;we suppose there is only a [foo at /path/to/dir
(uiop:run-program (list "cat" (namestring a)));; cat is just an example

然后它说:

 Subprocess #<UIOP/LAUNCH-PROGRAM::PROCESS-INFO {1009C93CA3}>
 with command ("cat" "/path/to/dir/\\[foo")
 exited with error code 1

虽然(uiop:run-program (list "cat" "/path/to/dir/\[asd"))看起来不错。

我也尝试过这样的事情:

(format NIL "~A" a)
(format NIL "~S" temp)
(princ-to-string temp)

那么如何使用正确的路径名调用 run-program 呢?

4

1 回答 1

3

真实名称对于 SBCL 是可读的,并且 SBCL 允许路径名中的括号作为通配符,因此它需要在打印的表示中对它们进行转义。例如:

#P"d[0-9]"

有一个pathname-name是:

#<SB-IMPL::PATTERN "d" (:CHARACTER-SET . "0-9")>

当我测试您的示例并检查路径名时,我看到:

A pathname.                                                                                                                                                                                                                                                             
Namestring: "/tmp/\\[a"                                                                                                                                                                                                                                                 
Host: #<SB-IMPL::UNIX-HOST {100010D983}>                                                                                                                                                                                                                                
Device: NIL                                                                                                                                                                                                                                                             
Directory: (:ABSOLUTE "tmp")                                                                                                                                                                                                                                            
Name: "[a"                                                                                                                                                                                                                                                              
Type: NIL                                                                                                                                                                                                                                                               
Version: :NEWEST                                                                                                                                                                                                                                                        
Truename: #P"/tmp/\\[a"   

所以,组件没问题:路径名不包含括号,但路径名需要用括号打印以便可读。

没有要求以直接作为本机文件名的方式打印路径名,但 SBCL 中有一个本机文件名接口,记录在此处

或者,您可以调用(uiop:unix-namestring file).

于 2021-03-03T15:45:10.840 回答