--- emacs shell模式中的+ prlctl问题
我在Mac上运行Parallels上的Windows虚拟机。
我想编写一些在Mac的OS-X上运行的shell和Perl脚本 类似UNIX的环境,它在Parallels上调用Windows应用程序。 特别是FrameMaker。
具体来说,我希望能够在emacs中工作,在本机上运行 Mac,然后做esc -x编译运行一个Makefile - 说 Makefile就像运行FrameMaker ExtendScript命令一样 做一些事情,比如更新一本书的目录 FrameMaker,将FrameMaker文件保存为文本或PDF等。基本上, 不幸的是,通常的各种自动化不再那么普遍。
我去年曾在Windows上使用过Cygwin,但是我 切换到使用带有Parallels的Mac。
prlctl命令似乎是我运行命令所需要的。 具体而言," prlctl exec"或者可能" prlctl进入"用于控制台 类型用法。
问题:prlctl exec在emacs下的shell模式缓冲区中运行不正常 在Mac上。
prlctl exec似乎在MacOS终端窗口中运行正常。
但是在emacs shell模式缓冲区中,嗯:
a)跑步" prlctl进入"工作一个emacs shell模式缓冲区工作。 我可以运行DOS命令行类型命令。但是当我退出时 " prlctl进入" session,它总是退出控制shell模式缓冲区的shell。
b)同样,命令如" prlctl exec ..."在emacs中运行 shell模式缓冲区,但是当exec' ed命令终止时,它 终止控制shell模式缓冲区的shell。
c)如果我尝试将prlctl exec放在后台,例如(prlctl exec ...&), 事情变得疯狂。看起来像键盘控制代码被发送到 shell控制emacs shell模式缓冲区。
我猜想" prlctl"是远程控制Windows命令 通过某种伪终端拦截。它一直都是 使用交互式MacOS终端窗口进行测试,但它不起作用 使用用于emacs shell-mode的伪终端。
问:有没有人设法做出类似的工作?说"只需从Mac终端窗口运行prlctl exec命令即可 可能几乎是正确的做法,尽管作为emacs原生, 这会很痛苦。但即使从Mac终端窗口运行, 我遇到了类似的prtlctl问题。
到目前为止,我还没能通过prlctl启动FrameMaker, 虽然我可以通过.BAT文件或PowerShell轻松启动它。
--- + emacs shell缓冲区的prlctl问题示例
--- ++ prlctl在mac终端窗口中成功运行
Andy-Glew-MacBook-Pro:~ glew$ prlctl list
UUID STATUS IP_ADDR NAME
{3b5c5ff5-2909-4a8b-a9e6-a54d909ba98c} running - WinVM
Andy-Glew-MacBook-Pro:~ glew$ prlctl enter WinVM
Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.
C:\>echo hi
echo hi
hi
C:\>exit
exit
Andy-Glew-MacBook-Pro:~ glew$
Andy-Glew-MacBook-Pro:~ glew$
--- ++ prlctl在emacs shell模式缓冲区中运行
$ bash glew@Andy-Glew-MacBook-Pro [~/hack] c47 h1222 j0 $
$ bash ~/hack $>
$ bash 1222 $> prlctl enter WinVM
Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.
C:\>echo hi
echo hi
hi
C:\>exit
exit
✓ 02:27:14 PM Saturday 2015-10-17
$ bash glew@Andy-Glew-MacBook-Pro [~/hack] c48 h1223 j0 $
$ bash ~/hack $>
$ bash 1223 $> exit
Process shell finished
"退出"我输入上面导致prlctl进入退出,因为它应该 - 但它显然也被发送到emacs shell模式控制进程。
--- ++ prlctl exec在macos终端窗口中
Andy-Glew-MacBook-Pro:~ glew$ prlctl exec WinVM ipconfig | grep localdomain
Connection-specific DNS Suffix . : localdomain
Tunnel adapter isatap.localdomain:
Connection-specific DNS Suffix . : localdomain
Andy-Glew-MacBook-Pro:~ glew$
这可行,我可以输入更多命令。我可以在脚本中执行多个prlctl执行
--- ++ prlctl exec在emacs shell模式缓冲区中
$ bash 1226 $> prlctl exec WinVM ipconfig | grep local
Connection-specific DNS Suffix . : localdomain
Link-local IPv6 Address . . . . . : fe80::958c:20a3:da02:2903%3
Tunnel adapter isatap.localdomain:
Connection-specific DNS Suffix . : localdomain
Link-local IPv6 Address . . . . . : fe80::249d:2248:f52c:c8fc%5
✓ 02:31:43 PM Saturday 2015-10-17
$ bash glew@Andy-Glew-MacBook-Pro [~/hack] c45 h1227 j0 $
$ bash ~/hack $>
$ bash 1227 $> exit
Process shell finished
再次,它看起来像一个"退出"命令正在提供给 prlctl exec的Windows命令解释器 - 它看起来像prlctl exec 建立在prlctl enter之上 - 并且正在提供给它们 Windows命令解释器和emacs shell模式控制 过程
--- ++在Mac终端窗口中执行prlctl exec命令
首先,unbackgrounded:
Andy-Glew-MacBook-Pro:~ glew$ prlctl exec WinVM ipconfig | grep localdomain
Connection-specific DNS Suffix . : localdomain
Tunnel adapter isatap.localdomain:
Connection-specific DNS Suffix . : localdomain
然后,背景:
Andy-Glew-MacBook-Pro:~ glew$ prlctl exec WinVM ipconfig | grep localdomain &
[1] 63866
Andy-Glew-MacBook-Pro:~ glew$
[1]+ Stopped prlctl exec WinVM ipconfig | grep localdomain
它暂停了一段时间。看来,即使在MacOS终端中也是如此 窗口,prlctl需要某种控制tty访问 exec - 即使它不应该用于此命令。
Andy-Glew-MacBook-Pro:~ glew$ fg
prlctl exec WinVM ipconfig | grep localdomain
^C^C
^D
^ZAndy-Glew-MacBook-Pro:~ glew$
Andy-Glew-MacBook-Pro:~ glew$
Andy-Glew-MacBook-Pro:~ glew$
--- ++在emacs shell模式缓冲区中执行prlctl exec命令
会话文本缩进。
我会注释
首先,我知道最短的prlctl exec命令:
$ bash glew@Andy-Glew-MacBook-Pro [~/hack] c44 h1226 j0 $
$ bash ~/hack $>
$ bash 1226 $> prlctl exec WinVM echo hi &
[1] 63659
✓ 02:39:20 PM Saturday 2015-10-17
暂停了一会儿,但最终出现了僵硬的情况 - 它看起来像prlctl发送"退出"回到shell模式。
$ bash glew@Andy-Glew-MacBook-Pro [~/hack] c45 h1227 j1 $
$ bash ~/hack $>
$ bash 1227 $> exit
Process shell finished
使用更长的命令,例如" prlctl exec ... ipconfig",会出现更多内容:
$ bash glew@Andy-Glew-MacBook-Pro [~/hack] c44 h1227 j0 $
$ bash ~/hack $>
$ bash 1227 $> prlctl exec WinVM ipconfig | grep localdomain &
[1] 58231
✓ 02:36:10 PM Saturday 2015-10-17
上面是我输入的prlctl exec命令。
$ bash glew@Andy-Glew-MacBook-Pro [~/hack] c45 h1228 j1 $
$ bash ~/hack $>
$ bash 1228 $> exit
There are stopped jobs.
[1]+ Stopped prlctl exec WinVM ipconfig | grep localdomain
✓ 02:36:10 PM Saturday 2015-10-17
好的,它暂停了一会儿。然后它看起来像prlctl exec
开始向emacs shell模式控制进程发送垃圾:
$ bash glew@Andy-Glew-MacBook-Pro [~/hack] c45 h1229 j1 $
$ bash ~/hack $>
$ bash 1229 $> [2] 58298
✓ 02:36:10 PM Saturday 2015-10-17
$ bash glew@Andy-Glew-MacBook-Pro [~/hack] c46 h1230 j2 $
$ bash ~/hack $>
$ bash 1230 $> bash: his:: command not found
✗ 02:36:10 PM Saturday 2015-10-17
$ bash glew@Andy-Glew-MacBook-Pro [~/hack] c47 h1231 j2 $
$ bash ~/hack $>
$ bash 1231 $> bash: s: command not found
✗ 02:36:10 PM Saturday 2015-10-17
$ bash glew@Andy-Glew-MacBook-Pro [~/hack] c48 h1232 j2 $
$ bash ~/hack $>
$ bash 1232 $> ✗ 02:36:10 PM Saturday 2015-10-17
$ bash glew@Andy-Glew-MacBook-Pro [~/hack] c48 h1233 j2 $
$ bash ~/hack $>
$ bash 1233 $> bash: e: command not found
就像他们正在向shell发送没有回应的文本(可能是emacs配置的结果),并导致各种打嗝:
[2]+ Stopped prlctl exec WinVM ipconfig | grep localdomain
✗ 02:36:10 PM Saturday 2015-10-17
$ bash glew@Andy-Glew-MacBook-Pro [~/hack] c49 h1234 j2 $
$ bash ~/hack $>
$ bash 1234 $> bash: syntax error near unexpected token `.*'
✗ 02:36:10 PM Saturday 2015-10-17
$ bash glew@Andy-Glew-MacBook-Pro [~/hack] c49 h1235 j2 $
$ bash ~/hack $>
$ bash 1235 $> > > > ✗ 02:36:10 PM Saturday 2015-10-17
bash: syntax error near unexpected token `1'
> > > ✗ 02:36:10 PM Saturday 2015-10-17
bash: syntax error near unexpected token `1'
现在我收到了很多这样的东西......剪掉......
bash: syntax error near unexpected token `1'
✗ 02:36:10 PM Saturday 2015-10-17
> > > > > > > > > > > > > > > > > > bash: syntax error near unexpected token `)'
✗ 02:36:10 PM Saturday 2015-10-17
bash: !s\21\^KE\332n\216^C\340^C\262^E\223\377\315^D^W\236^D\375\236\270^D\325^P^[^?\376^C\234g000O\205UE\257p: event not found
✗ 02:36:10 PM Saturday 2015-10-17
[3] 58511
[3] Exit 127 Q\320^C\3660\307\203\351wk\244
✗ 02:36:10 PM Saturday 2015-10-17
......更多相同 - 看起来像控制代码
✗ 02:36:10 PM Saturday 2015-10-17
bash: syntax error near unexpected token `)'
✗ 02:36:10 PM Saturday 2015-10-17
bash: syntax error near unexpected token `&'
Process shell bus error: 10
实际上,我几乎毫不犹豫地展示了前一行,因为它暗示了一个shell bug。
--- +配置信息
2014年中期的MacBook Pro
$ bash 1229 $> uname -a
Darwin Andy-Glew-MacBook-Pro.local 14.5.0 Darwin Kernel Version 14.5.0: Wed Jul 29 02:26:53 PDT 2015; root:xnu-2782.40.9~1/RELEASE_X86_64 x86_64
Parallels版
$ bash 1230 $> prlctl --version
prlctl version 10.3.0 (29227) rev 0
From the Parallels Desktop about:
Version 10.3.0 (29227)
(same as for the command line)
Windows版
Manually editing systeminfo to keep only the good bits
$ bash 1232 $> prlctl exec WinVM systeminfo
OS Name: Microsoft Windows 8.1 Pro
OS Version: 6.3.9600 N/A Build 9600
OS Manufacturer: Microsoft Corporation
OS Configuration: Standalone Workstation
OS Build Type: Multiprocessor Free
System Boot Time: 10/17/15, 1:56:38 PM
System Manufacturer: Parallels Software International Inc.
System Model: Parallels Virtual Platform
System Type: x64-based PC
Processor(s): 1 Processor(s) Installed.
[01]: Intel64 Family 6 Model 70 Stepping 1 GenuineIntel ~2793 Mhz
BIOS Version: Parallels Software International Inc. 10.3.0 (29227) rev 0, 9/21/15
Total Physical Memory: 12,272 MB
Available Physical Memory: 8,753 MB
Virtual Memory: Max Size: 14,128 MB
Virtual Memory: Available: 10,808 MB
Virtual Memory: In Use: 3,320 MB
$ bash glew@Andy-Glew-MacBook-Pro [~/hack] c47 h1233 j0 $
$ bash ~/hack $>
$ bash 1233 $> exit
Process shell finished
and, as usual, prlctl exec closes the emacs shell-mode buffer I ran in in
(emacs的版本)
GNU Emacs 24.4.1 (x86_64-apple-darwin14.0.0, NS apple-appkit-1343.16) of 2015-01-17 on Andys-MacBook-Pro.local
答案 0 :(得分:2)
为了在后台运行Parallels exec,我发现了两种不同的方法:
向STDIN发送null并且您的命令不应提供输出。参见示例:
prlctl exec 'Windows XP' /temp/script.bat argument1>NUL </dev/null &
使用xargs在不同的shell中执行每个prlctl命令,您可以在其中定义最大并发进程数:
echo var1 var2 var3 | xargs -I{} -P 4 bash -c "prlctl exec 'Windows XP' /temp/script.bat argument1>NUL"
请参阅此工作示例(适用于Linux和Mac):
seq 10 | xargs -I{} -P 4 bash -c "echo start {}; sleep 3; echo done {}"
我希望这会有所帮助