如何向Clozure CL的run-program传递引号作为参数?
在Clozure CL中使用run-program传递引号参数的正确方式
要解决向ccl:run-program传递引号参数的问题,核心是理解**run-program直接向外部程序传递参数,不经过shell解析**,因此不需要对引号做额外的shell转义处理:
传递单个双引号作为参数
直接在参数列表中传入包含双引号的字符串即可,代码示例:(with-output-to-string (stream) (ccl:run-program "echo" (list "\"") :output stream) )运行后返回的字符串在Lisp环境中会显示为
"\"",但实际内容就是单个双引号。你可以通过(char *返回值* 0)验证,结果为#\"。传递被引号包裹的字符串
如果目标是传递类似"hello world"这样带引号的完整字符串,直接构造包含引号的参数即可:(with-output-to-string (stream) (ccl:run-program "echo" (list "\"hello world\"") :output stream) )这段代码会让
echo输出"hello world",最终得到的字符串就是该内容。
关键说明
ccl:run-program会将参数列表直接映射到外部程序的argv数组,无需像在shell中那样用引号分隔参数或转义特殊字符。之前的问题是混淆了Lisp字符串的转义表示与实际传递的内容——Lisp中用\"表示字符串内的双引号,这个转义仅存在于Lisp代码层面,传递给外部程序的是原始的双引号字符。
内容的提问来源于stack exchange,提问作者Rimaux
相关产品推荐
相关产品推荐

