常见的lisp:run shell命令,包含字符串" \ n"

时间:2016-12-24 18:32:49

标签: linux shell common-lisp newline sbcl

我试图运行一些简化为

的东西

(trivial-shell:shell-command (concatenate 'string "echo -e " "one" "\n" "two"))

并尝试让它返回类似

的内容

"one two"

而它返回的是

"onentwo "

我愿意使用与琐碎的贝壳不同的东西(我尝试过劣质贝壳,但它有同样的问题)

在64位Gentoo Linux上使用SBCL 1.1.18

2 个答案:

答案 0 :(得分:4)

输出换行符的最简单方法是在字符串中添加换行符:

(print "one
two")

您还可以将换行符强制转换为字符串:

(concatenate 'string "one" (string #\newline) "two")

您不能在字符串中使用\n来插入换行符:反斜杠仅用于转义字符串中的双引号(例如"\"")。必要的是,它也用于逃避实际的反斜杠字符。 因此,如果要打印反斜杠后跟n,则需要转义反斜杠:

(print "\\n")

但是,为什么你需要4个反斜杠?

因为trivial-shell:shell-command调用一个shell,由*bourne-compatible-shell*给出,并以字符串形式给出一个命令。因此,您的字符串也可能受到shell转义规则的约束。

(trivial-shell:shell-command "echo -e one \\\\n two")

知道这一点,您可能需要考虑bourne兼容shell具有单引号这一事实,它不需要在其中转义字符。以下按预期工作:

(trivial-shell:shell-command "echo 'one 
two'")

请注意,trivial-shell:*bourne-compatible-shell*的默认值为"/bin/sh",据我所知,-e无法识别echo的{​​{1}}选项。您可能已经知道这一点,但您可能想要使用不同的shell。这是一个使用参数之间的换行调用echo的程序:

(defun echo-args (&rest args)
  (let ((trivial-shell:*bourne-compatible-shell* #P"/bin/bash"))
    (trivial-shell:shell-command
     (format nil "echo -e '~{~A~^~%~}'" args))))

答案 1 :(得分:0)

通过使用四个反斜杠而不是一个来解决它。