Warum haben * NIX-Befehle solche "wahnsinnigen" (kontraintuitiven) Standardeinstellungen (philosophisches Nachdenken)?

727
NeuronQ

Warum haben die meisten * NIX-Befehle meine (Erfahrung ist meist Linux und seltene Begegnung mit FreeBDS) solche "wahnsinnigen" (unintuitiven) Standardverhalten, dh, sie unterscheiden sich sehr von der "äquivalenten" GUI-Aktion.

Das offensichtlichste Beispiel ist der Befehl zum Kopieren von Dateien cp, der standardmäßig (1) keine Verzeichnisse rekursiv kopiert (offensichtlich nicht intuitiv für jeden, der von einer GUI zur Shell gekommen ist, bei der ein Verzeichnis kopiert und eingefügt wird ) und (2) folgen simlinks (!!), anstatt sie einfach so zu kopieren, wie sie sind (wiederum wie jeder GUI-Benutzer dies erwarten würde). So ist die „sane“ Version, cpdass ich mich vorstellen Standard sollte sein ist so etwas wie: cp -r.

(Auch hier handelt es sich nicht um eine "voreingenommene" Perspektive, die für jemanden einzigartig ist, der zuvor nur eine grafische Benutzeroberfläche verwendet hat. Der DOS-Befehl copyz. B. macht das, was Sie erwarten würden, wie ein Äquivalent von cp -roder cp -ra...)

Ein anderes naheliegendes Beispiel ist das rmWann, rm -riwas ein Nicht-Shell-Geek als Standard erwarten würde.

Und bei 90% aller * NIX-Befehle geht es darum, den Standardwert zu erreichen, den Sie intuitiv als Standard erwarten würden, indem Sie einige weitere Optionen hinzufügen. Und ist nicht als ob das, was ein erfahrener Benutzer erwartet, dass der Standard zu sein, ist nicht das, was ein unerfahrener Benutzer tut, für Dinge wie cpund rmes ist offensichtlich, dass 99% der Zeit cp -rund rm -rist das, was Sie brauchen. Und es ist nicht so, als müssten die Dinge nur aus Gründen der Abwärtskompatibilität auf diesem Weg bleiben, da Sie einfach eine neue Shell erstellen und #/usr/bin/oldshelletwas für die alte behalten können .

Die Frage wäre also wieder: Warum sind die standardmäßigen Optionen / Schalter der * NIX-Shellbefehle für das, was Sie intuitiv erwarten würden, so weit entfernt? Wo finde ich die historischen Argumente dafür, wie die Dinge sind (auch zu anekdotischen Zwecken) und aus welchem ​​Grund die abscheuliche Rückwärtskompatibilität für den aktuellen Stand der Dinge ist?


Gefunden dies auf unix.stackexchange, die tatsächlich eine Menge meiner Fragen beantwortet ...

