ホームページ バックエンド開発 Python チュートリアル シェルパイプのリダイレクトに関する基本チュートリアル

シェルパイプのリダイレクトに関する基本チュートリアル

Aug 15, 2017 pm 03:54 PM
shell チュートリアル リダイレクト

パイプラインは、プロセス間通信の問題を解決するために存在します。これにより、2 つのプロセス間でデータを転送でき、あるプロセスの出力データがその入力データとして別のプロセスに転送されます

1.8.1 Anonymous Pipe" | 「

パイプシンボルとはその名の通り、パイプのようなもので、パイプの入口からパイプを通してパイプの出口までデータを渡します。

パイプラインは、プロセス間通信の問題を解決するために存在し、2 つのプロセス間でデータを転送できるようにし、あるプロセスの出力データを入力データとして別のプロセスに転送します。パイプの左側はデータの提供者であり、パイプの右側はデータの受信者です。

たとえば、 echo "abcd" | passwd --stdin username は、プロセス echo の出力結果 "abcd" がプロセス passwd の入力データとして使用されることを意味します。 echo "abcd" | passwd --stdin username,表示将进程echo的输出结果"abcd"作为进程passwd的输入数据。

基本的管道符号及其用法很容易理解。现在的疑问是,对于ps aux | grep "ssh"

基本的なパイプ記号とその使用法は理解しやすいです。ここでの問題は、ps grep "ssh" の場合、なぜ grep プロセスが結果に表示されるのかということです。


