Schlechte Erektion der Ursache

Das ls (1) Befehl ist ziemlich gut darin, Ihnen die Attribute einer einzelnen Datei anzuzeigen (zumindest in einigen Fällen), aber wenn Sie nach einer Liste von Dateien fragen, gibt es ein großes Problem: Unix erlaubt fast jedes Zeichen in einem Dateinamen, einschließlich Leerzeichen, Zeilenumbrüche , Kommas, Pipe-Symbole und so ziemlich alles andere, was Sie jemals als Trennzeichen verwenden würden, außer NUL. Es gibt Vorschläge, wie Sie versuchen können, dies in POSIX zu beheben, aber sie helfen nicht, mit der aktuellen Situation umzugehen (siehe auch, wie Sie mit Dateinamen richtig umgehen). Wenn die Standardausgabe im Standardmodus kein Terminal ist, wird ls trennt Dateinamen durch Zeilenumbrüche. Dies ist in Ordnung, bis Sie eine Datei mit einem Zeilenumbruch im Namen haben. Und da kenne ich keine Implementierung von ls Dadurch können Sie Dateinamen mit NUL-Zeichen anstelle von Zeilenumbrüchen beenden. Dadurch können wir mit ls keine Liste von Dateinamen sicher abrufen.

Diese Ausgabe scheint darauf hinzudeuten, dass wir zwei Dateien mit dem Namen a haben, eine namens Newline und man nannte einen Raum.

Mit ls -l wir können sehen, dass dies überhaupt nicht wahr ist:

Das Problem ist, dass aus der Ausgabe von lsWeder Sie noch der Computer können erkennen, welche Teile davon einen Dateinamen darstellen. Ist es jedes Wort? Ist es jede Zeile? Nein. Es gibt keine richtige Antwort auf diese Frage außer: Sie können es nicht sagen.

Beachten Sie auch, wie ls Manchmal werden Ihre Dateinamendaten verstümmelt (in unserem Fall wurde das Zeilenumbruchzeichen zwischen den Wörtern »a»Und» newline»In ein Fragezeichen. Einige Systeme setzen ein \ n stattdessen.). Auf einigen Systemen geschieht dies nicht, wenn die Ausgabe kein Terminal ist, auf anderen wird der Dateiname immer entstellt. Alles in allem kann und sollte man der Ausgabe von ls wirklich nicht vertrauen um eine echte Darstellung der Dateinamen zu sein, mit denen Sie arbeiten möchten. Also nicht.

Nachdem wir das Problem gesehen haben, wollen wir verschiedene Möglichkeiten untersuchen, um damit umzugehen. Wie immer müssen wir zunächst herausfinden, was wir eigentlich tun wollen.

ls in GNU coreutils> = 8.25 werden die Dateinamen beim Drucken auf ein Terminal jetzt korrekt aus der Shell entfernt. Führen Sie cd «$ (mktemp -d)» aus. Berühren Sie «'» $' \ n '«foo bar»; ls um zu sehen, wie es funktioniert. Dies wird nicht für Pipes durchgeführt, es sei denn – Zitatstil = Shell-Escape gegeben ist (siehe unten).

Genug, um Viagra und seine schädlichen Analoga zu essen! In der modernen Medizin gibt es viele Pillen, um die männliche Potenz wiederherzustellen, aber alle haben mindestens eine der folgenden Nebenwirkungen:

  • einen starken Anstieg des Blutdrucks verursachen;
  • absolut nicht kompatibel mit Alkohol und fetthaltigen Lebensmitteln;
  • verursachen "Entzugssyndrom" und andere unangenehme Auswirkungen und verursachen in einigen Fällen irreparable Schäden für Ihre Gesundheit!

Wenn Sie eine schnelle und starke Erektion erreichen möchten, verwenden Sie sichere Kapseln: Adamour oder Amarok.

Amarok Adamour

Dies ist ein völlig neuer Ansatz zur Lösung eines so heiklen Problems wie einer „starken Erektion“. Die Zusammensetzung dieser Zubereitungen umfasst Pflanzenextrakte, dh die Inhaltsstoffe der Kapseln Adamour oder Amarok keine chemischen Verbindungen enthalten. Bewertungen von Männern, die die Wirkung dieser Kapseln auf sich selbst erfahren haben, bestätigen die hohe Wirksamkeit dieser Medikamente und sogar das Vorhandensein der therapeutischen Wirkung von Impotenz in den späten Stadien der „sexuellen Schwäche“.

Ich fordere Sie auf, detaillierte Informationen über moderne Medikamente zu lesen Adamour, Amarok, veröffentlicht auf den offiziellen Websites der Hersteller, und erzählen Sie dies Leuten, die immer noch synthetische Pillen für einen "schnellen Erektionsaufruf" verwenden!

Thomas Schmidt, Androloge.

Aufzählen von Dateien oder Arbeiten mit Dateien

