Esegui un comando ombreggiato da un alias


164

Diciamo che ho il seguente alias in bash - alias ls='ls --color=auto'- e voglio chiamare ordinario lssenza opzioni. L'unico modo per farlo è quello di unalias, eseguire il comando e quindi di nuovo alias? O c'è qualche trucco o soluzione alternativa elegante?


2
Solo una nota su alcune delle risposte di seguito: "comando" è l'UNICO modo sicuro per ottenere questo risultato. Ad esempio, il "." o "sorgente" incorporata potrebbe essere sovrascritta da una funzione definita dallo script. "comando". o "origine comando" è l'unico modo per eseguire in sicurezza l'origine senza invocare la funzione definita dallo script. Nessuna delle altre alternative, incluso il metodo barra rovesciata "\.", Funziona e ovviamente non esiste alcuna alternativa "/ bin / source" che puoi invocare specificando un percorso completo.
Dejay Clayton,

Risposte:


211

Puoi anche aggiungere il prefisso a una barra rovesciata per disabilitare l'alias: \ls

Modifica: altri modi di fare lo stesso includono:

Usa "comando": command lssecondo Mikel .

Usa il percorso completo: /bin/lscome da uther .

Cita il comando: "ls"o 'ls'secondo il commento di Mikel.

È possibile rimuovere temporaneamente l'alias per quella sessione terminale con unalias command_name.


Questo è il mio modo standard per farlo.
ncmathsadist,

molto bello, funziona anche bene con tcsh
Levon

10
In questo modo è molto utile. Ignora solo gli alias, non le funzioni, il che lo rende diverso da commando builtin.
Mikel,

1
Sembra che l\sfaccia la stessa cosa. Questo comportamento è un bug o una funzionalità?
Niklas B.

4
È una "caratteristica". Vengono espansi solo gli alias non quotati. Quindi puoi metterlo tra virgolette o usare una barra rovesciata dove preferisci. Vedi riferimento alias bash .
Mikel,

79

Ecco a cosa commandserve il comando.

Provare

command ls

Questo dice alla shell di bypassare alias e funzioni.

In questo modo è supportato da bash , zsh e ash / dash.


2
La migliore risposta, perché non è la più votata, però? :) +1
0xC0000022L

11
Perché aggiunge 8 volte il numero di caratteri come metodo backslash
JoelFan

1
@STATUS_ACCESS_DENIED Anche questo non funziona con tcsh (e quindi presumibilmente neanche con csh). Il metodo `\` fa
Levon

3
La funzione barra rovesciata non è sicura. Mentre fornisce protezione contro gli alias con nomi simili, non fornisce protezione contro le funzioni con nomi simili.
Dejay Clayton,

2
@JoelFan Preferirei di gran lunga avere pochi caratteri in più e avere i miei script facili da seguire e lavorare per tutti. Piuttosto che una barra criptica che non è intuitiva, facile da perdere, non ben documentata e che non funziona per bypassare le funzioni.
Dennis,

19

L'alias è solo un collegamento definito. In questo esempio, l'alias definito è la stringa lsche viene eseguita ls --color=auto. Se non si desidera tale comportamento, è possibile chiamare il binario lsutilizzando il percorso assoluto.

Quindi l'esecuzione /bin/lsprodurrà un output senza colore perché non è l'alias che hai definito.

È inoltre possibile modificare l'alias in qualcosa di diverso o aggiungere un nuovo alias che viene eseguito solo lssenza i parametri di colore.


2
Devi sapere dove si trova il comando. Su alcuni sistemi, la divisione tra /bine /usr/binè arbitraria.
Keith Thompson,

@KeithThompson Per questo, è possibile utilizzare whichper alcuni comandi: which ls.
cst1992,

@ cst1992: se hai intenzione di usare which(o type), effettua una ricerca tramite $PATH; potresti anche semplicemente usare lso \lspiuttosto di specificare il percorso.
Keith Thompson,

10

Un altro modo, basato sulla risposta di @uther, è usare $(which ...)o `which ...`(usando i backtick ``) per trovare automaticamente il percorso dell'eseguibile. Questo funzionerà in bash:

$(which ls)

`which ls`

Indubbiamente, semplicemente il prefisso del comando con a \è molto più breve.

AGGIORNAMENTO : Secondo Come usare `quale` su un comando con alias? , questo non sembra affatto affidabile.


A cosa servono le parentesi? Immagino tu intenda `which ls`eseguire direttamente il binario.
amyassin,

2
@amyassin: entrambe le sintassi sono equivalenti. (A proposito, come hai ottenuto i backtick nella formattazione del codice?)
krlmlr

In realtà il (which ls)non ha funzionato per me (su Ubuntu 12.04 LTS) E i backtick erano difficili, li ho appena sfuggiti: \ `che ls \`. Ci sono voluti un sacco di modifiche per arrivarci :)
Amyassin

1
@ user946850 "Per includere un carattere letterale di backtick in un intervallo di codice, è possibile utilizzare più backtick come delimitatori di apertura e chiusura". Fonte: riferimento Markdown .
Mikel,

@amyassin: hai aggiunto il $?
krlmlr,

2

Personalmente, evito semplicemente di definire gli alias con gli stessi nomi dei comandi, quindi lsinvoco sempre il comando effettivo. Ho alias o funzioni per varie combinazioni di opzioni come l, lle lg. (Questo significa che ho bisogno unalias lsnel mio .bashrco .cshrc.)

Trovo che le ipotesi del sistema operativo su quali opzioni potrei preferire (ignorando le ipotesi dei progettisti del lscomando stesso) raramente corrispondono ai miei gusti personali. Non mi piace l'aspetto ls --color=autoe la sua leggibilità può variare notevolmente tra il bianco e il nero e il bianco e il nero.

YMMV e le altre soluzioni sono ovviamente ancora utili.


1

Digitare il comando in maiuscolo sembra funzionare LS, anche se non sono proprio sicuro del perché.


4
In quale shell, quale sistema operativo, quale terminale, ecc.?
Mikel,

@Mikel Esiste un pacchetto "sl" che fornisce "sl" come "ls". I suggerimenti che Bash fornisce in Ubuntu dicono anche che "LS" è fornito da "sl".
Izkata,

1
Questo è bash 4 (installato con Fink) in Mac OS X 10.7. Funziona anche con altri comandi che ho modificato come rm e grep.
asmeurer,

3
È solo uno scherzo :) dalla pagina mn:LS - display animations aimed to correct users who accidentally enter LS instead of ls.
amyassin

7
Penso che questo funzioni per Mac OS X perché il suo filesystem non fa distinzione tra maiuscole e minuscole per impostazione predefinita. Non funzionerà su altri unix.
Jander,
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.