bash printfに関する良いドキュメントはどこで見つけることができますか?

bash printfに関する良いドキュメントはどこで見つけることができますか?

man printfinfo printfどちらprintf --helpも私には役に立ちません。オプションの説明が必要ですFORMAT。たとえば、次のように使用できます。

printf '%s\n' foo bar

出力を取得します。

foo
bar

ウェブで一般的に読んだ内容によれば、これは%s「区切り記号」と同じ意味であるので、与えられた各引数を改行printf文字で区切って印刷します。

また、あちこちに参照資料も表示され、%d他のいくつかの参考資料もあります(数値に関連していると仮定しますか?)。誰かがこれらの書式設定オプションの概要を提供できますか?

答え1

Bashの場合、主なリソースはですman bash。特に組み込み機能の場合、help組み込みがあります。で引用した内容ですhelp printf

printf(1) および printf(3) で説明されている標準形式仕様に加えて、printf は以下も解釈します。

 %b        expand backslash escape sequences in the corresponding argument
 %q        quote the argument in a way that can be reused as shell input
 %(fmt)T output the date-time string resulting from using FMT as a format
       string for strftime(3)

printf(N)で使用される記号は、help printf括弧内の数字で表されるコマンドのマニュアルセクションを参照する必要があることを意味します。

特殊%(fmt)T指定子が必要な場合はman 1 printf、およびを参照してください。man 3 printfman 3 strftime

文書には、単に「文字列の場合は%s、数字の場合は%d」はリストされていません。私はあなたが最初に要求したものが次のようになると思います。変換仕様

答え2

私が見つけた最高のリソースは次のとおりです。bash-hackers.org wikiBashに関連するすべて。これはナビゲートしにくいコンテンツではなく、マニュアルページの外観です。

以下を含む特定のテーマが組み込まれています。printf。このページは非常に詳細です!これには、すべての書式設定オプションと例と下部のディスカッションセクションも含まれており、極端なケースと機能printfの微妙な違いを具体化するのに役立ちます。

私も書いてあげるprintf の GNU Coreutils ドキュメント、特にページフォーマットオプション、もしあれば。

答え3

