2

我在将参数从 git 别名传递到外部 bash 脚本文件时遇到问题。目前,我的 bash 脚本文件与 .gitconfig 位于同一目录中。我计划将我所有的复杂 !f() { }别名移到那里,以避免与所有转义和不评论作斗争。

所以我的脚本文件名为 .gitconfig.kat.aliases.script ,它看起来像这样:

#!/bin/bash

openInBrowser() {
    REPO_URL=$(git config remote.origin.url)

    find="git@bitbucket.org:"
    replace="https://bitbucket.org/"

    # Replace SSH with HTTPS prefix
    REPO_URL=$(echo $REPO_URL | sed -e "s%${find}%${replace}%g")
    explorer $REPO_URL

    exit 0;
}

checkoutRemoteBranch() {
    echo "$# Parameters"
    echo $0
    echo $1
    echo $2
    if [ "$#" = 2 ] 
    then
        echo -e "BINGO"
        # git fetch
        # git co -b $2 $1/$2
    else
        echo -e "usage:\tgit co-rb <origin> <branch>"
    fi  
}

配置1

在我的 .gitconfig [alias] 部分中,我有这个:

co-rb = !bash -c 'source $HOME/.gitconfig.kat.aliases.script && checkoutRemoteBranch \"$@\"'
open = !bash -c 'source $HOME/.gitconfig.kat.aliases.script && openInBrowser'  

我按照这个问题的语法对外部脚本/函数进行了别名。然后,我按照这个问题的语法将参数传递给函数(上面的别名没有像建议的问题那样传递虚拟参数,下面有更多信息)。

问题是,没有虚拟参数,当我执行时git co-rb origin feature/test,我得到以下输出:

1 Parameters
origin
feature/test

配置2

如果我在 $@... 之后定义一个虚拟参数

co-rb = !bash -c 'source $HOME/.gitconfig.kat.aliases.script && checkoutRemoteBranch \"$@\" x'

输出是:

2 Parameters
origin
feature/test
x

配置3

如果我将虚拟参数的位置更改为co-rb = !bash -c 'source $HOME/.gitconfig.kat.aliases.script && checkoutRemoteBranch x \"$@\"'

输出是:

2 Parameters
origin
x
feature/test

问题: 1. 配置1 - 参数计数错误,位置参数偏移-1。1.配置2——参数计数是对的,但是位置参数偏移了-1。1.配置3——参数计数是对的,但是参数都乱了。 x在中间注入,并且位置对于 1 美元不正确。

我应该如何设置我的 git 别名,以便参数计数正确并且位置 1..N 是我所期望的?或者我应该更改我的 shell 脚本,以便在我检查参数计数时,我检查'count-1'?

4

1 回答 1

0
$ bash -c 'echo $@' 1 2 3
2 3

$ bash -c 'echo $0 $@' 1 2 3
1 2 3

也就是说,"$@"从第 1 个开始传递参数,但在这种情况下也有第 0 个参数。

所以通过$0

co-rb = !bash -c 'source $HOME/.gitconfig.kat.aliases.script && checkoutRemoteBranch "$0" "$@"'

$0没有添加到,$@因为在 100 个用例中有 99 个不需要它。通常是 shell 名称或脚本名称,在$@.

于 2019-03-14T11:51:23.580 回答