Linux Common lisp:运行包含字符串“\n”的shell命令

Linux Common lisp:运行包含字符串“\n”的shell命令,linux,shell,common-lisp,newline,sbcl,Linux,Shell,Common Lisp,Newline,Sbcl,我正在尝试运行一些简化为 普通shell:shell命令 连接“字符串回显-e一\n二 并试图让它返回类似于 一个 两个 相反,它返回的是 二 我愿意使用一些不同于普通shell的东西。我尝试过次等shell,但它也有同样的问题 在64位Gentoo Linux上使用SBCL 1.1.18时,通过使用四个反斜杠而不是一个反斜杠解决了这个问题。通过使用四个反斜杠而不是一个反斜杠解决了这个问题。输出换行符的最简单方法是在字符串中包含一个换行符: (print "one two") 还可以将换行符

我正在尝试运行一些简化为

普通shell:shell命令 连接“字符串回显-e一\n二

并试图让它返回类似于

一个 两个

相反,它返回的是

我愿意使用一些不同于普通shell的东西。我尝试过次等shell,但它也有同样的问题


在64位Gentoo Linux上使用SBCL 1.1.18时,通过使用四个反斜杠而不是一个反斜杠解决了这个问题。

通过使用四个反斜杠而不是一个反斜杠解决了这个问题。

输出换行符的最简单方法是在字符串中包含一个换行符:

(print "one
two")
还可以将换行符强制转换为字符串:

(concatenate 'string "one" (string #\newline) "two")
不能在字符串中使用\n插入换行符:反斜杠仅用于转义字符串中的双引号,例如\。当然,它也用于转义实际的反斜杠字符。 因此,如果要打印后跟n的反斜杠,则需要转义反斜杠:

(print "\\n")
但是,为什么你需要4个反斜杠呢

因为普通shell:shell命令调用shell,如*bourne compatible shell*所示,并将命令作为字符串提供给它。因此,您的字符串也可能受shell转义规则的约束

(trivial-shell:shell-command "echo -e one \\\\n two")
要知道这一点,您可能需要考虑这样一个事实,即与bourne兼容的shell具有单引号,而单引号中不需要转义字符。以下工作如预期:

(trivial-shell:shell-command "echo 'one 
two'")
请注意,普通shell的默认值:*bourne compatible shell*是/bin/sh,据我所知,它不识别echo的-e选项。您可能已经知道这一点,但可能需要使用不同的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))))

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

(print "one
two")
还可以将换行符强制转换为字符串:

(concatenate 'string "one" (string #\newline) "two")
不能在字符串中使用\n插入换行符:反斜杠仅用于转义字符串中的双引号,例如\。当然,它也用于转义实际的反斜杠字符。 因此,如果要打印后跟n的反斜杠,则需要转义反斜杠:

(print "\\n")
但是,为什么你需要4个反斜杠呢

因为普通shell:shell命令调用shell,如*bourne compatible shell*所示,并将命令作为字符串提供给它。因此,您的字符串也可能受shell转义规则的约束

(trivial-shell:shell-command "echo -e one \\\\n two")
要知道这一点,您可能需要考虑这样一个事实,即与bourne兼容的shell具有单引号,而单引号中不需要转义字符。以下工作如预期:

(trivial-shell:shell-command "echo 'one 
two'")
请注意,普通shell的默认值:*bourne compatible shell*是/bin/sh,据我所知,它不识别echo的-e选项。您可能已经知道这一点,但可能需要使用不同的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。必须在字符串中使用反斜杠。如果反斜杠无效,则结果相同。三次反斜杠也是一样的。四个反斜杠在我在问题中给出的示例中有效,但在实际代码中无效-我将更新问题以反映这一点。命令中的字符串周围也缺少引号。反斜杠转义下一个字符。如果要在字符串中使用反斜杠字符,则必须用另一个反斜杠转义\\n。必须在字符串中使用反斜杠。如果反斜杠无效,则结果相同。三次反斜杠也是一样的。四个反斜杠在我在问题中给出的示例中有效,但在实际代码中不起作用-我将更新问题以反映这一点。命令中的字符串周围也缺少引号。