本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はPOSIXシステムで使用できるファイル名かどうかを確認する「pathchk」コマンドです。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はPOSIXシステムで使用できるファイル名かどうかを確認する「pathchk」コマンドです。
「pathchk」は指定したファイル名やパス名がPOSIXシステムで使用できるかどうかを確認するコマンドです。
現在利用中のOSで使用できるファイル名であっても、他のシステムでは使えないかもしれない、つまり可搬性(ポータビリティー)がないかもしれません。pathchkコマンドではPOSIXシステムで問題ないファイル名かどうかを確認できます。
シェルスクリプトの中で、ファイル名を確認する際に使用するという使い方もあるでしょう。
pathchk [オプション] パス名
※ [ ]は省略可能な引数を示しています。
短いオプション | 長いオプション | 意味 |
---|---|---|
-p | ほとんどのPOSIXシステムで使用できるかどうかを確認する | |
-P | ファイル名やディレクトリ名が「-」で始まっていないかどうかを確認する | |
--portability | 全てのPOSIXシステムで使用できるかどうかを確認する(「-p -P」相当) | |
「pathchk パス名」で、現在使用しているファイルシステム上で使用できる名前かどうかを確認します。使用できない文字があったり、長過ぎたりといった問題がある場合は、メッセージを表示します(※1)。問題がない場合は何も表示しません。
※1 CentOS 8の場合、パス全体で4096文字、ファイル名は255文字が最大文字数となっている。それぞれ「getconf」コマンドを使って「getconf PATH_MAX /usr」「getconf NAME_MAX /usr」を実行することで、「/usr」のファイルシステムで使用できるパス名と名前の最大文字数を確認できる(linux/limits.hで定義されている)。
ほとんどのPOSIXシステム上で問題ないかどうかを確認するには「pathchk -p パス名」を実行します。POSIXで使用できるファイル名は、アルファベットの「A〜Z」「a〜z」の他、「数字の0〜9」「.」「_」「-」だけです。これ以外の文字が使用されている場合やファイル名が14文字を超えている場合、パス名全体で255文字を超えている場合はメッセージを出力します。
この他、「pathchk -P パス名」で、ファイルやディレクトリの名前が「-」で始まっていないかどうかを確認することができます。これは何かのコマンドでオプションを指定する場合に問題が起こらないようにするために役立ちます。
「pathchk -pP パス名」のように、「-p」と「-P」の両方を指定することで、パス名がPOSIX上問題ないかどうかを確認できます。「-pP」の代わりにロングオプション「--portability」を使うこともできます。
pathchk パス名
(パス名が現在使用しているファイルシステム上で使用できるかどうかを確認する)
pathchk -pP パス名
(パス名がPOSIX上問題ないかどうかを確認する)
画面1では、「デスクトップ」「/tmp/dir1/test文書」「longfilename.txt」について確認しています。3つとも、現在のOS(ここではCentOS 8)では使用できますが、他のOS(POSIXシステム)では問題があるかもしれないことが分かります。
画面2では、「/tmp/-test.txt」と「tmp-test.txt」「-test.txt」について確認しています。いずれも「-p」ではエラーになりませんが、「/tmp/-test.txt」と「-test.txt」については「-P」でエラーになりました。
なお、「-test.txt」のようにパス名の先頭が「-」の場合、pathchkコマンドに対するオプションとして解釈されてしまうため、エラーになります。そこで、「pathchk -- -test.txt」のように、間に「--」を挟んでいます。このように、「-」から始まる名前はコマンドラインで扱いにくいため使用しないことをおすすめします。
pathchkには終了コードがあり、問題がない場合は「0」、問題がある場合は「1」を返します。そこで、シェルスクリプトの中では「if pathchk パス名」のようにif文を使って、パス名に問題がないかどうかを確認できます。
次のif文は、変数「FILENAME」にセットされている内容がパス名として問題ないかどうかを確認し、問題がなければ「OK」、問題があれば「NG」というメッセージを表示します。
if pathchk -pP -- "$FILENAME" 2>/dev/null then echo "OK" else echo "NG" fi
if文の使い方については連載第223回や“応用力”をつけるためのLinux再入門(27)を参照してください。
Copyright © ITmedia, Inc. All Rights Reserved.