我试图运行一些简化为
的东西 (trivial-shell:shell-command
(concatenate 'string "echo -e " "one" "\n" "two"))
并尝试让它返回类似
的内容 "one
two"
而它返回的是
"onentwo
"
我愿意使用与琐碎的贝壳不同的东西(我尝试过劣质贝壳,但它有同样的问题)
在64位Gentoo Linux上使用SBCL 1.1.18
答案 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)
通过使用四个反斜杠而不是一个来解决它。