2016-12-24 65 views
1

我試圖運行的東西,簡化了Common Lisp的:包含字符串 「 n」

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

,並試圖讓它返回類似

"one two"

運行shell命令

雖然它返回的卻是

"onentwo "

我會開到使用的東西從瑣碎的殼不同的(我試過不如殼,但它有同樣的問題)

對64位使用SBCL 1.1.18的Gentoo Linux

+1

反斜槓轉義下一個字符。如果在字符串中需要反斜槓字符,則必須用另一個反斜槓「\\ n」'將其轉義。 – jkiiski

+0

您必須在字符串中反斜槓反斜槓 – coredump

+0

也不起作用,結果是一樣的。三個反斜槓也是一樣的。 在我給出的問題中使用了四個反斜槓,但在實際代碼中無效 - 我將更新問題以反映此問題。 –

回答

3

輸出最簡單的方法換行符是讓你的字符串內使用換行符:

(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)))) 
0

通過使用四個反斜槓而不是一個來解決它。