Wenn Leute versuchen, ls zu benutzen Um eine Liste von Dateinamen zu erhalten (entweder alle Dateien oder Dateien, die mit einem Glob übereinstimmen, oder Dateien, die auf irgendeine Weise sortiert sind), schlagen die Dinge katastrophal fehl.

Wenn Sie nur alle Dateien im aktuellen Verzeichnis durchlaufen möchten, verwenden Sie ein for Schleife und ein Glob:

Verwenden Sie auch «shopt -s nullglob», damit in einem leeren Verzeichnis kein Literal '*' angezeigt wird.

Mach niemals diese:

Die Dinge werden schwieriger, wenn Sie eine bestimmte Sortierung wünschen, die nur ls kann, wie zum Beispiel nach mtime bestellen. Wenn Sie die älteste oder neueste Datei in einem Verzeichnis haben möchten, verwenden Sie nicht ls -t | Kopf -1 – Lesen Sie stattdessen Bash FAQ 99. Wenn Sie wirklich eine Liste aller Dateien in einem Verzeichnis in der Reihenfolge mtime benötigen Damit Sie sie nacheinander verarbeiten, zu Perl wechseln und Ihr Perl-Programm sein eigenes Verzeichnis öffnen und sortieren kann. Führen Sie dann die Verarbeitung im Perl-Programm durch oder lassen Sie das Perl-Programm im schlimmsten Fall die Dateinamen mit NUL-Trennzeichen ausspucken.

Noch besser ist es, die Änderungszeit in den Dateinamen im Format JJJJMMTT zu schreiben, sodass die Glob-Reihenfolge auch die Zeitreihenfolge ist. Dann brauchst du kein ls oder Perl oder so. (Die überwiegende Mehrheit der Fälle, in denen Benutzer die älteste oder neueste Datei in einem Verzeichnis wünschen, kann einfach dadurch gelöst werden.)

Sie könnten ls patchen eine Null unterstützen Option und senden Sie den Patch an Ihren Betriebssystemhersteller. Das hätte vor ungefähr 15 Jahren geschehen sollen. (Tatsächlich haben es die Leute versucht und es wurde abgelehnt! Siehe unten.)

Der Grund, der nicht getan wurde, ist natürlich, dass nur sehr wenige Leute wirklich die Sortierung von ls brauchen in ihren Skripten. Wenn Benutzer eine Liste mit Dateinamen wünschen, verwenden sie meistens find (1), da ihnen die Reihenfolge egal ist. Und BSD / GNU finden hat die Fähigkeit, Dateinamen mit NULs für eine sehr lange Zeit zu beenden.

Adamour  Der Kampf gegen Impotenz - die effektivsten Wege

Also stattdessen:

Noch besser ist, dass die meisten Leute nicht wirklich eine Liste von Dateinamen wollen. Sie wollen stattdessen Dinge mit Dateien machen. Die Liste ist nur ein Zwischenschritt, um ein echtes Ziel zu erreichen, z. B. die Änderung von www.mydomain.com in mydomain.com in jeder * .html-Datei. finden kann Dateinamen direkt an einen anderen Befehl übergeben. Es ist normalerweise nicht erforderlich, die Dateinamen in einer geraden Linie zu schreiben und sich dann auf ein anderes Programm zu verlassen, um den Stream zu lesen und die Namen wieder zu trennen.

Abrufen von Metadaten in einer Datei

Wenn Sie nach der Dateigröße suchen, können Sie auch wc verwenden stattdessen:

Die meisten Implementierungen von wc erkennt, dass stdin eine reguläre Datei ist, und ermittelt die Größe durch Aufrufen von fstat (2). Dies ist jedoch nicht garantiert. Einige Implementierungen lesen möglicherweise tatsächlich alle Bytes.

Andere Metadaten sind oft nur schwer tragbar. stat (1) ist nicht auf jeder Plattform verfügbar, und wenn dies der Fall ist, wird häufig eine völlig andere Syntax von Argumenten verwendet. Es gibt keine Möglichkeit, stat zu verwenden auf eine Weise, dass es beim nächsten POSIX-System, auf dem Sie das Skript ausführen, nicht kaputt geht. Wenn Sie damit einverstanden sind, werden beide GNU-Implementierungen von stat (1) und finde (1) (über die -printf Option) sind sehr gute Möglichkeiten, um Dateiinformationen abzurufen, je nachdem, ob Sie sie für eine einzelne Datei oder für mehrere Dateien wünschen. AST finden hat auch -printf, aber wieder mit inkompatiblen Formaten, und es ist viel seltener als GNU finden.

