Vorwort
Ich glaube, jeder weiß, dass Zeit ein sehr nützlicher Befehl in Bash ist. Er kann die Ausführung eines Skripts oder eines Programms zeitlich festlegen. Dies ist normalerweise sehr praktisch, wenn man die Effizienz der Programmausführung grob vergleicht. Sie werden jedoch feststellen, dass der vom Befehl time ausgegebene Zeittext nicht einfach umgeleitet werden kann, beispielsweise in eine Textdatei, sondern nur auf dem Bildschirm angezeigt werden kann, was für nicht interaktives Timing sehr unpraktisch ist.
Zum Beispiel:
$ time find . -name "mysql.sh" >1.txt real 0m0.081s user 0m0.060s sys 0m0.020s $ time find . -name "mysql.sh" 2>2.txt ./work186/sms/bin/mysql.sh ./work186/sms/src/scripts/mysql.sh ./work186/sms/src/scripts1/mysql.sh ./work186/sms1/bin/mysql.sh ./work186/sms1/src/scripts/mysql.sh ./temp/sms/bin/mysql.sh ./temp/sms/src/scripts/mysql.sh real 0m0.068s user 0m0.040s sys 0m0.030s
Bei den oben genannten Versuchen wurde festgestellt, dass die Ausgabeinformationen der Zeit nicht in eine Datei umgeleitet werden können. Warum? Da time ein Schlüsselwort der Shell ist, führt die Shell eine spezielle Verarbeitung durch. Sie verarbeitet die Befehlszeile nach dem Zeitbefehl als Ganzes. Bei der Umleitung handelt es sich tatsächlich um die Ausgabe des Zeitbefehls selbst nicht umgeleitet werden.
Das Schlüsselwort time setzt eine Markierung. Die Zeitinformationen werden erst nach Ausführung des Befehls (find) an stderr ausgegeben. Das Schlüsselwort time erfordert, dass der gesamte Befehl und die gesamte Pipeline sowie zugehörige Umleitungen erweitert werden. Aus diesem Grund funktioniert eine einfache Weiterleitung aus Zeitgründen nicht. Dies wird durch die Bash-Syntax definiert. Die Umleitung nach dem Befehl ist Teil des Zeitbefehls.
Hinweis: Die Ausgabe des Zeitbefehls wird an den Standardfehler (stderr) gesendet.
Wenn der Zeitbefehl ausgeführt wird, wird der Befehl auf der nächsten Ebene der aktuellen Shell ausgeführt (d. h. der Shell, in der der Time-Befehl ausgeführt wird) Shell, und die Ausgabe von Time selbst befindet sich im stderr der aktuellen Shell. Die Umleitung wie oben gezeigt führt nur dazu, dass die Standardausgabe des Befehls in eine Textdatei umgeleitet wird, nicht jedoch die Ausgabe von time selbst.
Die erste Lösung besteht darin, den Zeitbefehl und die auszuführende Befehlszeile in einen Shell-Codeblock zu schreiben, also in ein Paar geschweifte Klammern. Achten Sie auf die Verwendung von Leerzeichen und Semikolons.
$ { time find . -name "mysql.sh"; } 2>2.txt ./work186/sms/bin/mysql.sh ./work186/sms/src/scripts/mysql.sh ./work186/sms/src/scripts1/mysql.sh ./work186/sms1/bin/mysql.sh ./work186/sms1/src/scripts/mysql.sh ./temp/sms/bin/mysql.sh ./temp/sms/src/scripts/mysql.sh $ cat 2.txt real 0m0.068s user 0m0.030s sys 0m0.040s
Zusammenfassend lässt sich sagen: { time command-line } 2>file Achten Sie auf die Verwendung von Trennzeichen.
Eine andere Möglichkeit ist die Verwendung einer Sub-Shell
wie unten gezeigt:
$ (time find . -name "mysql.sh") 2>2.txt ./work186/sms/bin/mysql.sh ./work186/sms/src/scripts/mysql.sh ./work186/sms/src/scripts1/mysql.sh ./work186/sms1/bin/mysql.sh ./work186/sms1/src/scripts/mysql.sh ./temp/sms/bin/mysql.sh ./temp/sms/src/scripts/mysql.sh $ cat 2.txt real 0m0.083s user 0m0.040s sys 0m0.020s [root@web186 root]#
Zusammengefasst war auch die zweite Methode erfolgreich up, (time command-line) 2>file hier folgt direkt auf die Zeit Klammern (es ist auch möglich, und es ist kein Semikolon am Ende der Befehlszeile erforderlich. Natürlich ist es am besten, das erste zu verwenden Methode, schließlich ist das Starten einer Subshell Es nimmt mehr Ressourcen in Anspruch
Zusammenfassung
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels allen etwas helfen kann Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen.
Weitere Erläuterungen zur Ausgabe des Befehls „time“ unter Shell (Bash) finden Sie auf der chinesischen PHP-Website 🎜>