Linuxを最初から自動ビルドするbashスクリプトプロジェクトに取り組んでいます。コードを調べるたびに、コードをよりクリーンにする方法を見つけます。私はコードの小さなセクションを取り、それをより良くします。
先日、ファイルシステムをマウントする前に、ファイルシステムがマウントされているかどうかを確認するための変更を行っていました。私はそうするためのより良い方法を探していました。通常のマウントを使いたくありませんでした| grep またはそのようなコード。もっときれいなものが欲しかった。
理由はわかりませんが、その瞬間、なぜ自分のラップトップにすでにある情報を見つけるためにインターネットに頻繁に接続するのか疑問に思いました。だから、私はマンマウントを起動します 私はすぐにmanページをちらっと見て、これに気づきました:

そしてそこに私の答えがありました。まず、私はしばらくの間間違ったコマンドを使用しています。第二に、Googleが常に最良の答えを持っているとは限りません。
ここでの皮肉なことに、これは私が通常見ているオンラインのマニュアルページには記載されていません。マウントのマニュアルページで、 findmntを確認してください。 最後にのみ参照されます。答えを見つけるために通常のチャネルを調べていたら、この記事を書くことはなかったでしょう。
すぐに私は非常に興味を持ちました。このfindmnt ?スクリプトからいくつのパイプを削除できますか? マウントよりもはるかに優れていることがわかりました リスト。まず、各コマンドのデフォルト出力を比較してみましょう。
デフォルト出力をマウント

上記のマウントされたファイルシステムのリストを見ると、grepがなぜそれほど人気になったのかが簡単にわかります。情報はすべてそこにありますが、より良いフォーマットは読みやすくなります。これを実現するには、パイプと外部コマンドがすでに必要です。それでは、 findmntを見てみましょう。 。
Findmntのデフォルト出力

それはずっと良く見えます。 findmnt を使用すると、さらに改善されます ツールを組み合わせて使用する必要はもうありません。非常に柔軟性があり、スクリプトで使用すると、よりクリーンなコードを記述できます。
Linuxでのfindmntコマンドの実用的な使用法
ファイルシステムがfindmntでマウントされているかどうかを確認する はるかに簡単です。 ソースを確認できます またはtarget オプションを使用せずに。マウントポイントを提供します(ターゲット )またはデバイス(ソース )オプションなし、 findmnt あなたが提供した議論を両方に対して一致させようとします。
findmnt /boot

Findmntは、実際にはファイルシステムの検索コマンドのように機能します。一致するものが見つかった場合は、それらが印刷され、 findmnt 0を返します。クエリに一致するものがない場合、 findmnt 何も出力せず、1を返します。
オプションの長いリストには、 findmntが付属しています。 。オプションには、検索の絞り込みと出力のフォーマットという2つの主要なカテゴリがあります。
findのように ファイルを検索するには、 findmnt ファイルシステムを見つけるためのものです。 SOURCEおよびTARGETと照合される文字列を提供することにより、検索を制限する方法をすでに知っています。検索をソースまたはターゲットに絞り込む必要がある場合は、-Sおよび-Tオプションを使用してください。

すでにこの時点で、私は findmntを使用して販売されました マウントの代わりに 。必要なパーティションを照会できます。そして、私はパイプを使いません。 Findmntはそれだけではありません。ファイルシステムを強力に検索できるように設計された多数のオプションがあります。
最も興味深いオプションの1つは-Oだと思います 、 –オプション 。 -O optionsを使用すると、検索に一致するオプションのリストを作成できます。読み取り専用ファイルシステムの検索は、 findmnt-Oro。と同じくらい簡単になりました。

-O オプションは、コンマ区切りのリストを取ることもできます。これにより、複数のオプションを検索し、必要なすべてのオプションを備えたファイルシステムのみを一覧表示できます。
特定のファイルシステムタイプを検索する場合も、外部ツールを使用する必要はありません。 -tを使用するだけです オプション。以下の例では、すべての tmpfsをリストしました。 マウントします。

上記のすべての例で、findmntは/ etc / fstab、/ etc / mtab、および/ proc / self/mountinfoを検索しました。次のオプションを使用して、この広範囲の検索を簡単に制限できます。
- –fstab (/ etc / fstabのみに絞り込みます)
- –mtab (/ etc / mtabのみに絞り込みます)
- –カーネル (/ proc / self / mountinfoのみで検索)
もう1つの興味深いオプションは、 -iです。 、 –反転 。マッチングの感覚を逆転させます。前の例では、すべての tmpfs をリストしました -tを使用 オプション。以下の例では、タイプ swapのすべてのファイルシステムを一覧表示します。 fstabからのみ。
findmnt --fstab -t swap
これは、タイプスワップを除くすべてのファイルシステムを一覧表示します。
findmnt --fstab -t swap -i
すでに与えられたオプションを使用すると、多くのパイプや外部プログラムの使用を回避できます。そして、それはここで止まりません。 Findmnt 検索結果の出力をカスタマイズするための優れたオプションセットを提供します。
findmntコマンドの出力をカスタマイズする
ヘッダーを削除するためにheadコマンドを使用する必要はありません。 findmntに電話するだけです -nを使用 オプション:

次のオプションがオプションになるとは思っていませんでした。 Findmntは、dfコマンドの出力を模倣できます。 findmntを呼び出す -Dを使用 または–df findmntに通知します リストされた各ファイルシステムのスペースに関する情報を表示します。

オプションを組み合わせて、より具体的な検索を行うことができます。この次の例では、 findmntを使用します / etc / fstabからすべてのファイルシステムを一覧表示し、df情報の表示を要求します。
findmnt --fstab --df