4
Willkommen bei Superuser, bitte lesen Sie, was die [FAQ] (http://superuser.com/faq#dontask) über "gesprächige offene Fragen" sagt. RedGrittyBrick vor 12 Jahren 0
Mit cp vermute ich, dass der Befehl vor symbolischen Links liegt. Es besteht eine gute Chance, dass die meisten Menschen, die wissen würden, warum Dinge auf eine bestimmte Art und Weise ausgeführt wurden, sehr alt oder tot sind. Eine gute Anzahl von Befehlen kann sogar Unix vorab datieren Journeyman Geek vor 12 Jahren 0
"intuitiv" ist subjektiv. Ich wäre verblüfft, wenn "cp" standardmäßig rekursiv wäre und mir sagen würde "Warum um alles in der Welt hat jemand es so gestaltet". Mat vor 12 Jahren 0
@JourneymanGeek ... um zu verstehen, was Sie meinen, brauchte ich einige Zeit, um zu erkennen, dass Linux-Simlinks eher Hardlinks zu Anwendungen sind, im Gegensatz zu Windows-Shortcut-Dateien (auf diese Weise nie gedacht) ... aber auch hier ist Geschichte allein der Grund für die Beibehaltung unvorhergesehener Ausfälle? NeuronQ vor 12 Jahren 0
Absolut. Dies bedeutet, dass die in den 70er Jahren verwendeten Befehle * jetzt auf vorhersagbare Weise funktionieren. Und Simlinks sind näher an Dateisystemzeigern als eine Windows-Verknüpfung. Symlinks sind viel mächtiger. Journeyman Geek vor 12 Jahren 0
@Mat ... WARUM? Wenn Sie in einer grafischen Umgebung etwas kopieren, von dem Sie erwarten, dass es tatsächlich kopiert wird (einschließlich des Inhalts). Warum unterscheiden sich Ihre Erwartungen in der Schale? Selbst in der realen Welt, wenn Sie ein Blatt xeroxen, erwarten Sie eine Kopie davon, nicht Titel und Untertitel oben auf der Seite. NeuronQ vor 12 Jahren 0
@NeuronQ: Aber vielleicht machen grafische Umgebungen es falsch; p Journeyman Geek vor 12 Jahren 2
@NeuronQ: Aber um ein Buch in der realen Welt zu kopieren, musst du jede Seite kopieren und nicht einfach auf den Kopierer legen :) choroba vor 12 Jahren 1
@choroba OK, Papier / Buch zu Ordner Analogie beweist nichts, mein schlechtes, du hast recht. aber der hauptpunkt bleibt noch NeuronQ vor 12 Jahren 0
@JourneymanGeek GUIs modellieren die Dinge irgendwie durch Ähnlichkeit mit Objekten aus der realen Welt oder durch Interaktionen mit der realen Welt ... und dies hat immer gut funktioniert, wenn Sie intuitive Schnittstellen erstellen (gutes altes E-Mail-Messaging verwenden) ... die Shell scheint absichtlich so unterschiedlich zu sein möglich von jedem häufig verwendeten physikalischen Weltkonzept oder Interaktion ... NeuronQ vor 12 Jahren 0
Was ist dein Hauptpunkt? * Deine * Erwartungen sind deine, aus der Art, wie du Sachen gelernt hast. Anscheinend habe ich Sachen nicht so gelernt wie Sie und andere. Ihr "intuitives" ist mein "wtf". Mat vor 12 Jahren 0
Und genau deshalb ist dies subjektiv und wird wahrscheinlich geschlossen werden Journeyman Geek vor 12 Jahren 0
@Mat Als GUI / UX-Designer weiß ich, dass 99% der Menschen eine Reihe von Intuitionen haben, die auf realen physischen Interaktionen basieren. Intelligente Menschen wie Sie haben kein Problem, in abstrakten Konzepten zu denken, aber 90% der Benutzer haben keine "abstrakte Intuition", die in alle Richtungen frei schwingen kann. Sie haben Intuitionen, die auf gemeinsamen Konzepten basieren GUIs von Xerox bis zu heutigen Desktops verwenden eine Reihe von "intuitiven" Konzepten ... Sie können genauso gut argumentieren, dass Sie beim Erstellen von GUIs alle Analogien aus der realen Welt verwerfen und sich stattdessen von der mathematischen Mengenlehre inspirieren lassen. NeuronQ vor 12 Jahren 0
@NeuronQ: Es hat nichts mit "smarts" zu tun. Sie gehen davon aus, dass die grafische Benutzeroberfläche irgendwie "die Art ist, wie die Dinge sein sollten" und dass die Gestaltungsprinzipien dahinter die Welt bestimmen sollten. Das ist nicht der Fall. Es gibt keinen Grund, warum CLI-Tools mit den gleichen Konstruktionsprinzipien wie GUI-Tools (oder umgekehrt) modelliert werden sollten. Unterschiedliche Anwendungsfälle und unterschiedliche Zielgruppen. Mat vor 12 Jahren 1
Die allgemeine Idee, und wir "scheren Geeks" sehr gerne so, wie es ist, denn: Dinge sind gut dokumentiert und verhalten sich in verschiedenen Umgebungen (Computern) gleich. Wenn Sie etwas in eine App ziehen und ablegen, wird dies nach Belieben durchgeführt. Niemand liest jemals, wie sich eine GUI verhält. Und die Benutzerhandbücher sind Mist. ... In einer anderen App (Mac OS - Windows -gnome-kde) werden die Ergebnisse durch Ziehen und Ablegen variieren (Details). Während cp IMMER dasselbe tut, was es seit über 40 Jahren getan hat. cp -r wird auch wie erwartet vorgehen. WENN Sie wissen, was Sie davon erwarten - und Sie tun es, wenn Sie die Manpage lesen. Ярослав Рахматуллин vor 12 Jahren 0
Erstens, weil Unix nur ein -r für "rekursiv" standardisieren will, muss es für grep, ls (R) / rm / cp usw. verwendet werden. 2. cp -nr (no_recursive) oder cp -s (single) ist verrückter. Drittens, rm -r ist gefährlicher als rm, dies ist ein Schutz. 4. rekursives Äquivalent zum Schleifenkonzept in der Programmierung, das explizit angegeben wird. 林果皞 vor 8 Jahren 0

