CMUCL:仅退出运行程序输出过程



我正在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/")

最新更新