あなたのことはわかりませんが、 findmntを楽しみ始めています。 。それらのUUIDを除く 最後のコマンドで。私はそれを理解しました、それはOSのデバイスを識別するための良い方法です。私、もっと人間が読める方法が欲しいです。これは-eで実現します オプション。
-e または–評価 UUID、LABEL、PARTLABEL、PARTUUIDなどのすべてのタグを対応するデバイス名に変換するオプション。 -eを使用して同じコマンドを実行すると結果が表示されます オプション。

findmnt 出力をフォーマットします。それはより人間に優しいです。一方、この形式をスクリプトで使用すると、操作が難しくなる可能性があります。単純な行ごとのスペースで区切られたデータセットの方が簡単です。これは-rで簡単に実行できます 、 –生 オプション。

この次のオプションは本当に素晴らしいです。 |する必要がなくなると思いますgrep ほぼ完全に。 findmnt -oで印刷する正確な列 、 –出力 。このオプションは、コンマで区切られた列のリストを使用して印刷します。次のコマンドを使用すると、ヘッダーなしでルートパーティションの使用可能なスペースだけを取得できます。
findmnt -T / --df -o AVAIL -n

スクリプトで行う必要があるのは、最後の文字を削除することだけです。上記のコマンドで、 –dfを指定しました オプション。それは必要ではありませんでした。そのオプションがなくても同じ結果が出力されます。

Findmntは、出力列の非常に広範なリストを提供します。以下に、興味深いと思われるコラムの短いリストを示します。 findmnt –help を使用して、完全なリストを表示できます。
- ソースソースデバイス
- TARGETマウントポイント
- FSTYPEファイルシステムタイプ
- オプションすべてのマウントオプション
- LABELファイルシステムラベル
- UUIDファイルシステムUUID
- MAJ:MINメジャー:マイナーデバイス番号
- SIZEファイルシステムのサイズ
- 利用可能なAVAILファイルシステムサイズ
- 使用されるUSEDファイルシステムのサイズ
- USE%ファイルシステム使用率
- FSROOTファイルシステムルート
印刷された列のデフォルトのリストは、置き換える代わりに拡張できます。次の形式を使用してリストを提供するだけです: + list 。次のコマンドは、 –dfを使用した場合と同じ情報を提供します。 、列が最後に追加されることを除いて。
findmnt -T / -o +SIZE,USE%,AVAIL

すでにfindmntに恋をしています 。これにより、多くの配管と長いコマンドラインを節約できます。そしてfindmnt それだけではありません。私が話したいもう1つの機能があります。 ポーリング 。
はい、 findmnt / proc / self/mountinfoファイルの変更を監視するために使用できます。これにより、システムを効果的に監視して、関連するアクティビティをマウントできます。 bashスクリプトでwhileループを実行する必要はもうありません。
Findmnt 次のアクションをリッスンします、マウント 、 umount 、再マウント および移動 。リッスンするアクションのコンマ区切りリストを提供することで、これを制限できます。たとえば、以下はファイルシステムのマウントのみを監視します。

上の画像では、 findmntによって出力された出力が表示されています。 新しいパーティションがマウントされたとき。新しい列アクションに気づきました ? –poll オプションで、表示できる3つの新しい列があります:
- アクション:マウント、アンマウント、再マウント、および移動に使用できます
- OLD-TARGET:umountおよびmoveアクションで使用できます。
- 古いオプション:umountとremountで使用できます。
このモードで使用する場合、 findmnt スクリプトで使用された場合、スクリプトは「ハング」します。 –poll アクションをブロックしてリッスンします2つのオプションで制限できます
- –最初のみ :Findmntは、最初のアクションが検出された後に終了します。
- –タイムアウトX :FindmntはXミリ秒後に終了します。
すべてをまとめると、 findmnt 強力なツールの1つです。スクリプトで使用すると、多くの余分なコードが不要になります。外部コマンドにパイプする必要性が大幅に減少しました。
以前にリストされたオプションは、 –pollでも使用できます 。以下の例では、 findmnt マウントアクションをリッスンし、SOURCE、TARGET、SIZE、およびUSE%を出力します。ただし、マウントターゲットが -Tと一致する場合のみ オプション。
findmnt -T /mnt/lfs --poll=mount -o SOURCE,TARGET,SIZE,USE%
ボーナスのヒント:findmntの実際の例
私はしばらくの間、LinuxをScratchからコンパイルするためのbashスクリプト環境に取り組んできました。 findmntの使用 私のスクリプトでは、より良い、よりクリーンなコードが得られました。
スクリプトの最初の起動時に、LFSパーティションがマウントされているかどうかを確認します。マウントされていない場合は、スクリプトがマウントします。以前のコードは次のようになりました:
if [[ `grep "$pd on $pm" < <(mount) | wc -l` < 1 ]];
then
...
...
fi
このプロジェクトは教育目的であるため、上記のテストでプロセス置換とパイプを使用しました。コード全体を通して、同じタスクを実行するための複数の方法を表示します。 findmntの使用 私は同じことをするためのよりクリーンな方法を思いついた。
findmnt -S $pd -T $pm > /dev/null || (
...
...
)
出力を/dev/nullにリダイレクトします。findmntは必要ありません。 コンソールに出力されます。 Findmnt 検索が失敗した場合は1を返します。これにより、(…)内のコードが実行されます。
新しいコマンドを楽しんで学んだことを願っています。面白い使い方ができたらコメントでシェアしてください。この記事には別の見方もあります。オンライン検索が常に最良であるとは限りません。 Linuxにはマニュアルが付属していることを忘れがちです。