【问题标题】:How to use `find -exec sh -c` in a git or shell alias如何在 git 或 shell 别名中使用`find -exec sh -c`
【发布时间】:2015-05-23 01:33:46
【问题描述】:

我正在使用以下作为 git shell 脚本。

    #!/bin/sh

    [ -z "$1" ] && dir="$PWD" || dir="$1"

    find "$dir" -mindepth 1 -maxdepth 1 -type d -exec sh -c '
        for i; do
            printf "\n%s\n" "$i"
            cd "$i" \
            && git remote update
        done' sh {} +

但想使用 git 别名。

    rmup=!sh -c "find . -mindepth 1 -maxdepth 1 -type d -exec sh -c '\
        for i; do \
            printf "\n%s\n" "$i" && cd "$i" && git remote update; \
        done' sh {} +"

或者至少是一个 shell 别名。

    alias rmup="find . -mindepth 1 -maxdepth 1 -type d -exec sh -c '\
        for i; do \
            printf "\n%s\n" "$i" && cd "$i" && git remote update; \
        done' sh {} +"

我尝试了各种转义、单引号和双引号组合,但都没有成功。

想要使用“嵌入式”别名的原因是为了简化机器之间的维护和可移植性,因为我已经在同步我的 .gitconfig.bashrc

忘了说我也试过一个shell函数,当printf打印目录时,cd抱怨目录不存在。

    rmup() {
        find . -mindepth 1 -maxdepth 1 -type d -exec sh -c '
            for i; do
               printf "\n%s\n" "$i" && cd "$i" && git remote update;
            done' sh {} +
    }

【问题讨论】:

  • 如果您已经有一个可以工作的 shell 脚本,为什么还需要一个 shell 别名?
  • 为什么要使用 shell 别名而不是 shell 函数?

标签: linux git bash shell


【解决方案1】:

如果您已经拥有 shell 脚本,请将其命名为 git-rmup,将其放在您的 $PATH 中,您就可以像 Git 别名一样调用 git rmup

【讨论】:

  • 想要使用“嵌入式”别名的原因是为了简化机器之间的维护和可移植性,因为我已经在同步我的 .gitconfig.bashrc
  • 一旦你了解了在 Git 的配置文件中引用字符串的确切规则,我猜你就不会再谈论“简化维护”了 ;-)。在您的其他配置文件旁边对scripts/ 目录进行版本控制/同步会更简单,恕我直言。
  • @MatthieuMoys - 两年后,我现在正在同步我的整个点文件。 :-)
【解决方案2】:

除非绝对必须,否则不要使用 shell 别名; shell 函数在功能上更胜一筹。

rmup() {
  local dir=${1:-$PWD}
  find "$dir" -mindepth 1 -maxdepth 1 -type d -exec sh -c '
    for i; do
      printf "\n%s\n" "$i"
      (cd "$i" && exec git remote update)
    done' _ {} +
}

特别是,您不能在别名中替换位置参数,您的代码在这里明确需要这样做。 (现在,您可以扩展一些东西,然后查看它的位置参数,但是该技术可用的情况集......受到很大限制,原因我不想在这里讨论)。

用法与别名完全相同:rmup argument

【讨论】:

  • 我尝试了 shell 函数,但在解析当前目录时遇到了一些奇怪的错误。我会更新问题。
  • 看看您是否可以使用当前发布的版本重现这些问题。 :)
  • ...解释为什么它有问题,顺便注意一下你是如何使用.而不是$PWD作为默认值的。想想当你cd ./src/foo 然后cd ./src/bar 时会发生什么;试图转到./src/foo/src/bar,如果该目录不存在...
  • @go2null, ...所以你的问题的根源不是它是一个函数;是你写的和你写剧本的方式有微妙的不同。
  • 谢谢,成功了。 (这是我在 shell 脚本中的内容。)但是,我将 .(点)硬编码为别名中的当前目录,但这不起作用。
猜你喜欢
  • 2011-11-30
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
相关资源
最近更新 更多