加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

emacs lisp shell进程参数的问题

发布时间:2020-12-15 21:02:44 所属栏目:安全 来源:网络整理
导读:我正在尝试直接从xemacs运行P4V命令. 把p4.el拉到emacs之后我写了以下内容: (defun p4v-command (cmd) (get-buffer-create p4-output-buffer-name);; We do these two lines (kill-buffer p4-output-buffer-name) ;; to ensure no duplicates (call-process
我正在尝试直接从xemacs运行P4V命令.
把p4.el拉到emacs之后我写了以下内容:

(defun p4v-command (cmd)
  (get-buffer-create p4-output-buffer-name);; We do these two lines
  (kill-buffer p4-output-buffer-name)      ;; to ensure no duplicates
  (call-process "p4v" nil (get-buffer-create p4-output-buffer-name) nil
                "-p" (p4-get-p4-port)
                "-u" "UserName"
                "-c" (p4-current-client)
                "-cmd" (shell-quote-argument (concat cmd " " (buffer-name))))
  (display-buffer p4-output-buffer-name))

我正在尝试为shell命令获取以下内容(当cmd等于prevdiff时):

p4v -p port -u user -c client -cmd "prevdiff file.txt"

但是,当我用prevdiff执行上述函数时,我得到以下错误

P4V: unrecognized argument '"prevdiff' for '-cmd' option.

因此,似乎调用进程将引用的字符串“prevdiff file.txt”拆分为单个参数,而P4V仅处理第一个参数.

对于我尝试使用call-process的其他命令,似乎没有这种情况发生,因此我不确定它是否是一个lisp问题或与P4V有关.

有谁知道如何解决这个问题?

解决方法

call-process肯定不会连接它的参数;它直接传递给程序.要查看这种情况,请键入M-:并计算以下表达式:

(call-process "/bin/ls" nil "*scratch*" nil "avg ba")

其中“avg”和“ba”是当前目录中的文件.我将以下消息插入到临时缓冲区中:

/bin/ls: cannot access avg ba: No such file or directory

如果call-process重新解析了参数,它会将“avg ba”分成两个独立的参数—但错误信息表明它没有.

相反,问题在于shell-quote-argument.当我评估你在暂存缓冲区中提到的调用时,我得到以下结果:

(shell-quote-argument "prevdiff file.txt")
"prevdiff file.txt"

换句话说,实际接收的命令p4v就是你在shell中输入的内容:

p4v -p port -u user -c client -cmd '"prevdiff file.txt"'

这就是p4v抱怨“prevdiff”的原因.

所以我认为你想要的是:

"-cmd" (concat cmd " " (shell-quote-argument (buffer-name))))

(当然,请检查我的parens).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读