まず、printf次の3つの亜種を区別することが重要です。

  • printfカーニバルとして組み込み
  • printf(Bash-) 外部実行ファイルとして、例えばコアツール/usr/bin/printfwhich printfおよび参照man 1 printf)。
  • printf(..)~からC標準ライブラリ図書館)(私の場合はGNUプロジェクトglibc実装、参照man 3 printf

最初のステップは、実行時に組み込み実行バージョンを使用するか外部実行バージョンを使用するかを決定することです。注文する printf '%s\n' foo bar。これは以下を使用して見つけることができます。type バッシュ内蔵使用された特定のシェルプロンプトで:

$ type printf
printf is a shell builtin

これバッシュ内蔵 printfに記録Bashリファレンスマニュアル - 4.2 Bash組み込みコマンド:printf

Bashのドキュメントには%s何も説明も説明もしませんが、%d次の関連情報が含まれています。

標準形式に加えて、printf(1)printfは次の拡張も解釈します。 [...]

私のシステム(Debian 11 ブルスアイman 1 printf見せるprintf 実行可能ファイル~からGNUコアツール

組み込みコマンドの代わりに実行可能ファイルを使用してコマンドを実行するには、次のいずれかのステートメントを使用します。

env printf '%s\n' foo bar

/usr/bin/printf '%s\n' foo bar
# full path to the printf *executable* found out via command 'which printf'

これcoreutils 実行可能ファイル printfに記録GNU Coreutils - 15.2 printf: データのフォーマットと印刷

coreutils ドキュメントには、次の関連情報が含まれています。

printf印刷滞在文字列は ' %'ディレクティブと ''エスケープを解釈し、C ''関数とほぼ同じ方法\で数字と文字列引数をフォーマットします。printfバラよりprintfフォーマットディレクティブ詳細については、GNU Cライブラリリファレンスマニュアルを参照してください。違いは次のとおりです。 [...]

coreutils のドキュメントでは、既におよび%sに関する追加のガイドラインを提供しています%d

引用GNU Cライブラリリファレンスマニュアル以下の関連セクションがありますprintf(..)

ついに:GNU Cライブラリ(また)一つである実装する~のC POSIXライブラリ 基準、そこに提供された仕様にある程度準拠しています。

POSIX正式名称(最新バージョン)はPOSIX.1-2017IEEE規格1003.1-2017オープングループ技術標準基本仕様、7号。仕様は、printf(..)「仕様に応じて」作業する方法に関する「正式な」規則を提供します。

  • POSIX.1-2017仕様ホームページ
    • POSIX.1-2017 - 「システムインターフェース」ボリューム
      • POSIX.1-2017 - dprintf、fprintf、printf、snprintf、sprintf - 印刷形式の出力

        [...]このリファレンスページに記載されている機能はISO C規格に準拠しています。ここで説明されている要件とISO C規格の間の競合は意図的なものではありません。このボリュームPOSIX.1-2017はISO C規格に準拠しています。。 [...]
        [...] printf() 関数は、標準出力ストリーム stdout に出力を配置する必要があります。
        [...] これらの各関数は、書式制御に従って引数を変換し、書式を指定して印刷します。形式は、初期移動状態(存在する場合)で始まり終わる文字列です。形式は、ゼロ個以上の命令、つまり一般文字(単に出力ストリームにコピーされる)と変換仕様(それぞれゼロ個以上の引数を得るようにする)で構成されます。型パラメータが十分でない場合、結果は定義されません。型が使い果たされて引数がまだ存在する場合は、超過引数を評価する必要がありますが、そうでない場合は無視されます。 [...]
        [...] % 形式の変換仕様を含む形式文字列では、各変換仕様は引数リストで未使用の最初のパラメータを使用します。 [...]
        [...] 各変換仕様は '%'文字[...]の後に次の順序が続きます。 [...]適用する変換の種類を表す変換指定子文字。 [...]
        変換指定子とその意味は次のとおりです。
        D,i:int 引数は、"[-]dddd" スタイルの符号付き 10 進数に変換する必要があります。精度は、発生する最小桁数を指定します。変換する値が少ない桁数で表示できる場合は、前にゼロを付けて拡張する必要があります。デフォルトの精度は1です。明示的な精度0を使用して0を変換した結果は、文字ではありません。
        [...]
        S:引数は文字配列へのポインタでなければなりません。配列のバイトは、終了ヌルバイトを含めて作成されます(含まれていません)。精度が指定されている場合、書き込まれたバイト数はこの数を超えることはできません。精度が指定されていない場合、または配列サイズより大きい場合、アプリケーションは配列にNULLバイトが含まれていることを確認する必要があります。
        [...]

明らかに、定義を完全に探求するために、次のステップは、正式に指定された「ISO C標準」(「ANSI C」とも呼ばれる)の適切な改訂版を調べることです。ISO/IEC 9899、例えば改訂版ではISO/IEC 9899:2018、また〜として知られるC17。 ISO C規格の改訂に関する公式の完全な仕様を見つけることはそれほど簡単ではありません。このStackOverflowの質問に示すように

しかし、「Bashの組み込みprintfフォーマットオプション」が何を意味し、よりエキゾチックなバリエーションで実際に機能するのかを理解するためには、複数の階層の実装、抽象化、および仕様を探索する必要があるかもしれません。

同等の重要性

これらのソフトウェアのバージョンによって、利用可能なオプションが異なる場合があり、既存のオプションの意味が変わる可能性があります。最善の方法は、使用しているバージョンと一致する手動バージョンを参照することです。例えば GNU Cライブラリリファレンスマニュアルバージョン管理手動ビルドを提供

関連情報