Heim  >  Artikel  >  Backend-Entwicklung  >  Grundlegendes Tutorial zur Shell-Pipe-Umleitung

Grundlegendes Tutorial zur Shell-Pipe-Umleitung

巴扎黑
巴扎黑Original
2017-08-15 15:54:001344Durchsuche

Pipeline dient zur Lösung des Problems der Kommunikation zwischen Prozessen. Sie ermöglicht die Übertragung von Daten zwischen zwei Prozessen und die Übertragung der Ausgabedaten eines Prozesses auf einen anderen Prozess als dessen Eingabedaten.

1.8.1 Anonymous Pipe"|"

Das Pipe-Symbol bedeutet, wie der Name schon sagt, es ist wie ein Rohr, durch das die Daten vom Rohreinlass zum Rohrauslass weitergeleitet werden das Rohr.

Pipeline dient zur Lösung des Problems der Kommunikation zwischen Prozessen. Sie ermöglicht die Übertragung von Daten zwischen zwei Prozessen und die Übertragung der Ausgabedaten eines Prozesses an einen anderen Prozess als dessen Eingabedaten. Die linke Seite der Pipe ist der Datengeber und die rechte Seite der Pipe ist der Datenempfänger.

echo "abcd" | passwd --stdin username bedeutet beispielsweise, dass das Ausgabeergebnis „abcd“ des Prozesses echo als Eingabedaten des Prozesses passwd verwendet wird.

Grundlegende Rohrsymbole und ihre Verwendung sind leicht zu verstehen. Die Frage ist nun für ps aux | grep "ssh" : Warum erscheint der Grep-Prozess in den Ergebnissen?


[root@xuexi ~]# ps aux | grep ssh
root    1211 0.0 0.1 82544 3600 ?    Ss  Jul26  0:00 /usr/sbin/sshd -D
root   25236 0.0 0.2 145552 5524 ?    Ss  05:28  0:00 sshd: root@pts/0
root   25720 0.1 0.2 145416 5524 ?    Ss  06:15  0:00 sshd: root@pts/1
root   25770 0.0 0.0 112648  948 pts/1  S+  06:15  0:00 grep --color=auto ssh

Gemäß der allgemeinen Idee wird ps zuerst ausgeführt und nach Erhalt der Ausgabe werden die Ausgabedaten an grep übergeben. Zu diesem Zeitpunkt ist dies bei grep nicht der Fall läuft noch, aber ps ist fertig. Warum können wir immer noch Statistiken über den grep-Prozess sammeln? Der Grund dafür ist, dass die Pipeline eine prozessübergreifende Kommunikation implementiert und es zu Überschneidungen zwischen den beiden Prozessen kommt. Nach dem Ausführen des ps-Prozesses beginnt auch die Erfassung der Prozessinformationen und wartet auf den Empfang von Daten. Wenn ps Daten sammelt, wird die Ausgabe freigegeben. Die Daten werden an den Speicher übergeben und zur Filterung an grep weitergeleitet.

Das Wesentliche einer Pipe ist die Datenübertragung. Die Ausgabedaten auf der linken Seite der Pipe werden im Speicher abgelegt und vom Prozess auf der rechten Seite der Pipe gelesen. Wenn der Speicher nicht ausreicht, um die Ausgabedaten vollständig zu speichern, wartet der Prozess auf der linken Seite der Pipe, bis die rechte Seite der Pipe einen Teil der Daten aus dem Speicher entfernt, sodass der Prozess auf der linken Seite der Pipe ausgeführt werden kann Die Pipe kann weiterhin ausgeben und der Prozess auf der rechten Seite der Pipe wird sofort gestartet, nachdem der Prozess auf der linken Seite der Pipe gestartet wurde. Sie befand sich jedoch im Wartezustand und wartete auf den Empfang von Daten, die von der Pipe übergeben wurden .

Mit anderen Worten: Die Prozesse auf der linken und rechten Seite der Pipeline laufen nahezu in keiner Reihenfolge ab.

Wie verhindert ps aux grep „ssh“, dass der eigene Prozess von grep in den Ergebnissen erscheint? Es gibt zwei Methoden:

Methode eins: ps aux |. h ]"


[root@xuexi ~]# ps aux | grep ss[h]
root    1211 0.0 0.1 82544 3600 ?    Ss  Jul26  0:00 /usr/sbin/sshd -D
root   25236 0.0 0.2 145552 5524 ?    Ss  05:28  0:00 sshd: root@pts/0
root   25720 0.0 0.2 145416 5524 ?    Ss  06:15  0:00 sshd: root@pts/1
Methode eins besteht darin, die Funktion „-v“ von grep anzuwenden, und Methode zwei darin, die Funktion regulärer Ausdrücke anzuwenden.

Bei der Verwendung anonymer Pipes haben Sie möglicherweise festgestellt, dass die Prozesse auf beiden Seiten der Pipe zur gleichen Prozessgruppe gehören, was bedeutet, dass die Daten auf der linken Seite der Pipe dies können Diese Daten können nur an den Prozess auf der rechten Seite der Pipe übergeben werden. Neben anonymen Pipes gibt es aber auch benannte Pipes, die die Daten eines Prozesses in einer Pipe-Datei (Fifo) speichern. Andere Prozesse können die darin enthaltenen Daten lesen Leser nicht mehr eingeschränkt. Informationen zu Named Pipes finden Sie im Linux/Unix-Betriebssystemkernel oder in Programmierbüchern, die im Allgemeinen detaillierte Einführungen enthalten.

1.8.2 Umleitung

1.8.2.1 Umleitungsgrundlagen

