使用 运行-program 时如何提供正确的路径

How to provide a correct path when using run-program

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

[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)

那么如何调用 运行-具有正确路径名的程序?

SBCL 可读地打印 truename,并且 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 中有一个本机文件名接口,documented here

或者,您可以致电 (uiop:unix-namestring file)