1 Antwort auf die Frage

3
Ярослав Рахматуллин

The commands do exactly as expected of them. You may find out what is reasonable to expect of a command by looking at the manual page for that command.

E.G.

man cp: -i, --interactive prompt before overwrite (overrides a previous -n option)

If you find yourself thinking that some options are good to have all the time, there are various vays of persisting your choices. You may for example type in:

alias rm="rm -i" alias cp="cp -r" 

But that will only last until you log out. To make such options permanent you can put these aliases in a file that is read by yor shell every time you log in. If you run bash, you can put your start-up commands in ~/.bashrc. Generally, ~/.profile is also a good place to put aliases.


The current state of things, when shells and command line utilities are concerned, is far from obnoxious. The initial shock of using the terminal instead of a graphical browser, may leave you confused and maybe somewhat enraged, but only after a couple of years You'll get very used to it and will laugh back at the time when you used to think that a GUI browser was "the current state of things".

For the sake of good will, and to welcome you to the world of command line interface I'll give you a couple of my favorite aliases. And I'll give you that cp -i and rm -i are byt far better to have as the default commands, because it's very easy to make a mistake and remove a lot of files unintentionally. I don't agree on the recursive option though.

# basic file manipulation, etc alias cd....='cd ../..' alias cd...='cd ../..' alias cd..='cd ..' alias cd.='cd .' alias cd~='cd ~' alias ....='cd ../..' alias ...='cd ../..' alias ..='cd ..' alias ~='cd ~' alias ls='ls --color=auto' alias l='ls -CF' alias l1='ls -1' alias ll='ls -l' alias lla='ls -la' alias la='ls -a' alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' alias mc='mv -i' alias md="mkdir" alias rd="rmdir" alias less="less -i" alias bc="bc -q" alias KA="killall" alias swipe='screen -wipe' alias sdr='screen -dR $1' # and some functions: spelling () { echo $@ | LC_ALL=en_US aspell -a; } google-search () { BROWSER="firefox '%s' &" args="${@}"; args=`echo $args | sed 's/ /%20/g'`; url="https://www.google.no/search?hl=en&um=1&sa=1&q="; printf "$BROWSER\n" "$url$args" | sh } 
Vielen Dank! Aber was soll "alias cd. =" Cd. "" Tun? Ist nicht das aktuelle dir? NeuronQ vor 12 Jahren 0
Ich habe das Leerzeichen vergessen oder den Befehl falsch geschrieben. Ich kann mich nicht wirklich erinnern, warum ich dachte, dass Alias ​​nützlich ist. Ich hatte es schon seit einigen Jahren. Ich benutze keine CD. nicht mehr. Ich habe dir gerade ein paar Beispiele gegeben ... Ярослав Рахматуллин vor 12 Jahren 0
Wenn Ihr aktuelles Verzeichnis gelöscht und neu erstellt wurde, können Sie mit `cd .` vom alten veralteten Verzeichnis zum neuen wechseln. BatchyX vor 12 Jahren 1
Ja, ok, aber wie oft passiert das? Ich denke, ich meine für CD. cd sein .. Ярослав Рахматуллин vor 12 Jahren 0
alias home = 'cd ~' ist ein Segen für diejenigen, deren Tastaturlayout das Eingeben von Tilde zu einem schmerzlindernden Fingertwist macht. Bojan Markovic vor 11 Jahren 0
@BojanMarkovic, `~` ist der Standardspeicherort für `cd`. Sie müssen also niemals` cd ~ `eingeben, da Sie mit` cd` dorthin gelangen. OmnipotentEntity vor 10 Jahren 1
@ ЯрославРахматуллин - Bezüglich `alias cd. = 'Cd .`` - wahrscheinlich, weil DOS und Windows` cmd.exe` Sie `cd..` machen lassen (eine Gewohnheit, die ich hatte, bevor ich mich Anfang 2000 mit Linux beschäftigte). aber nicht "bash". LawrenceC vor 10 Jahren 0