Am häufigsten Die Datei Deskriptoren der Standardeingabe (stdin), der Standardausgabe (stdout) und der Standardfehlerausgabe (stderr) sind jeweils 0, 1 und 2, wobei 0, 1 und 2 auch als ihre numerischen Codes betrachtet werden können. Die Ausgabeinformationen können als die auf dem Bildschirm gedruckten Informationen betrachtet werden. Diejenige, die keinen Fehler ausgibt, ist die Standardausgabe, und diejenige, die eine Fehlermeldung ausgibt, ist die Standardfehlerausgabe. Natürlich ist diese Erklärung voreingenommen , aber es ist leicht zu verstehen. Sie können auch Ihre eigenen Deskriptoren anpassen, um eine erweiterte Umleitung zu implementieren. Ihre Verwendung wird möglicherweise in zukünftigen Artikeln vorgestellt.

Standardeingabe = /dev/stdin = Code 0 = c92456ce18de163c509183b86545e174 oder >>

Standardfehler = /dev/stderr = Code 2 = 2>> verwenden.

95ec6993dc754240360e28e0de8de30a, 2> implementiert die Überschreibfunktion, >>, 2>> implementiert die Zusatzfunktion, aber f1916fe12afcec1ab723b5038606d7c3&1 und &> sind in Skripten üblich. Sie weisen beide darauf hin, dass stdout und stderr an dieselbe Stelle umgeleitet werden , leitet den gesamten Ausgabeinhalt weiter. Wie zum Beispiel das häufigste „&> /dev/null“.

[root@xuexi ~]# cat /etc/fstab | cat -

Das Auswerfen von stdout oder stderr nach /dev/null bedeutet, dass die Ausgabeinformationen verworfen werden. Umgekehrt bedeutet das Umleiten von /dev/null in eine Datei, dass die Datei gelöscht wird.


Darüber hinaus gibt es mehrere Möglichkeiten, Dateien schnell zu löschen
[root@xuexi ~]# cat /dev/null > ab.sh

[root@xuexi ~]# > ab.sh
[root@xuexi ~]# : > ab.sh       # 或"true >ab.sh",其实它们都等价于">ab.sh"
[root@xuexi ~]# echo '' > ab.sh
[root@xuexi ~]# truncate -s 0 ab.sh  # truncate命令用于收缩和扩展文件大小
[root@xuexi ~]# dd if=/dev/null of=ab.sh

最后最重要的一点:在有重定向符号的语句中,命令执行之前已经将文件截断了。所以如果正在编辑一个文件并将编辑的结果重定向回这个文件将出现异常,因为截断后就没有合适的内容用于编辑。一个简单的示例如下:


[root@xuexi ~]# head a.log > a.log

有些时候直接使用">"覆盖输出是比较危险的。可以使用set -C来设置如果输出重定向文件已经存在则不覆盖。使用set +C来取消set -C的效果。如果在设置了set -C时仍然想强制覆盖,可以使用“>|”代替“>”来重定向输出。同理错误输出也有此特性。


[root@xuexi tmp]# set -C
[root@xuexi tmp]# cat flip >ttt.txt
-bash: ttt.txt: cannot overwrite existing file
[root@xuexi tmp]# cat flip >| ttt.txt
[root@xuexi tmp]# set +C

1.8.2.2 cat和重定向配合

配合cat使用可以分行输入内容到文件中。


[root@xuexi tmp]# cat <<eof>log.txt  # 覆盖的方式输入到log.txt
> this is stdin character
> eof

也可以使用下面的方法。


[root@xuexi tmp]# cat >log1.txt <<eof 
> this is stdin character first!
> eof

一方面,eof部分都必须使用"88a41d6e50d3a6dd535eaf0181fbf000log1.txt表示将document的内容覆盖到log1.txt文件中,如果是要追加,则使用>>log1.txt。所以,追加的方式如下:


[root@xuexi tmp]# cat >>log1.txt <<eof 
> this is stdin character first!
> eof


[root@xuexi tmp]# cat <<eof>>log1.txt 
> this is stdin character first!
> eof

1.8.2.3 tee双重定向

可以使用tee双重定向。一般情况下,重定向要么将信息输入到文件中,要么输出到屏幕上,但是既想输出到屏幕又想输出到文件就比较麻烦。使用tee的双重定向功能可以实现该想法。如图。


tee [-a] file

选项说明:

    -a:默认是将输出覆盖到文件中,使用该选项将变为追加行为。

    file:除了输出到标准输出中,还将输出到file中。如果file为"-",则表示再输入一次到标准输出中。

例如下面的代码,将a开头的文件内容全部保存到b.log,同时把副本交给后面的的cat,使用这个cat又将内容保存到了x.log。其中"-"代表前面的stdin。


[root@xuexi tmp]# cat a* | tee b.log | cat - >x.log

还可以直接输出到屏幕:


[root@xuexi tmp]# cat a* | tee b.log | cat

tee默认会使用覆盖的方式保存到文件,可以使用-a选项来追加到文件。如:


[root@xuexi tmp]# cat a* | tee -a b.log | cat

现在就可以在使用cat和重定向创建文件或写入内容到文件的同时又可以在屏幕上显示一份。


[root@xuexi tmp]# cat <<eof | tee ttt.txt
> x y
> z 1
> eof
x y
z 1

1.8.2.4 <<和<<<

在bash中,<<和<<<是特殊重定向符号。<<表示的是here document,<<<表示的是here string。

here document在上文已经解释过了,对于here string,表示将<<<后的字符串作为输入数据。

例如:


passwd --stdin user <<< password_value

等价于:


echo password_value | passwd --stdin user

Das obige ist der detaillierte Inhalt vonGrundlegendes Tutorial zur Shell-Pipe-Umleitung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn