Come unire un segno meno?


83

Il mio caffè mattutino non mi era ancora arrivato quando ho dimenticato le citazioni in:

alias grep="grep --color=always"

così invece ho scritto:

alias grep=grep --color=always

lasciandomi con:

--color=always
grep=grep

nei miei alias.

Quando provo a ripulire --color = usando sempre unalias --colorottengo:

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

Ho provato a scappare, a citare e a chiedere l'elemosina, ma non riesco a capire come fare in modo che le unalie del comando ripuliscano il casino.

(So ​​che un riavvio farà il trucco, ma sicuramente ci deve essere un altro modo)


13
Ah ah, ora l'ho bloccato anche nel mio, lavorando su di esso EDIT: Sembra che la risposta di
Choroba abbia

9
Un po 'mi ricorda il vecchio echo > \\?\c:\windows\x., o quella volta che rm -rf * ~per caso.
Jason C

Risposte:


127

È possibile evitare i sistemi conformi a POSIX che interpretano i trattini nei comandi aggiungendo --prima di qualsiasi argomento.

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:~$

Questo funziona anche con altre utilità, supponiamo che tu abbia un file chiamato -bla. Se si tenta di rimuoverlo con rmsi otterrà il seguente errore:

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 --prima del nome file, rimuoverai il file:

mtak@frisbee:~$ rm -- -bla
mtak@frisbee:~$ ls -- -bla
ls: cannot access '-bla': No such file or directory

19
Anche se vale la pena notare che per i file, un metodo altrettanto valido è quello di utilizzare un percorso al file che lo eviti; così puoi usare ls ./-blae rm ./-bla(o specificare i percorsi completi, qualunque cosa sia più facile nel tuo caso). Ovviamente questo non funziona per gli alias!
Muzer


93

Usa lo stesso trucco che hai usato per impostare l'alias

unalias whatever --color

9
funziona davvero, +1 ma l'altra soluzione è un po 'più pulita :)
Requist

1
Anzi, ovviamente :-)
Choroba,

unalias unalias --color
Cœur

3

Soluzione veloce

Per correggere entrambi gli alias sbagliati potresti semplicemente eseguire

unalias grep --color


Capire cosa è successo

Dai il comando sbagliato alias grep=grep --color=alwayssenza "...".

  • Hai impostato due alias --color e grep; in effetti puoi leggerlo sul lato sinistro del tuo output (tutto a sinistra del =è un comando con alias):

    --color=always
    grep=grep
    

    quindi devi disinserire entrambi.

  • Perché è successo?
    Nel ...sinottico dell'alias significa che è possibile eseguire più assegnazioni in una riga:

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

    Nell'output di help aliaste puoi leggere il sinottico ma da man bashte puoi leggere che è possibile nella stessa riga anche elencare e assegnare contemporaneamente:

    Quando vengono forniti argomenti, viene definito un alias per ciascun nome il cui valore è dato. Uno spazio finale in valore fa sì che la parola successiva venga controllata per la sostituzione dell'alias quando l'alias viene espanso. Per ciascun nome nell'elenco degli argomenti per il quale non viene fornito alcun valore, vengono stampati il ​​nome e il valore dell'alias ...

  • Hai problemi a disinserire il primo --colorda solo .
    Questo perché viene interpretato come opzioni per aliasdal vostro guscio; per evitarlo è necessario comunicare alla bashshell che ciò che segue non è un'opzione.

  • Il Santo Graal di Linux:man in questo caso si man bashtratta di uno scrigno pieno di tesori utili in situazioni come questa.
    Puoi leggere da man bash:

    - A - segnala la fine delle opzioni e disabilita l'ulteriore elaborazione delle opzioni. Qualsiasi argomento dopo il - viene trattato come nome di file e argomento . Un argomento di - equivale a -.

    Come riportato in altre risposte, il modo POSIX è usare la combinazione di caratteri speciali --.

    unalias -- --color
  • Ma perché unalias grep --colorfunziona? Voglio dire senza usare --?
    Dato che ha funzionato aliasanche per unaliasè possibile dare più di un nome in una volta (di nuovo il [...]).

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

    Posso solo supporre: una buona abitudine di programmazione è scrivere le routine di lettura e scrittura allo stesso tempo, al di sotto della stessa logica. Quindi deve essere per l'opzione che analizza le routine di aliase unalias.

    Che funzioni puoi vedere anche da questo comando (da una shell aperta a questo scopo) che non cancellerà tutti i tuoi alias:

    unalias whatever -a

Osservazione finale

Nella sezione BUGS man bashtra le poche cose riportate potresti leggere:-)

Gli alias sono confusi in alcuni usi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.