Perché l'aliasing rispetto ai comandi standard non è raccomandato?


19

Ad esempio, un alias comune che ho visto nel ~/.bashrcfile (o equivalenti) è

alias rm='rm -i'

Tuttavia, ho visto persone sconsigliate perché

  1. l'alias potrebbe non esistere su un altro sistema e poiché sei diventato negligente rm, elimini inavvertitamente qualcosa di importante. [1]
  2. usando questo alias, in effetti ti alleni per digitare yo yesdopo ogni rmcomando, che sconfigge l'intero scopo.

Ci sono altri motivi per sconsigliare questo? Alcuni programmi potrebbero semplicemente effettuare chiamate rminvece di \rme alias su di esso potrebbe causare problemi per loro?

Uso rmsemplicemente come esempio, ma ho visto anche altri comandi simili cpo mvcoperti da alias. Personalmente, mi sto lentamente allenando per usare un alias come questo al posto di rm -i:

alias trash=`mv -v -t $HOME/.Trash`

3
Ogni volta che inciampo su un sistema con un alias predefinito di rm -i, mi allena un po 'di più per aggiungere automaticamente la -fbandiera.
Jander

Puoi alias rm -itutto quello che vuoi. Come ad esempio del, irmecc Non c'è bisogno di alias a rm. Ciò elude il punto 1 e, usando selettivamente delo in rmbase a ciò che si desidera, si elude anche il punto 2 in una certa misura.
Martin Tournoij,

Risposte:


8

Supponendo che tu stia usando bash, questo non dovrebbe causare problemi per gli script, poiché le shell bash non interattive non si originano ~/.bashrco ~/.bash_profile(che è probabilmente o dove sono collocati i tuoi alias o è il primo passo per ottenere i tuoi alias in un altro script) . Tuttavia, può causare problemi se si utilizzano script:

$ alias echo='command echo foo'
$ cat > script << 'EOF'
> #!/bin/bash
> echo bar
> EOF
$ chmod a+x script
$ ./script
bar
$ . ./script
foo bar

La tua domanda copre la maggior parte delle preoccupazioni generali circa l'aliasing rispetto ai comandi esistenti, il principale è che ambienti sconosciuti che sembrano essere gli stessi a prima vista potrebbero potenzialmente produrre risultati selvaggiamente diversi. Ad esempio, aliasing rma rm -iha buone intenzioni, ma è un male, in pratica, per le ragioni che statali.


7

"Ci sono altri motivi per sconsigliare questo?"

Ovviamente:

(3) Perché un giorno spero di aggiungere alle basi costruite dalle persone [-----------] e paranoiche che castigano gli altri per alias i comandi standard, anche se l'alias dei comandi standard è, beh, standard .

Scherzi a parte, questi sono solo avvertimenti. Se ti fidi di non cadere in nessuno di quei pozzi di sventura, allora fai attenzione e vai avanti.

Personalmente, alias molto pochi comandi standard; Uso lievi variazioni perché sono, solo un po ', paranoico e ritentivo anale. Ma un buon uso che ho trovato per questo è per quanto riguarda i sistemi in cui accedo spesso come root o un altro utente, e ci sono alcune cose che non voglio eseguire accidentalmente / pigramente come root:

alias irc="echo \"No you don't!\""

o

alias irc="su irc_user"

4

Come esempio estremo, lasciatemi solo un alias un comando standard per illustrare perché l'alias dei comandi standard può essere dannoso:

alias ls='rm'

Ovviamente, questo è un male perché un giorno provocherebbe una brutta sorpresa. Allo stesso modo, la sostituzione dei comandi standard con alias alla fine porterà a una sfortunata sorpresa quando meno te lo aspetti.

Ma lasciami presentare uno scenario comune che accadrà a quasi tutti gli amministratori Unix mentre avanzano nella loro carriera:

Un giorno in futuro inizierai un nuovo lavoro e lavorerai su un nuovo sistema creato da altri. Saranno le tre del mattino di sabato e non stai pensando direttamente e sei incline a fare errori. Il tuo ambiente standard non sarà disponibile. In effetti, sei root.

Dato questo, hai intenzione di ricordare che rmnon è aliasrm -i ? Controllerai i tuoi alias speciali ogni volta che accedi alla casella? Se cambi l'ambiente di root, i tuoi colleghi saranno contenti del tuo cambiamento?

Sono sinceramente a questo proposito. Ho lavorato su migliaia di sistemi nella mia carriera e se modificassi l'ambiente su tutti questi sistemi, sarebbe difficile vederne il valore.

Aliasing rmper rm -iè molto comune e ho visto che a prevenire molti problemi, ma ha anche causato molte sorprese e ore di lavoro extra per recuperare i file eliminati accidentalmente.

