我有一行 shell 脚本,如下所示:
vim file.xml -c "s/\r/\r/g" -c "set fileencoding=utf8" -c "wq"
它在 (macOS) 终端上运行得很好,但是当我在另一个程序(运行 AppleScript 的 FileMaker)中执行它时,它会挂起。我认为这是因为 Vim 实际上正在启动(我看到它在终端中闪烁),而 FileMaker 或 AppleScript 都失败了。
我怎样才能做与上面相同的事情,但只能使用不启动带有界面的应用程序的命令行工具?
答案1
ex
是 Vim,用于脚本编写。
它将采用与 Vim 相同的命令,但它可以在没有终端 (tty) 的情况下运行。您可以向它传递一个-s
“静音”标志。
-s
:静默或批处理模式。 [...] 当使用 Vim 从文件执行 Ex 命令时使用而不是终端。 [...]
(请注意,这-s
会抑制诊断和错误消息,并且可能会产生额外的副作用。有关详细信息,请参阅完整帮助。您的情况可能不需要它,但很可能需要。)
您可以将命令运行为:
ex -s file.xml -c "s/\r/\r/g" -c "set fileencoding=utf8" -c "wq"
请注意,“ex-mode”也可与该-e
标志一起使用,因此这也应该有效:
vim -e -s file.xml -c "s/\r/\r/g" -c "set fileencoding=utf8" -c "wq"
答案2
sed
是vim,但是用于脚本。它可用于通过它传输数据,或处理一个或多个文件。它基于与 vi 和 ed 相同的代码。它是非交互式的,因此没有窗口。
顺便说一句,我不认为它vim
有自己的窗户。可能是某些东西(包装器)正在窗口中启动它。
答案3
如果问题出在git
,您可以配置(详细信息gitattributes(5)
,通常在.gitattibutes
存储库根目录中的文件中)working-tree-encoding
对(选定的)签出文件使用 UTF16,在签入/签出时在 UTF8 之间进行转换。内部git
使用 UTF8(例如diff
,搜索、显示内容...)。
小心:非本地 git 可能无法理解这一点,并会带来悲伤。