我試圖運行的東西,簡化了Common Lisp的:包含字符串 「 n」
(trivial-shell:shell-command (concatenate 'string "echo -e " "one" "\n" "two"))
,並試圖讓它返回類似
"one two"
雖然它返回的卻是
"onentwo "
我會開到使用的東西從瑣碎的殼不同的(我試過不如殼,但它有同樣的問題)
對64位使用SBCL 1.1.18的Gentoo Linux
我試圖運行的東西,簡化了Common Lisp的:包含字符串 「 n」
(trivial-shell:shell-command (concatenate 'string "echo -e " "one" "\n" "two"))
,並試圖讓它返回類似
"one two"
雖然它返回的卻是
"onentwo "
我會開到使用的東西從瑣碎的殼不同的(我試過不如殼,但它有同樣的問題)
對64位使用SBCL 1.1.18的Gentoo Linux
輸出最簡單的方法換行符是讓你的字符串內使用換行符:
(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")
知道了,你可能要考慮到一個事實,即伯恩兼容殼具有單引號,不需要逃避他們的內部字符。如預期了以下工作:
(trivial-shell:shell-command "echo 'one
two'")
注意,對於trivial-shell:*bourne-compatible-shell*
的默認值是"/bin/sh"
,這是據我所知,不承認-e
選項echo
。您可能已經知道這一點,但您可能想要使用其他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))))
通過使用四個反斜槓而不是一個來解決它。
反斜槓轉義下一個字符。如果在字符串中需要反斜槓字符,則必須用另一個反斜槓「\\ n」'將其轉義。 – jkiiski
您必須在字符串中反斜槓反斜槓 – coredump
也不起作用,結果是一樣的。三個反斜槓也是一樣的。 在我給出的問題中使用了四個反斜槓,但在實際代碼中無效 - 我將更新問題以反映此問題。 –