Warum wird Aliasing über Standardbefehle nicht empfohlen?

19

Ein häufiger Alias, den ich in der ~/.bashrcDatei gesehen habe (oder Äquivalente) ist

alias rm='rm -i'

Allerdings habe ich gesehen, dass Leute dagegen empfehlen, weil

  1. Der Alias ​​existiert möglicherweise nicht auf einem anderen System und da Sie sorglos geworden sind rm, löschen Sie versehentlich etwas Wichtiges. [1]
  2. Wenn Sie diesen Alias ​​verwenden, üben Sie sich in der Tat in der Eingabe yoder yesnach jedem rmBefehl, der den gesamten Zweck zunichte macht.

Gibt es andere Gründe, sich dagegen zu empfehlen? Könnten manche Programme rmstattdessen einfach Anrufe tätigen \rm, und ein Alias ​​darüber könnte Probleme für sie verursachen?

Ich benutze rmeinfach als ein Beispiel, aber ich habe andere Befehle wie gesehen cpoder mvvon Aliasnamen als gut abgedeckt. Persönlich trainiere ich mich langsam, um einen Alias ​​wie diesen zu verwenden, anstelle von rm -i:

alias trash=`mv -v -t $HOME/.Trash`
Ricardo Altamirano
quelle
3
Jedes Mal, wenn ich über ein System mit einem Standard-Alias ​​von stolpere rm -i, trainiert es mich ein bisschen mehr, das -fFlag automatisch hinzuzufügen .
Jander
Sie können einen Alias rm -ifür alles erstellen , was Sie möchten. Wie del, irmsie, etc. Sie nicht brauchen , um alias es rm. Dies umgeht Punkt 1, und indem Sie punktuell deloder rmje nach Wunsch Punkt 2 umgehen.
Martin Tournoij

Antworten:

8

Vorausgesetzt, Sie verwenden Bash, sollte dies keine Probleme für Skripte verursachen, da nicht interaktive Bash-Shells keine Quellen ~/.bashrcoder ~/.bash_profile(wahrscheinlich entweder dort, wo Ihre Aliase platziert sind, oder als erster Schritt, um Ihre Aliase in einem anderen Skript zu finden). . Es kann jedoch Probleme verursachen, wenn Sie Skripte beschaffen:

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

Ihre Frage befasst sich hauptsächlich mit dem Aliasing bestehender Befehle. Die Hauptsorge ist, dass ungewohnte Umgebungen, die auf den ersten Blick gleich erscheinen, möglicherweise zu völlig unterschiedlichen Ergebnissen führen können. Zum Beispiel hat das Aliasing rmfür rm -igute Absichten, ist jedoch aus den von Ihnen angegebenen Gründen in der Praxis schlecht.

Chris Down
quelle
7

"Gibt es noch andere Gründe, sich dagegen zu empfehlen?"

Na sicher:

(3) Weil ich hoffe, eines Tages die Fundamente der [-----------] und paranoiden Leute, die andere für das Aliasing von Standardbefehlen züchtigen, zu erweitern, obwohl das Aliasing von Standardbefehlen Standard ist .

Im Ernst, das sind nur Vorbehalte. Wenn Sie darauf vertrauen, dass Sie nicht in eine dieser Schicksalsgruben geraten, dann passen Sie einfach auf und machen Sie weiter.

Ich persönlich kenne nur sehr wenige Standardbefehle. Ich benutze leichte Variationen, weil ich nur ein bisschen paranoid und anal zurückhaltend bin. Aber eine gute Verwendung, die ich dafür gefunden habe, ist in Bezug auf Systeme, auf denen ich mich oft als root oder als anderer Benutzer anmelde, und es gibt einige Dinge, die ich nicht versehentlich / träge als root ausführen möchte:

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

oder

alias irc="su irc_user"
Goldlöckchen
quelle
4

Lassen Sie mich als extremes Beispiel einen Standardbefehl aliasen, um zu veranschaulichen, warum das Aliasen von Standardbefehlen schädlich sein kann:

alias ls='rm'

Offensichtlich ist dies schlecht, weil es eines Tages eine böse Überraschung verursachen würde. Ebenso wird das Ersetzen von Standardbefehlen durch Aliase zu einer unglücklichen Überraschung führen, wenn Sie es am wenigsten erwarten.

Aber lassen Sie mich ein allgemeines Szenario vorstellen, das fast jedem Unix-Administrator im Laufe seiner Karriere passieren wird:

Eines Tages werden Sie einen neuen Job beginnen und an einem neuen System arbeiten, das von anderen eingerichtet wurde. Es ist drei Uhr morgens am Samstag, und Sie denken nicht klar und neigen dazu, Fehler zu machen. Ihre Standardumgebung ist nicht verfügbar. In der Tat sind Sie root.

rmWerdet ihr euch vor diesem Hintergrund daran erinnern, dass es keinen Alias ​​gibt rm -i? Werden Sie jedes Mal, wenn Sie sich in die Box einloggen, nach Ihren speziellen Aliasnamen suchen? Wenn Sie die Umgebung von root ändern, werden Ihre Mitarbeiter mit Ihrer Änderung zufrieden sein?

Ich bin ehrlich gesagt auf dem Zaun darüber. Ich habe in meiner Karriere an Tausenden von Systemen gearbeitet, und wenn ich die Umgebung auf all diesen Systemen modifizieren würde, wäre es schwierig, den Wert zu erkennen.

