我正在Debian strave,并从稳定的存储库中安装CMUCL。尝试以下
(run-program "sh" '("ls") :output T)
我得到
#<process 2845 :EXITED>
没有预期的输出。有帮助吗?
阅读ls(1)和dash(1)&amp;bash(1)。请注意,POSIX /bin/sh
通常是其中一个的符号链接(通常dash
,有时是bash
)。请注意PATH
变量的作用(例如,在Shells和execvp(3)中)。系统(3)使用/bin/sh
与-c
一起使用,您的sh
(假设它是POSIX Shell)需要-c
将字符串解释为命令。
您可以尝试
(run-program "/bin/ls" nil :output t)
或
(run-program "/bin/sh" '("-c" "ls") :output t)
您的工作目录中可能没有ls
(但是PATH
中的其他地方;在POSIX上,它应该是/bin/ls
),而/bin/ls
不是shell脚本,而是某些Elf可执行的脚本(在Linux上;在大多数Unixs上,它是有些可执行,不是脚本)。因此/bin/sh ls
(或sh ls
)无法按照您的需要工作。
要运行ls
,无需启动外壳!而且您可能不需要为此目的(列表文件)分配ls
进程,因为您可以将Opendir(3)readdir(3)stat(3)stat(2)封闭(3)称为ffi(或找到一些处理此操作的软件包)。
ps。我已经使用SBCL测试了这些。
cmucl
(run-program "ls" '("-l") :input t :output t)
将起作用。这也很好:
(run-program "ls" '("-l" "-h") :input t :output t)
,如果您需要产生简单的弦,则将其添加为参数:
(run-program "ls"
`("-l" ,(format nil "~A" path-name))
:input t
:output t)
在这种情况下,您必须使用BackQuote(Backtick)和逗号。也可以做:
(defun my-ls (file)
(run-program "ls"
`("-l" "-h" ,file)
:input t
:output t))
现在您有:
(my-ls "/home/user/")