Como unalias um menos?

83

Meu café da manhã ainda não havia chegado ao meu cérebro quando esqueci as citações:

alias grep="grep --color=always"

então eu digitei:

alias grep=grep --color=always

deixando-me com:

--color=always
grep=grep

nos meus aliases.

Quando tento limpar o --color = sempre usando unalias --color , obtenho:

bash: unalias: --: invalid option
unalias: usage: unalias [-a] name [name ...]

Eu tentei escapar, citar e implorar, mas não consigo descobrir como fazer com que o comando unalias limpe a bagunça.

(Eu sei que um reinício vai dar certo, mas com certeza deve haver outro jeito)

    
por Requist 02.03.2017 / 11:01

3 respostas

128

Você pode evitar que sistemas compatíveis com POSIX interpretem travessões em comandos adicionando -- antes de qualquer argumento.

mtak@frisbee:~$ alias grep=grep --color=always
mtak@frisbee:~$ alias | grep color
alias --color='always'

mtak@frisbee:~$ unalias -- --color
mtak@frisbee:~$ alias | grep color
mtak@frisbee:~$

Isso também funciona com outros utilitários, digamos que você tenha um arquivo chamado -bla . Se você tentar removê-lo com rm , receberá o seguinte erro:

mtak@frisbee:~$ ls -- -bla
-bla
mtak@frisbee:~$ rm -bla
rm: invalid option -- 'b'
Try 'rm ./-bla' to remove the file '-bla'.
Try 'rm --help' for more information.

Usando -- antes do nome do arquivo, você removerá o arquivo:

mtak@frisbee:~$ rm -- -bla
mtak@frisbee:~$ ls -- -bla
ls: cannot access '-bla': No such file or directory
    
por 02.03.2017 / 11:07
94

Use apenas o mesmo truque usado para definir o alias

unalias whatever --color
    
por 02.03.2017 / 11:03
3

Solução rápida

Para corrigir ambos os alias incorretos, você pode simplesmente executar

unalias grep --color

Entendendo o que aconteceu

Você deu o comando errado alias grep=grep --color=always sem "..." .

  • Você define dois aliases --color e grep ; na verdade, você pode lê-lo no lado esquerdo da sua saída (tudo à esquerda do comando = é um alias):

    --color=always
    grep=grep
    

    então você precisa remover os dois.

  • Por que isso aconteceu?
    O ... no sinótico do alias significa que é possível fazer várias atribuições em uma linha:

    alias: alias [-p] [name[=value] ... ]

    Na saída de help alias você pode ler o sinótico, mas a partir de man bash você pode ler que é possível na mesma linha até listar e atribuir ao mesmo tempo:

    When arguments are supplied, an alias is defined for each name whose value is given. A trailing space in value causes the next word to be checked for alias substitution when the alias is expanded. For each name in the argument list for which no value is supplied, the name and value of the alias is printed...

  • Você tem problemas para remover o primeiro --color alone .
    Isso porque é interpretado como opções para alias pelo seu shell; Para evitar isso, você precisa comunicar ao seu bash shell que o que está seguindo não é uma opção.

  • O Santo Graal do Linux: man , neste caso man bash que é um cofre cheio de tesouros úteis em situações como esta.
    Você pode ler a partir de man bash :

    -- A -- signals the end of options and disables further option processing. Any arguments after the -- are treated as filenames and arguments. An argument of - is equivalent to --.

    Como relatado em outra resposta, a maneira POSIX é usar a combinação de caracteres especiais -- .

    unalias -- --color
    
  • Mas por que unalias grep --color está funcionando? Quero dizer, sem usar -- ?
    Como funcionou para alias mesmo para unalias , é possível dar mais de um nome em uma vez (novamente a [...] ).

    unalias: unalias [-a] name [name ...]
    

    Eu só posso dar o meu palpite: um bom hábito de programação é escrever as rotinas de leitura e escrita ao mesmo tempo, abaixo da mesma lógica. Portanto, tem que ser para as rotinas de análise de opções de alias e unalias .

    Isso funciona, você pode ver até mesmo deste comando (de um shell aberto para esse propósito) que não apagará todos os seus aliases:

    unalias whatever -a
    

Observação final

Na seção BUGS de man bash entre as poucas coisas relatadas, você pode ler :-)

Aliases are confusing in some uses.

    
por 06.03.2017 / 11:55