Como estender um comando no bash para que ele se expanda com base nas opções?

2

Comecei a trabalhar com um repositório git que inclui uma grande quantidade de conteúdo que deve ser considerado somente leitura. Então, toda vez que eu lanço um novo branch:

git checkout -b newBranch

deve ser seguido pelo comando

git update-index --assume-unchanged LARGE_READONLY_DIRECTORY

Eu imaginei que seria uma oportunidade perfeita para testar minhas habilidades bash, então tudo que eu preciso fazer no shell é a primeira linha, e ele executaria isso, então o segundo, sem eu lembrar de fazer isso ( que eu não vou).

Eu percebi que o que eu quero fazer é ter uma função no meu .bashrc que verifica se o primeiro argumento é 'checkout' e o segundo é '-b'. Essa primeira verificação é fácil, mas não consigo descobrir como observar a presença de -b.

git() {
    if [[ $1 == 'checkout' ]] && [[$2 == '-b']]; 
            then echo 'yep!';
    fi;

    command git "$@";
}

Quando eu executo isso, ele reclama que [[-b: command not found . Presumivelmente, o fato de ser uma opção, e não um argumento, é importante aqui. Alguém pode me dizer como verificar a presença desse argumento, então eu sei executar o comando de acompanhamento?

    
por sharakan 12.08.2013 / 16:57

2 respostas

2

Você precisa de um espaço entre [[ e $2 .

Para o bash [[ não é sintaxe, é um comando interno (ou palavra-chave para ser preciso). O Bash executará [[ com todos os seus parâmetros, incluindo o fechamento ]] . Quando você não tiver espaço entre [[ e $2 bash não verá a palavra-chave [[ , em vez disso, verá essa coisa: [[-b (após expandir $2 para -b ). O Bash tentará executar a string [[-b como um comando e falhará. Veja help [[ para mais informações.

Pelo mesmo motivo, você também precisa de um espaço antes do fechamento ]] .

Aqui está o seu código corrigido:

git() {
    if [[ $1 == 'checkout' ]] && [[ $2 == '-b' ]]; 
            then echo 'yep!';
    fi;

    command git "$@";
}

Veja também as armadilhas do bash e o bash FAQ . IMO é a melhor maneira de aprender bash scripting ... ou a melhor maneira de aprender a não fazer muito bash scripting.

    
por 12.08.2013 / 17:07
1

Como você não tem espaço entre [[ e $2 , ele é analisado incorretamente (como [[ seguido diretamente pela expansão de $2 ). Você precisa de espaço em branco entre os argumentos para [[ :

[[ $2 == -b ]]
    
por 12.08.2013 / 17:07