Como unalias a menos?

83

Meu café da manhã ainda não havia atingido meu cérebro quando esqueci as aspas:

alias grep="grep --color=always"

então, em vez disso, digitei:

alias grep=grep --color=always

me deixando com:

--color=always
grep=grep

nos meus pseudônimos.

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

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

Tentei escapar, citando e implorando, mas não consigo descobrir como fazer com que o unalias do comando limpe a bagunça.

(Eu sei que um reinício fará o truque, mas certamente deve haver outra maneira)

Solicitar
fonte
13
Ha ha, agora eu tenho ele ficou preso na mina, também, a trabalhar nele EDIT: Parece que a resposta de choroba funcionou para mim
asmith
9
Meio que me lembra o velho echo > \\?\c:\windows\x., ou daquela vez eu rm -rf * ~por acidente.
Jason C #

Respostas:

127

Você pode evitar que sistemas compatíveis com POSIX interpretem traços 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ê- rmlo, 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
mtak
fonte
19
Embora seja interessante notar que, para arquivos, um método igualmente válido é usar um caminho para o arquivo que evita isso; para que você possa usar ls ./-blae rm ./-bla(ou especificar os caminhos completos, o que for mais fácil no seu caso). Obviamente, isso não funciona para aliases!
Muzer
93

Basta usar o mesmo truque que você usou para definir o alias

unalias whatever --color
choroba
fonte
9
trabalha na verdade, +1, mas a outra solução é um pouco mais limpo :)
requist
11
Na verdade, é claro :-)
choroba
unalias unalias --color
Coeur
3

Solução rápida

Para corrigir ambos os aliases erradas que você pode simplesmente executar

unalias grep --color


Entendendo o que aconteceu

Você dá o comando errado alias grep=grep --color=alwayssem "...".

  • 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 desabilitar os dois.

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

    alias: alias [-p] [nome [= valor] ...]

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

    Quando os argumentos são fornecidos, um alias é definido para cada nome cujo valor é fornecido. Um espaço à direita no valor faz com que a próxima palavra seja verificada quanto à substituição do alias quando o alias for expandido. Para cada nome na lista de argumentos para o qual nenhum valor é fornecido, o nome e o valor do alias são impressos ...

  • Você tem problemas para desabilitar o primeiro --colorsozinho .
    Isso porque ele é interpretado como opções para aliaspelo shell; para evitar isso, você precisa comunicar ao seu bashshell que o que está seguindo não é uma opção.

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

    - A - sinaliza o fim das opções e desativa o processamento adicional das opções. Quaisquer argumentos após o - são tratados como nomes de arquivos e argumentos . Um argumento de - é equivalente a -.

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

    unalias -- --color
  • Mas por que unalias grep --colorestá trabalhando? Quero dizer sem usar --?
    Como funcionou aliasmesmo unalias, é possível atribuir mais de um nome ao mesmo tempo (novamente o [...]).

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

    Só posso dar um 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 a opção de analisar as rotinas de aliase unalias.

    Que isso funcione, você pode ver até mesmo este comando (de um shell aberto para essa finalidade) que não apagará todos os seus aliases:

    unalias whatever -a

Observação final

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

Os aliases são confusos em alguns usos.

Hastur
fonte