[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
ログイン後にコピー

一般的な考え方によると、ps が最初に実行され、出力を取得した後、出力データが grep に渡されます。この時点では grep はまだ実行されていませんが、ps は実行を完了しています。プロセス情報はまだ収集されますか?これは、パイプラインがプロセス間通信を実装しており、ps プロセスの実行後にプロセス情報の収集が開始され、データの受信を待機している状態になっているためです。 ps がデータを収集すると、出力がメモリに渡され、フィルタリングのために grep にパイプされます。

パイプの本質はデータ転送です。パイプの左側の出力データはメモリに置かれ、パイプの右側のプロセスによって読み取られます。メモリが出力データを完全に保存するのに十分でない場合、パイプの左側のプロセスは、パイプの右側がメモリ内のデータの一部を取り出すまで待機します。パイプは出力を続行でき、パイプの左側のプロセスが開始された直後にパイプの右側のプロセスが開始されますが、パイプによって渡されたデータの受信を待っている待機状態になっています。 。

言い換えると、パイプラインの左側と右側のプロセスは、ほとんど順序なく実行されます。

では、ps aux | grep "ssh" は、grep 自身のプロセスが結果に表示されるのを避けるにはどうすればよいでしょうか? 2 つの方法があります:

方法 1: ps grep "ssh" | grep -v "grep"

方法 2: ps aux | ss[h]"


方法 1 grep の「-v」機能を適用する方法 2 は、正規表現機能を適用することです。

匿名パイプを使用する過程で、パイプの両側のプロセスが同じプロセス グループに属していることに気付いたかもしれません。つまり、パイプの左側のデータはそのプロセスにのみ渡すことができます。パイプの右側にあり、他のプロセスはこのデータを読み取ることができません。ただし、匿名パイプに加えて、名前付きパイプもあります。名前付きパイプは、プロセスのデータをパイプ ファイル (fifo) に保存します。これは、他のプロセスがパイプ ファイルを読み取ってその中のデータを読み取ることができます。リーダーは制限されなくなりました。名前付きパイプについては、Linux/unix オペレーティング システムのカーネルまたはプログラミングの書籍を参照してください。通常、これらの書籍には詳細な説明が記載されています。

1.8.2 リダイレクト

1.8.2.1 リダイレクトの基本

標準入力 (stdin)、標準出力 (stdout)、および標準エラー出力 (stderr) の最も一般的なファイル記述子は、それぞれ 0、1 です。および 2 があり、このうち 0、1、2 は数値コードと考えることもできます。出力情報は画面に出力される情報と考えることができ、エラーが表示されないものが標準出力、エラーが表示されるものが標準エラー出力です。 もちろん、この説明には偏りがあります。 , 分かりやすいです。独自の記述子をカスタマイズして、高度なリダイレクトを実装することもできます。その使用法については、今後の記事で紹介する可能性があります。

標準入力 = /dev/stdin = コード 0 = < または <<

Stdout = /dev/stdout = コード 1 = > または >>

標準エラー = /dev/stderr = コード 2 = 2> または 2>> の表記を使用します。

<, >, 2> は上書き関数を実装します。>>, 2>> は追加関数ではありませんが、ここでドキュメントが生成されることを意味します。 cat とリダイレクトの連携の内容で後述します。さらに、<<< があります。これは here 文字列を意味します。以下も参照してください。

「-」を使用することは、/dev/stdin を意味する場合もあります。例:


[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
ログイン後にコピー

記号 2>&1 と &> はどちらも stdout と stderr が同じ場所にリダイレクトされること、つまりすべての出力コンテンツがリダイレクトされることを示します。最も一般的な「&> /dev/null」など。

stdout または stderr を /dev/null にスローすることは、出力情報を破棄することを意味します。逆に、/dev/null をファイルにリダイレクトすることは、ファイルをクリアすることを意味します。


[root@xuexi ~]# cat /etc/fstab | cat -
ログイン後にコピー

さらに、ファイルを素早くクリアする方法がいくつかあります


[root@xuexi ~]# > ab.sh
[root@xuexi ~]# : > ab.sh       # 或"true >ab.sh",其实它们都等价于">ab.sh"
[root@xuexi ~]# echo &#39;&#39; > 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部分都必须使用"<


[root@xuexi ~]# cat <<abcx
> 123
> 345
> abcx
123
345
ログイン後にコピー

另一方面,>log1.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
ログイン後にコピー

以上がシェルパイプのリダイレクトに関する基本チュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Dewuの使い方のチュートリアル Dewuの使い方のチュートリアル Mar 21, 2024 pm 01:40 PM

Dewu APP は現在非常に人気のあるブランド ショッピング ソフトウェアですが、ほとんどのユーザーは Dewu APP の機能の使い方を知りません。最も詳細な使用方法のチュートリアル ガイドは以下にまとめられています。次に、エディターがユーザーに提供する Dewuduo の概要です。機能の使い方チュートリアルですので、興味のある方はぜひご覧ください! Dewu の使い方チュートリアル [2024-03-20] Dewu の分割購入方法 [2024-03-20] Dewu クーポンの入手方法 [2024-03-20] Dewu マニュアルのカスタマーサービスの検索方法 [2024-03- 20] デューのピックアップコード確認方法 [2024-03-20] デューの購入場所 [2024-03-20] デューのVIP開放方法 [2024-03-20] デューの返品・交換申請方法

Linux でファイルの末尾の行をすばやく削除する方法 Linux でファイルの末尾の行をすばやく削除する方法 Mar 01, 2024 pm 09:36 PM

Linux システムでファイルを処理する場合、ファイルの末尾の行を削除する必要がある場合があります。この操作は実際のアプリケーションでは非常に一般的で、いくつかの簡単なコマンドで実行できます。この記事では、Linux システムでファイルの末尾の行をすばやく削除する手順と、具体的なコード例を紹介します。ステップ 1: ファイルの最終行を確認する 削除操作を実行する前に、最初にファイルの最終行がどの行であるかを確認する必要があります。ファイルの最後の行を表示するには、tail コマンドを使用できます。具体的なコマンドは次のとおりです: tail-n1filena

夏はぜひ虹を撮ってみてください 夏はぜひ虹を撮ってみてください Jul 21, 2024 pm 05:16 PM

夏の雨の後には、美しく魔法のような特別な天気の風景、虹がよく見られます。これも写真撮影ではなかなか出会えない光景で、とてもフォトジェニックです。虹が現れるにはいくつかの条件があります。まず、空気中に十分な水滴があること、そして、低い角度から太陽が当たることです。そのため、雨が上がった午後が最も虹が見えやすいのです。ただし、虹の発生は天候や光などの条件に大きく左右されるため、一般に虹の持続時間は短く、見頃や撮影に最適な時間はさらに短くなります。では、虹に遭遇したとき、どうすれば虹を適切に記録し、高品質の写真を撮ることができるでしょうか? 1. 虹を探す 上記の条件に加えて、虹は通常、太陽光の方向に現れます。つまり、太陽が西から東に輝いている場合、虹は東に現れやすくなります。

WeChat の支払い音をオフにする方法のチュートリアル WeChat の支払い音をオフにする方法のチュートリアル Mar 26, 2024 am 08:30 AM

1. まずWeChatを開きます。 2. 右上隅の[+]をクリックします。 3. QR コードをクリックして支払いを受け取ります。 4. 右上隅にある 3 つの小さな点をクリックします。 5. クリックして支払い到着の音声リマインダーを閉じます。

DisplayX (モニターテストソフトウェア) チュートリアル DisplayX (モニターテストソフトウェア) チュートリアル Mar 04, 2024 pm 04:00 PM

壊れたモニターを購入しないようにするには、購入時にモニターをテストすることが重要です。今日は、ソフトウェアを使用してモニターをテストする方法を説明します。方法ステップ 1. まず、この Web サイトで DisplayX ソフトウェアを検索してダウンロードし、インストールして開くと、ユーザーに提供されている多くの検出方法が表示されます。 2. ユーザーは、通常の完全テストをクリックします。最初のステップは、ディスプレイの明るさをテストすることです。ユーザーは、ボックスがはっきりと見えるようにディスプレイを調整します。 3. マウスをクリックして次のリンクに進み、モニターが黒と白の各領域を区別できれば、モニターはまだ良好であることを意味します。 4. マウスの左ボタンをもう一度クリックすると、モニターのグレースケール テストが表示されます。色の変化がスムーズであればあるほど、モニターの品質は向上します。 5. さらに、displayx ソフトウェアでは、

photoshoppcs5とはどんなソフトですか? -photoshopcs5の使い方チュートリアル photoshoppcs5とはどんなソフトですか? -photoshopcs5の使い方チュートリアル Mar 19, 2024 am 09:04 AM

PhotoshopCS は Photoshop Creative Suite の略で、Adobe 社が開発したソフトウェアで、グラフィック デザインや画像処理に広く使用されています。PS を学習する初心者として、今日は photoshopcs5 とはどのようなソフトウェアなのか、そして photoshopcs5 の使い方を説明しましょう。 1. photoshop cs5 とはどのようなソフトウェアですか? Adob​​e Photoshop CS5 Extended は、映画、ビデオ、マルチメディア分野の専門家、3D やアニメーションを使用するグラフィックおよび Web デザイナー、エンジニアリングおよび科学分野の専門家に最適です。 3D イメージをレンダリングし、それを 2D 合成イメージに結合します。動画を簡単に編集

専門家が教える! Huawei携帯電話で長い画像をカットする正しい方法 専門家が教える! Huawei携帯電話で長い画像をカットする正しい方法 Mar 22, 2024 pm 12:21 PM

スマートフォンの継続的な発展に伴い、携帯電話の機能はますます強力になり、その中でも長時間の写真を撮る機能は、多くのユーザーが日常生活で使用する重要な機能の1つになりました。長いスクリーンショットは、ユーザーが長い Web ページ、会話記録、または写真を一度に保存して、簡単に表示したり共有したりできるようにするのに役立ちます。数ある携帯電話ブランドの中でも、ファーウェイの携帯電話はユーザーから高く評価されているブランドの一つでもあり、長い写真のトリミング機能も高く評価されています。この記事では、ファーウェイの携帯電話で長い写真を撮る正しい方法と、ファーウェイの携帯電話をより良く活用するための専門的なヒントを紹介します。

PHP チュートリアル: int 型を string に変換する方法 PHP チュートリアル: int 型を string に変換する方法 Mar 27, 2024 pm 06:03 PM

PHP チュートリアル: Int 型を文字列に変換する方法 PHP では、整数データを文字列に変換するのが一般的な操作です。このチュートリアルでは、PHP の組み込み関数を使用して int 型を文字列に変換する方法を、具体的なコード例を示しながら紹介します。キャストを使用する: PHP では、キャストを使用して整数データを文字列に変換できます。この方法は非常に簡単で、整数データの前に(文字列)を追加するだけで文字列に変換できます。以下は簡単なサンプルコードです

See all articles