Wie intelligent sind Unix-Dienstprogramme?


8

Unix-Dienstprogramme wie sort, find, grep, diff et al. Sind sehr praktisch, um schnelle Aufgaben auszuführen, manchmal ohne Code zu schreiben.

Ich wollte wissen, welche Algorithmen sie intern verwenden und wie man einen bestimmten Algorithmus für eine bestimmte Aufgabe intelligent entscheidet. Wenn sort beispielsweise eine große Eingabedatei erhält, werden unterschiedliche Algorithmen für unterschiedliche Datengrößen verwendet?

Wechselt grep intelligent bei der Suche nach verschiedenen Datensätzen zwischen Algorithmen?


4
Sie sind so intelligent, dass sie eines Tages die Erde übernehmen werden. Aber jetzt müssen Sie entscheiden , welche Sie verwenden werden, wie grep, egrepoder fgrep.
Keith

1
Aber wenn Sie egrep regelmäßig verwenden und dann plötzlich zu fgrep wechseln, könnte es sich entscheiden, Sie im Schlaf zu töten, weil Sie untreu sind.
Shadur

1
Sie sind so intelligent wie die Hände, die sie führen.
Luis.espinal

Antworten:


7

Unix ist nur ein Standard, es gibt an, was die Implementierungen tun sollen, aber nicht, wie sie es tun sollen.

Daher verwenden Implementierungen von grep / sort / find höchstwahrscheinlich unterschiedliche Ansätze auf unterschiedlichen Systemen (und selbst bei einem System wie Linux gibt es gleichzeitige Implementierungen).

Unter Linux können Sie jederzeit in den Quellcode schauen.


2
Um Ihre Antwort zu vervollständigen: gnu.org/software/coreutils
sahid

Warum sollten Sie sich den Quellcode ansehen? greps-Algorithmen sind bekannt und dokumentiert. Es ist sogar in der Wikipedia-Seite für grep. Link
Gelöschter Account

@ Gelöscht Ich denke, dass Sie Prinzipien mit der Implementierung verwechseln.
Šimon Tóth

@Let_Me_Be: Der Algorithmus und sogar die Implementierung sind bekannt und dokumentiert. Link Link
Gelöschter Account

@ Gelöscht Vielleicht verstehe ich nicht, was Sie sagen wollen, aber dass Linux grep von coreutils einen bestimmten Algorithmus verwendet, bedeutet nicht, dass alle Implementierungen diesen Algorithmus verwenden. Und ja, Sie haben Recht damit, dass Algorithmen in der Regel bekannt sind (da dies der Sinn des Entwurfs ist).
Šimon Tóth


1

Der UNIX-Standard legt keine Implementierungsdetails für die Standardsystemtools fest, außer in wirklich seltenen Fällen. Die neueste Version der Single Unix-Spezifikation finden Sie hier (Warnung: Registrierung erforderlich).

In diesem Sinne hat jedes UNIX (System V und direkte Nachkommen wie BSD, Solaris, Mac OS X usw.) oder UNIX-basierte Betriebssystem (weit entfernte Nachkommen oder gleichartige: Linux, Minix) seine eigenen Implementierungen der in beschriebenen Programme die UNIX-Spezifikation. Zum Beispiel. einen Blick auf FreeBSD und Linux / GNU Coreutils . Beachten Sie, dass einige Tools wie GNU diff oder GNU grep eigenständige Projekte sind . Eine weitere Tatsache ist, dass einige Implementierungen dieser Tools möglicherweise standardmäßig in andere UNIX-ähnliche Systeme gelangen als diejenigen, für die sie ursprünglich geschrieben wurden, z. B. einige Gnu-Coreutils in Freebsd oder GCC.

Bonus: Um Ihren Kopf um den UNIX-Stammbaum zu wickeln, sehen Sie sich dieses Diagramm an .


0

Ich wollte wissen, welche Algorithmen sie intern verwenden und wie man einen bestimmten Algorithmus für eine bestimmte Aufgabe intelligent entscheidet. Wenn sort beispielsweise eine große Eingabedatei erhält, werden unterschiedliche Algorithmen für unterschiedliche Datengrößen verwendet?

Das ist eine interessante Frage (+1 dafür). Ich habe keine Ahnung, wie die Antwort lautet, aber wenn ich Sie wäre, würde ich mir den Quellcode typischer GNU-Dienstprogramme ansehen, um eine Vorstellung von deren Algorithmen zu bekommen.

Wechselt grep intelligent bei der Suche nach verschiedenen Datensätzen zwischen Algorithmen?

Das glaube ich nicht. Zitiere mich nicht, da ich es dir nicht mit 100% iger Sicherheit sagen kann, aber ich denke wirklich nicht. Die UNIX-Philosophie der Dinge ist, dass eine Sache eine Sache und nur eine Sache tut. Deshalb haben wir mehrere Versionen von grep (haben grep, egrep, fgrep).

Die Idee ist auch, eine Sache und nur eine Sache zur Laufzeit zu tun. Unterschiedliche Verhaltensweisen und Algorithmen können als Befehlszeilenargumente konfiguriert werden, sodass dasselbe Programm zwischen den Läufen leicht unterschiedlich (und möglicherweise etwas optimierter) agieren kann. Gute Beispiele sind der Befehl wcund diff.

Die Verhaltensanpassung ist jedoch konfigurationsbasiert (über cmd-Zeilenargumente). Sie ändern / passen das Verhalten zur Laufzeit nicht an. Es ist normalerweise eine unnötige Komplexität für die Art von Artefakten, die die UNIX-Tools anstreben.

Diese Komplexität ist besser geeignet für komplexere, weniger universelle Tools IMO.


2
Das Thema hier ist eher Nein, sie sind tatsächlich dumm! . Sie müssen ihnen genau sagen, was sie tun müssen. Wie auch immer, wir wollen nicht, dass sie uns gegenüber zu schlau sind, wissen Sie.
Tshepang

0

Wechselt grep intelligent bei der Suche nach verschiedenen Datensätzen zwischen Algorithmen?

Ich glaube nicht, aber es wechselt zum "schnellen" Nicht-RE-Algorithmus, wenn das Flag -f angegeben wird (oder als fgrep aufgerufen wird).


dh nicht wirklich intelligent :)
Tshepang
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.