man printf
、info 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 printf
man 3 strftime
文書には、単に「文字列の場合は%s、数字の場合は%d」はリストされていません。私はあなたが最初に要求したものが次のようになると思います。変換仕様。
答え2
私が見つけた最高のリソースは次のとおりです。bash-hackers.org wikiBashに関連するすべて。これはナビゲートしにくいコンテンツではなく、マニュアルページの外観です。
以下を含む特定のテーマが組み込まれています。printf
。このページは非常に詳細です!これには、すべての書式設定オプションと例と下部のディスカッションセクションも含まれており、極端なケースと機能printf
の微妙な違いを具体化するのに役立ちます。
私も書いてあげるprintf の GNU Coreutils ドキュメント、特にページフォーマットオプション、もしあれば。
答え3
まず、printf
次の3つの亜種を区別することが重要です。
printf
カーニバルとして組み込み。printf
(Bash-) 外部実行ファイルとして、例えばコアツール/usr/bin/printf
(which 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ライブラリリファレンスマニュアル - 12.12フォーマットされた出力
- GNU C ライブラリリファレンスマニュアル - 12.12.1 フォーマットされた出力の基本
- GNU C ライブラリリファレンスマニュアル - 12.12.3 出力変換テーブル
'
%d
'、'%i
':整数を符号付き10進数で印刷します。バラより整数変換、もっと学ぶ。 [...]
'%s
':文字列を印刷します。バラよりその他の出力変換。 [...] - GNU Cライブラリリファレンスマニュアル - 12.12.4整数変換
'
%d
' と '%i
' 変換仕様はどちらも int 引数を符号付き 10 進数で出力します。 - GNU C ライブラリリファレンスマニュアル - 12.12.6 その他の出力変換
'
%s
' 変換は文字列を出力します。 ''修飾子がない場合、l
そのパラメータは型でなければなりませんchar * (or const char *)
。 [...] - GNU C ライブラリリファレンスマニュアル - 12.12.7 フォーマットされた出力関数
機能: int printf(const char *template, ...) [...]
ついに:GNU Cライブラリ(また)一つである実装する~のC POSIXライブラリ 基準、そこに提供された仕様にある程度準拠しています。
POSIX正式名称(最新バージョン)はPOSIX.1-2017とIEEE規格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バイトが含まれていることを確認する必要があります。
[...]
- POSIX.1-2017 - dprintf、fprintf、printf、snprintf、sprintf - 印刷形式の出力
- POSIX.1-2017 - 「システムインターフェース」ボリューム
明らかに、定義を完全に探求するために、次のステップは、正式に指定された「ISO C標準」(「ANSI C」とも呼ばれる)の適切な改訂版を調べることです。ISO/IEC 9899、例えば改訂版ではISO/IEC 9899:2018、また〜として知られるC17。 ISO C規格の改訂に関する公式の完全な仕様を見つけることはそれほど簡単ではありません。このStackOverflowの質問に示すように。
しかし、「Bashの組み込みprintf
フォーマットオプション」が何を意味し、よりエキゾチックなバリエーションで実際に機能するのかを理解するためには、複数の階層の実装、抽象化、および仕様を探索する必要があるかもしれません。
同等の重要性
これらのソフトウェアのバージョンによって、利用可能なオプションが異なる場合があり、既存のオプションの意味が変わる可能性があります。最善の方法は、使用しているバージョンと一致する手動バージョンを参照することです。例えば GNU Cライブラリリファレンスマニュアルバージョン管理手動ビルドを提供。