たとえば、\c
書式は機能しません。これをbashコンソールに入力しましたが、printf "ABC\ctest"
結果は次のようになります。
ABC\ctest
\c
型の属性を考慮すると、予想される出力はですABC
。
また、bashでのprintfコマンドの使用を詳しく説明する正しいソースが見つかりませんでした。また、上記の例に示すように、printf コマンドに指定されたマニュアルページの属性が正しく機能しません。
printf コマンドを詳しく説明する bash ソースコードを表示します。なぜなら私は今混乱しています。
答え1
printf 'ABC\ctest'
コマンドの指定されていない部分の1つを見つけましたがprintf
、その動作は実装ごとに異なります。あなたはそれを\c
間違った場所に置いた。
読んだらこれシングル Unix 仕様説明printf
\c
注意深く見ると、フォーマット文字列(コマンドの最初の引数)に定義されているエスケープシーケンスのリストにはリストされていないことがわかります。代わりに、次のように定義されます。追加与えられたときに認識されるエスケープシーケンスパラメータ文字列からただフォーマットするだけです。%b
書式指定子を介して。
言い換えれば:
printf '%b\n' 'ABC\ctest'
明らかな行動があります。これにより、\c
書式文字列の改行を含む残りのすべての項目は無視されます。printf '%s\n' 'ABC\ctest'
明らかな行動があります。\c
まず、これはエスケープシーケンスではありません。printf '\c'
明確に指定された動作はありません。これステンレス鋼実際に何が起こっているのかについては沈黙し\c
、エスケープシーケンスでリストしたり内容に明示しません。ファイル形式表記これらのシーケンスの一部はエスケープシーケンスではありません。
これらの形式化されていない文字列に対するさまざまなシェルの動作は非常に多様です。以下は、Debian Almquist、Bourne Again、FreeBSD Almquist、Korn '93、およびZ shell'の反応です(ここで、%
sは改行が発生しない場所を示します)。
%ダッシュ -c "printf'ABC\ctest\n'" ABC\ctest %bash -c "printf 'ABC\ctest\n'" ABC\ctest %sh -c "printf 'ABC\ctest\n'" アルファベット% %ksh93 -c "printf 'ABC\ctest\n'" ABCest %zsh -c "printf 'ABC\ctest\n'" アルファベット% %
printf
私のバージョンのMirBSD KornとPD Kornシェルには組み込みコマンドはありません。組み込みのFreeBSDはprintf
次のことを行います。
%/usr/bin/printf 'ABC\ctest\n' アルファベット% %
もっと興味深いのは、さまざまなシェルの文書が時々非常に誤解を招くことがあり、時には完全に間違っていることもあるということです。いくつかの例:
- Zシェルドコ
\c
私は最近、その意味の適切な説明を提供し、echo
フォーマット文字列で許可されているエスケープシーケンスとして(doco for経由で)リストを始めました。 (これは間違っています。2017年まで、docoも同意しませんステンレス鋼Zシェルが実際に何をしているかについての説明はありません。 ) - Korn '93 shell doco matchが提供する説明ステンレス鋼
\c
ただし、これは(上記のように)フォーマット指定子で実際に実行される操作ではありません。また、\c
フォーマット文字列のエスケープシーケンスとして文書化されています。その動作は明らかにバグです。 - Bourne Again シェルドコそしてDebian Almquist シェル doco
\c
試合の説明をしてくださいステンレス鋼明示的にリストします%b
(Bourne Againシェルの場合、これよりもはっきりしています)。2016年基準)といいえprintf
書式指定子のエスケープシーケンスの一般的なリストです。これらのシェルはこの拡張を標準として提供していません。 - FreeBSD Almquist シェル docoFreeBSD 外部
printf
コマンドマニュアルを参照してください。説明は\c
次のとおりです。ステンレス鋼。書式文字列に許可されているエスケープシーケンスとして明示的にリストされ、実際の動作はユーザーマニュアルに記載されています。
FreeBSD Almquistシェルと(最近の)Zシェルは、両方の文書がフォーマット文字列\c
(標準定義拡張)でエスケープシーケンスとして受け入れる唯一のシェルです。そして実際に文書化されているようにしてください。
冷笑的な追加の読書
答え2
そのパラメータでバックスラッシュエスケープシーケンスを拡張する必要があります。で述べたようにここ:
\c Terminate output similarly to the \c escape used by echo -e. printf produces no additional output after coming across a \c escape in a %b argument.
$ printf "%b\n" "ABC\chi"
ABC