Quindi ora provo a evitare l'alias dei comandi di sistema comuni. Invece uso alias e funzioni per fare cose che la shell non può fare facilmente. Quello che tendo a fare ora è allegare una lettera in più all'alias, come:

# List long, with color or special characters, depending on OS
alias  ll='ls -l'
# Long, with metacharacters, show dotfiles, don't show . and ..
alias lll='ls -lA'
# Long, with metacharacters, show dotfiles, show . and ..
alias lla='ls -la'
# List just the dotfiles
alias  l.='ls -l -Ad .????*'

# Useful greps
#alias hgrep='history |grep ${*} |grep -v $$'
alias greph='history |grep ${*}'
alias grepp='ps -ef |grep ${*}'

### Highlight some text.
# From http://unix.stackexchange.com/questions/366/convince-grep-to-output-all-lines-not-just-those-with-matches/367#367
highlight () { grep --color -E "$1|$" $2 ; }

E forse dovrei davvero sbarazzarmi del mio alias finale, perché l'adattamento a nuove pratiche richiede tempo:

# For safety!
alias rm='rm -i'

8
Ricordare le bandiere per lspotrebbe essere più conveniente che ricordare dieci alias.
Bernhard

Verissimo. E infatti, raramente uso più questi alias. Non sono sicuro del motivo per cui li ho ancora, a parte gli alias (e le funzioni) più complicati che erano difficili da capire e sono buoni come riferimento. Per semplicità dovrei probabilmente rimuoverli.
Stefan Lasiewski

L '"illustrazione" (primo esempio) non è davvero utile. Ciò è chiaramente dannoso e sappiamo che la trappola esplosiva di un sistema può essere dannosa. Il tuo rm-> rm -iesempio è molto meglio. Un altro buono sarebbe quello che alias vuole mettere le cose in un~/.trash
derobert

1
@ Bernardo: vero, ma gli alias sono più veloci da digitare. (Ma dieci sono troppi a prescindere.)
Emanuel Berg

2
@StefanLasiewski: Suggerimento: non rimuovere mai cose che non mostrano, per motivi puramente estetici. Lasciali rimanere se non ti disturbano attivamente. È un atto così veloce rimuovere le cose dopo aver trascorso ore a configurarle; e se mai te ne pentirai, ti sentirai un idiota per non averglielo permesso.
Emanuel Berg

4

Ci sono più pericoli ad esso.

Ad esempio, se usi shell-commandEmacs, potresti pensare di ottenere il "tuo" comando (o alias , ma non devi colpire un lsalias in un terminale che molte volte prima di dimenticare tutto sull'impostazione dell'alias, pensando a come qualsiasi altro comando ...) - in effetti (tornando a Emacs), ottieni il comando (non equilibrato). Emacs lo eseguirà senza problemi, quindi potresti anche essere cieco per quello che è appena successo!

Per quanto riguarda i diversi computer e / o sistemi, se ritieni che sia troppo noioso configurare singoli .rcfile per tutti, puoi semplicemente avere uno di questi file, ma con ifclausole su misura.

Ad esempio, invece di valutare ogni funzione quando le scrivi, proprio quando riscontri problemi con una di esse, aggiungile alla "lista nera", infine:

if [[ `uname` == "SunOS" ]]; then
  unset -f mic cpkeep mcp mcph cpindex cpconf # not for Solaris
fi

3

Rinominare i comandi standard con gli alias (cioè, rm=rm -i) roba può certamente portare a sorprese in cui l'alias non è disponibile. Preferisco non usarlo, e (per diverse esperienze amare e forti ;-) Mi sono abituato a leggere ogni comando due volte, e se è rmo mvo qualsiasi altra cosa potenzialmente distruttiva tre volte. E tali alias portano all'automatico "rm foo" ENTER "y" Oops !! in ogni caso (e costa una pressione di tasto in più ogni volta).

Ma sono solo io. Se non ti aspetti di funzionare in ambienti alieni (altre macchine, altri utenti, ...) e puoi installare i tuoi alias preferiti ovunque tu sia, scatenati. Unix è noto per dare agli utenti una corda più che sufficiente per sparare ai propri piedi.


0

Le altre risposte sono buone, ma guardano solo a come ti influenza.

Vorrei girare la risposta di @Stephan Laswieski sulla sua testa un po '.

Supponendo che tu non sia onnisciente, potresti aver bisogno che qualcun altro lavori sul tuo account utente o ti consigli su come fare qualcosa.

Quindi, quando fanno qualcosa o ti dicono di farlo, potrebbe non funzionare come previsto.

Nella migliore delle ipotesi, dovrai perdere tempo a spiegare loro cosa è successo (se sei proprio lì e riesci a ricordare o capire che l'alias è ciò che ha causato il problema).

Nel peggiore dei casi, vedi una svolta nell'esempio in una delle altre risposte: alias ls = 'rm -rf'.

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.