【问题标题】:Passing zsh command line arguments into xargs quotations将 zsh 命令行参数传递到 xargs 引号中
【发布时间】:2020-10-03 07:42:45
【问题描述】:

我有一个 zsh 函数 fvi (find vi),它递归地 grep 搜索具有模式的文件的目录,收集它们并在 vim 中打开它们(在 Mac 上):

function fvi { grep -rl $1 . | xargs sh -c '/Applications/MacVim.app/Contents/MacOS/Vim -g -- "$@" <$0' /dev/tty }

这看起来很糟糕,但工作正常(在 Mac 上)。但我想将 vi 的搜索模式设置为 $1

function fvi { grep -rl $1 . | xargs zsh -c '/Applications/MacVim.app/Contents/MacOS/Vim -c +/"$1" -g -- "$@" <$0' /dev/tty }

这当然不起作用,因为 xargs/zsh 看到 $1 并将其转换为文件名。我可以手动说 -c +/xyz,它会将模式设置为 xyz。所以我知道 vim 命令语法是有效的。我只是无法将 shell 命令参数 $1 替换为 xargs 字符串。

有什么想法吗?

【问题讨论】:

  • 您是否只是要求 vi 看到文字 $1?您是否尝试过单引号而不是双引号(即+/'$1')或转义它(即+/"\$1")?
  • 不。 '、''、"、\ 和 \\ 不起作用。fvi hello 目前所做的是递归搜索当前目录中包含字符串 hello 的文件,收集该列表并在 vim 中打开所有文件。上面的函数就是这样做的。我想要的是然后用 vim 和 -c +/hello 打开所有这些文件。

标签: zsh xargs


【解决方案1】:

我可能只使用find:

fvi () {
    v=/Applications/MacVim.app/Contents/MacOS/Vim
    find . -exec grep -e $1 -- {} \; -exec $v -g +/$1 -- {} \;
}

您打开vim 中的每个文件以进行交互式编辑这一事实表明,多次运行grep 的可能匹配项(或候选对象)并不多,这确实是个问题。 (在最坏的情况下,您只是用grep 的实例替换每个由xargs 启动的额外shell 进程。)

这也排除了有关包含换行符的文件名的任何可能问题。

【讨论】:

  • 谢谢。但是,这会为每个匹配文件打开一个 Vim 窗口,如果有 50 个匹配项,这真的很不舒服。 xargs 方法打开一个窗口。然后我点击 :n 翻到下一个文件。
  • 至少这与正确的 vim 命令相呼应: function ffvi () { v="/Applications/MacVim.app/Contents/MacOS/Vim -g -m -i NONE -c +/$1 - - "; grep -rl $1。 | xargs -t zsh -c $v }
猜你喜欢
  • 1970-01-01
  • 2021-11-14
  • 2018-01-27
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 2011-04-26
  • 2013-12-01
  • 1970-01-01
相关资源
最近更新 更多