Wenn alles andere fehlschlägt, können Sie versuchen, einige Metadaten aus ls -l zu analysierenAusgabe. Zwei große Warnungen:

    Führen Sie ls aus mit jeweils nur einer Datei (denken Sie daran, Sie können nicht zuverlässig feststellen, wo der erste Dateiname endet, da es kein gutes Trennzeichen gibt – und nein, eine neue Zeile ist kein ausreichend gutes Trennzeichen -, sodass Sie nicht feststellen können, wo das zweite Trennzeichen steht Die Metadaten der Datei werden gestartet.

    Analysieren Sie nicht den Zeit- / Datumsstempel oder darüber hinaus (die Zeit- / Datumsfelder sind normalerweise sehr plattform- und länderabhängig formatiert und können daher nicht zuverlässig analysiert werden).

    Soviel ist relativ sicher:

    Beachten Sie, dass die Moduszeichenfolge häufig auch plattformspezifisch ist. Beispielsweise fügt OS X ein @ für Dateien mit xattrs und ein + für Dateien mit erweiterten Sicherheitsinformationen hinzu. GNU fügt manchmal a hinzu. oder + Zeichen. Je nachdem, was Sie damit machen, müssen Sie das Modusfeld möglicherweise auf die ersten 10 Zeichen beschränken.

    Falls Sie uns nicht glauben, warum versuchen Sie nicht, den Zeitstempel zu analysieren:

    Unter OpenBSD, wie bei den meisten Unix-Versionen, ls Zeigt die Zeitstempel in drei Feldern an – Monat, Tag und Jahr oder Uhrzeit. Das letzte Feld ist die Zeit (Stunden: Minuten), wenn die Datei weniger als 6 Monate alt ist, oder das Jahr, wenn die Datei älter als 6 ist Monate alt.

    Adamour  Probleme mit einer Erektion was zu tun ist (2)

    Auf Debian instabil (circa 2009), mit einer zeitgenössischen Version von GNU Coreutils, ls zeigte die Zeitstempel in zwei Feldern, wobei das erste YMD und das zweite H: M war, egal wie alt die Datei ist.

    Es sollte also ziemlich offensichtlich sein, dass wir niemals die Ausgabe von ls analysieren wollen wenn wir einen Zeitstempel aus einer Datei wollen. Sie müssten Code schreiben, um alle drei oben gezeigten Zeit- / Datumsformate und möglicherweise mehr zu verarbeiten.

    Aber für die Felder vor dem Datum / der Uhrzeit ist es normalerweise ziemlich zuverlässig.

    (Hinweis: Einige Versionen von ls Drucken Sie nicht standardmäßig den Gruppenbesitz einer Datei aus und benötigen Sie ein -g Flagge, um dies zu tun. Andere drucken die Gruppe standardmäßig und -g unterdrückt es. Du wurdest gewarnt.)

    Wenn wir Metadaten von mehr als einer Datei in derselben ls erhalten wollten Befehl stoßen wir auf das gleiche Problem wie zuvor – Dateien können Zeilenumbrüche in ihren Namen haben, was unsere Ausgabe durcheinander bringt. Stellen Sie sich vor, wie Code wie dieser brechen würde, wenn wir eine Datei mit einem Zeilenumbruch im Namen haben:

    Ähnlicher Code, der zwei separate ls verwendet Anrufe wären wahrscheinlich OK, da das zweite Lesen Der Befehl beginnt garantiert am Anfang eines ls Befehlsausgabe statt möglicherweise in der Mitte eines Dateinamens.

    Wenn das alles für Sie wie eine große Tüte voller Verletzungen klingt, haben Sie Recht. Es lohnt sich wahrscheinlich nicht, diesem Mangel an Standardisierung auszuweichen. In Bash FAQ 87 finden Sie einige Möglichkeiten, um Dateimetadaten abzurufen, ohne ls zu analysieren Ausgabe überhaupt.

    Hinweise zu GNU coreutils ls

    Offensichtlich viele der Probleme mit ls würde einfach weggehen, wenn es eine -0 hätte Option, mit der die Ergebnisse mit NUL-Terminatoren anstelle von Zeilenumbrüchen und ohne Änderungen an den Dateinamen gedruckt werden. Das Leben wäre einfach! Nun, weniger schwierig.

    Aber das können wir nicht haben! Ein Patch, um dies in GNU-Coreutils zu tun, wurde 2014 abgelehnt, in einem offensichtlichen Versuch, ls zu behalten beschissen.

    Stattdessen haben uns neuere (ca. 2016) Versionen von GNU-Coreutils einen Zitierstil verliehen Option mit verschiedenen Auswahlmöglichkeiten, von denen die meisten für Bash-Scripting-Zwecke unbrauchbar sind und die alle für die menschliche Lesbarkeit unbrauchbar sind.

    Wir erwähnen es hier, weil eine der Optionen für den Zitierstil tatsächlich nützlich ist, wenn sie mit der Bewertung von bash kombiniert wird Befehl. Insbesondere: – Quoting-Style = Shell-Escape erzeugt eine Ausgabe, die bash (aber nicht POSIX sh) wieder in Dateinamen analysieren kann.

    Mit eval kombinierenkönnen wir bestimmte Arten von Problemen lösen, z. B. die 5 ältesten Dateien in diesem Verzeichnis abrufen. Natürlich eval muss mit Vorsicht verwendet werden.

    ParsingLs (zuletzt bearbeitet vom Benutzer GreyCat 2019-03-04 14:14:26)

    Shahinclub Deutschland