获取当前在Steel Bank Common Lisp中执行的脚本的路径

获取当前在Steel Bank Common Lisp中执行的脚本的路径,lisp,common-lisp,sbcl,Lisp,Common Lisp,Sbcl,我正在从系统中的不同位置调用CL脚本。如何获取当前执行的脚本的文件路径 例如,脚本源文件位于/home/user/project/source/目录中。正在从/home/user/目录以以下方式执行脚本: user@machine:~$./project/source/script.lsp 无论调用方位于何处,脚本都应该知道它位于/home/user/project/source/目录中 我尝试使用*default pathname defaults*变量,但以下命令显示了调用脚本的目录: (格

我正在从系统中的不同位置调用CL脚本。如何获取当前执行的脚本的文件路径

例如,脚本源文件位于
/home/user/project/source/
目录中。正在从
/home/user/
目录以以下方式执行脚本:

user@machine:~$./project/source/script.lsp

无论调用方位于何处,脚本都应该知道它位于
/home/user/project/source/
目录中

我尝试使用
*default pathname defaults*
变量,但以下命令显示了调用脚本的目录:

(格式为t“路径名:~S~&”*默认路径名默认值*)

环境:Ubuntu 18.04上的SBCL 1.4.5.debian。

我在浏览不同的问题时偶然发现

正如@Andrei所指出的,可以读取通过使用以下表达式调用的脚本的完整路径名:

; truename function expands relative path to the script stored in $_ variable
(truename (sb-ext:posix-getenv "_"))

由于此解决方案依赖于环境变量和bash shell,正如@DmitryGrigoryev在中指出的,它可能不可移植。

加载或编译时,
*加载truename*
*编译文件truename*
变量分别绑定到加载或编译时使用
cl:load
或使用
cl:compile file
编译的文件的truename

在您的情况下,应该使用
*load truename*
。它将为脚本提供完整的绝对路径名