Aliasing rmauf rm -iist sehr verbreitet und ich habe gesehen, dass es viele Probleme verhindert, aber es hat auch viele Überraschungen und Stunden zusätzlicher Arbeit verursacht, um versehentlich gelöschte Dateien wiederherzustellen.

Deshalb versuche ich jetzt, Aliasing bei allgemeinen Systembefehlen zu vermeiden. Stattdessen verwende ich Aliase und Funktionen, um Dinge zu tun, die die Shell nicht leicht machen kann. Was ich jetzt tendenziell mache, ist einen zusätzlichen Brief an den Alias ​​anzuhängen, wie:

# 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 ; }

Und vielleicht sollte ich meinen endgültigen Alias ​​wirklich loswerden, da die Anpassung an neue Praktiken einige Zeit in Anspruch nimmt:

# For safety!
alias rm='rm -i'
Stefan Lasiewski
quelle
8
Das Merken der Flags für ist lsmöglicherweise praktischer als das Merken von zehn Aliasen.
Bernhard
Sehr richtig. Tatsächlich verwende ich diese Aliase selten mehr. Ich bin mir nicht sicher, warum ich sie noch habe, außer dass die komplizierteren Aliase (und Funktionen) schwer herauszufinden waren und als Referenz dienen. Der Einfachheit halber sollte ich sie wahrscheinlich entfernen.
Stefan Lasiewski
Die "Illustration" (erstes Beispiel) ist nicht wirklich nützlich. Das ist eindeutig böswillig und wir wissen, dass das Fangen eines Systems schädlich sein kann. Ihr rm-> rm -iBeispiel ist viel besser. Ein weiterer guter wäre man , dass Aliase rm Dinge in einem setzen~/.trash
Derobert
1
@Bernhard: Stimmt, aber die Aliase sind schneller zu tippen. (Aber zehn sind
Emanuel Berg
2
@StefanLasiewski: Hinweis: Entfernen Sie niemals Dinge, die aus rein ästhetischen Gründen nicht angezeigt werden. Lass sie bleiben, es sei denn, sie stören dich aktiv. Es ist so schnell, Dinge zu entfernen, nachdem man sie stundenlang aufgebaut hat. und wenn du es jemals bereust, fühlst du dich wie ein Idiot, weil du sie nicht einfach sein lässt.
Emanuel Berg
4

Es gibt mehr Gefahren.

Wenn Sie zum Beispiel shell-commandin Emacs arbeiten, denken Sie vielleicht, Sie bekommen "Ihren" Befehl (oder Alias) , aber Sie müssen nicht so lsoft einen Alias ​​in einem Terminal setzen, bevor Sie vergessen, den Alias ​​einzurichten und darüber nachdenken es wie jeder andere Befehl ...) - in der Tat (zurück zu Emacs), erhalten Sie den Befehl (unaliased). Emacs führt es problemlos aus, sodass Sie möglicherweise sogar blind sind für das, was gerade passiert ist!

Wenn es für verschiedene Computer und / oder Systeme zu langwierig ist, einzelne .rcDateien für alle einzurichten, können Sie nur eine solche Datei haben, jedoch mit ifKlauseln, die angepasst werden müssen.

Anstatt beispielsweise jede Funktion zu bewerten, wenn Sie sie schreiben, fügen Sie sie zuletzt der "schwarzen Liste" hinzu, wenn Sie Probleme mit einer dieser Funktionen haben:

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

Das Umbenennen von Standardbefehlen durch Aliase (dh das rm=rm -i) Zeug kann sicherlich zu Überraschungen führen, wenn der Alias ​​nicht verfügbar ist. Ich ziehe es nicht so verwenden, und (durch mehr bitter, bitter Erfahrungen ;-) Ich habe zweimal zu lesen jeden Befehl acustomed worden, und wenn es rmoder mvoder irgendetwas anderes potentiell zerstörerische dreimal. Und solche Aliase führen automatisch zu "rm foo" ENTER "y" Ups !! trotzdem (und kosten jedes Mal einen zusätzlichen Tastendruck).

Aber das bin nur ich. Wenn Sie nicht erwarten, in fremden Umgebungen (andere Computer, andere Benutzer, ...) ausgeführt zu werden, und Sie Ihre bevorzugten Aliase installieren können, wo immer Sie sind, gehen Sie wild. Unix ist dafür bekannt, dass Benutzer mehr als genug Seile haben, um ihre eigenen Füße zu schießen.

vonbrand
quelle
0

Die anderen Antworten sind gut, aber sie sehen alle nur, wie es Sie betrifft.

Lassen Sie mich @Stephan Laswieskis Antwort auf den Kopf stellen.

Vorausgesetzt, Sie sind nicht allwissend, müssen Sie möglicherweise jemanden an Ihrem Benutzerkonto arbeiten lassen oder Sie beraten, wie etwas zu tun ist.

Wenn sie dann etwas tun oder Ihnen sagen, dass Sie es tun sollen, funktioniert es möglicherweise nicht wie erwartet.

Bestenfalls müssen Sie Zeit damit verschwenden, ihnen zu erklären, was passiert ist (wenn Sie genau dort sind und sich erinnern oder herausfinden können, dass der Alias ​​der Grund für das Problem ist).

Im schlimmsten Fall sehen Sie eine Wendung des Beispiels in einer der anderen Antworten: alias ls = 'rm -rf'.

Joe
quelle