aliasing comando que leva argumento com o uso de pipe

0

Eu gostaria de criar um alias no meu ~/.bash_profile que irá:

  1. Pegue dois argumentos $1 $2
  2. Passe para diff
  3. Canaliza a saída para less

Não encontrei nenhuma solução no Stack que faça o que eu preciso, mas por favor me aponte para qualquer uma que você conheça! As linhas a seguir aparecem no meu ~/.bash_profile :

alias reload='. ~/.bash_profile'
alias aliases='emacs ~/.bash_profile; reload'
function dif () { diff "$1" "$2" | less; }
alias different='dif' 

Quando eu tento:

gsuehr$ reload
-bash: /Users/gregorysuehr/.bash_profile: line 93: syntax error: unexpected end of file 

Estou certo de que não estou entendendo como usar uma função bash. Confirmei que os 2 aliases: reload aliases funcionam como esperado se eu comentar a declaração da função. Alguém poderia compartilhar conhecimento sobre:

  1. Por que o erro EOF está ocorrendo?
  2. Como usar funções dentro do bash para realizar o que estou tentando aqui?
por Greg Suehr 08.07.2016 / 08:04

2 respostas

1

Você não pode usar um alias para adicionar coisas depois de argumentos, você precisa de uma função. Use um alias apenas para fornecer um nome alternativo a um comando ( alias myalias=mycommand ) ou para fornecer argumentos iniciais ( alias myalias='foo --option1 --option2' ).

No bash, você pode usar qualquer um dos function myfunction { … } ou myfunction () { … } ou function myfunction () { … } para definir uma função. A forma myfunction () … tem a vantagem de ser portável para todas as sh shells. Os formulários com a palavra-chave function têm a vantagem de funcionar mesmo se myfunction for um alias (você pode usar \myfunction () … para fazer o formulário padrão funcionar nesse caso). Além do pseudônimo, essas sintaxes são exatamente equivalentes no bash.

O que segue o nome da função ou o () deve ser um comando complexo bem formado. A julgar pela sua resposta (o código na sua pergunta não produz a mensagem de erro, obviamente você não postou a versão que você testado), seu erro foi que o comando complexo que você escreveu não está correto. As chaves { e } são reconhecidas apenas como sintaxe de lista inicial e lista final quando são a primeira coisa em um comando, portanto, você precisa de uma quebra de linha ou um ponto e vírgula antes da chave de fechamento.

Além disso, em vez de passar dois argumentos para diff e ignorar os outros, você deve passar todos eles. Isso é o que "$@" é para.

function dif () { diff "$1" "$2" | less; }

Além disso, as personalizações para sessões bash interativas devem entrar em .bashrc , não .bash_profile . .bash_profile é lido apenas por shells de login, não é lido quando você abre uma nova instância do bash, por exemplo em um terminal. Por causa de um defeito de projeto no bash, .bashrc não é lido por shells de login, mesmo que sejam interativos, então você deve colocar esta linha em seu .bash_profile :

if [[ $- == *i* ]]; then . ~/.bashrc; fi

e coloque a personalização interativa, como aliases, funções como dif , combinações de teclas, prompts, etc. em ~/.bashrc .

    
por 09.07.2016 / 02:04
-1

Publicando isso como uma resposta, em vez de atualizar minha pergunta, informe-nos se eu devo fazer o contrário!

Nesse caso, meu .bash_profile não foi atualizado porque eu interpretei mal a sintaxe da função bash.

    function dif () { diff $1 $2 | less }

Deve ser apenas:

    dif () { diff $1 $2 | less; }

edit: Adicionado ponto-e-vírgula após less . Eu verifiquei que isso funciona!

Graças a @ John1024 pelo link para o shellcheck.net, esse é um ótimo recurso!

    
por 08.07.2016 / 13:07

Tags