yashシェルのprintfが組み込みコマンドかどうかは少し混乱しています。

yashシェルのprintfが組み込みコマンドかどうかは少し混乱しています。

ハウジングには内蔵形yashがありprintfそのマニュアルによると

ただし、yashデフォルト設定されたシェルには次の内容が表示されます。

$ command -v printf
/usr/bin/printf
$ type printf
printf: a regular built-in at /usr/bin/printf

このシェルに組み込まれているものはありますかprintf?結果は、外部コマンドとしても使用できる、いわゆる組み込みユーティリティの場合も同様です。

比較のためにOpenBSD pdksh(ここでkshprintfいいえ内蔵):

$ command -v printf
/usr/bin/printf
$ type printf
printf is /usr/bin/printf

そしてbash(どのprintf はい内蔵):

$ command -v printf
printf
$ type printf
printf is a shell builtin

答え1

yashシェルするprintf組み込みバージョン(およびその他のユーティリティ)を持っていて使用してください。結果を定式化して注文するcommand -v方法で、POSIX規格に非常に賢明に準拠していますtype

ほとんどのコメントのように$PATH、POSIX標準では、実行するコマンドの組み込みバージョンの外部コマンドとして一般的な組み込みコマンドを使用できる必要があります。

これは標準の関連テキスト:

命令の検索と実行

単純なコマンドがコマンド名とオプションの引数のリストを生成する場合は、次のことを行う必要があります。

  1. コマンド名に<スラッシュ>文字が含まれていない場合は、最初の成功した手順を次の順序で実行する必要があります。

    • ㅏ。コマンド名が特別な組み込みユーティリティの名前と一致する場合は、特別な組み込みユーティリティを呼び出す必要があります。

      [...]

    • e.それ以外の場合は、XBD環境変数で説明されているように、PATH環境変数を使用してコマンドを取得する必要があります。
      • 私。検索が成功した場合:
        • ㅏ。システムがユーティリティを汎用組み込み関数またはシェル関数として実装している場合は、パス検索のこの時点で呼び出す必要があります。
        • b。それ以外の場合、シェルは別のユーティリティ環境でユーティリティを実行します。 [...]
          [...]
      • 2. 検索が失敗すると、コマンドは終了状態 127 で失敗し、シェルはエラー・メッセージを記録します。
  2. コマンド名に<スラッシュ>が1つ以上含まれている場合[...]

これは、コマンドの出力が次のことcommand -v printfを意味します。printf以前は検索パスにあり、追加されたコマンドの出力は一般的な組み込みtype printfコマンドです。

そのprintfコマンドは検索パスで見つけることができ、シェルに一般的な組み込みコマンドなので、yash組み込みバージョンが呼び出されるコマンド。のprintf場合いいえパスで見つかった場合、yashシェルがPOSIXに合った正しいモードで実行されると、エラーが生成されます。

yashこれはPOSIXと非常に互換性のあるシェルであることに誇りを持っています。これは私たちが見ていても真実です。POSIXが言ったことcommand -v:

-v

シェルが現在のシェルの実行環境で使用するパス名またはコマンドを表す文字列を標準出力に書き込みます。シェル実行環境)、呼び出されたがcommand_name呼び出されなかったcommand_name

  • 公共施設、一般的な組み込みユーティリティcommand_names文字<slash>、およびその変数を使用して見つかったすべての実装定義関数PATH(で説明されているように)命令の検索と実行)、絶対パス名で作成する必要があります。

答え2

Watanabeシェルには3つの組み込み機能があり、その詳細についてはマニュアルに記載されています。すべての組み込みコマンドもここにリストされていますが、次から始める必要があります。欠席コマンドが「特殊」または「半特殊」組み込みコマンドであることを示すすべての表示。一般的な組み込み機能は表示されません。

printfまさにこれらの「一般的な」組み込み機能です。ネイティブモードではいつもその名前の外部コマンドがあるかどうかに関係なく呼び出されます。

$パス=/usr/bin
$印刷機能
printf: このコマンドにはオペランドが必要です。
$活版印刷
printf: /usr/bin/printf の汎用組み込み関数
$
$パス=/
$印刷機能
printf: このコマンドにはオペランドが必要です。
$活版印刷
printf:一般的な組み込み関数($ PATHにはありません)
$

ただし、posixly-correctシェルオプションを設定するときPATH

$--posixly-正しい設定
$
$パス=/usr/bin
$印刷機能
printf: このコマンドにはオペランドが必要です。
$
$パス=/
$印刷機能
yash: 'printf'のようなコマンドはありません
$

これは実際にはSingle Unix仕様の要件であり、少なくとも1997年から存在してきました。

これは Z シェル、93 Korn シェル、Bourne Again シェル、Debian Almquist シェルとは異なります。たとえば、Z シェルは一般的な組み込みコマンドを記録します。いつも確立された,今後検索ステップPATH。 Debian Almquist シェルの場合も同様です。これがshオープンなPOSIXオプションで呼び出された場合でも、これらのシェルが実行するアクションです。

%/bin/exec -a sh zsh -c "PATH=/ ; printf 入力 ; printf"
printf はシェル組み込み関数です。
zsh:printf:1: パラメータが不足している
%/bin/exec -a sh ksh93 -c "PATH=/ ; printf 入力 ; printf"
printf はシェル組み込み関数です。
使用法:printf [オプション]型[文字列...]
%/bin/exec -a sh bash --posix -c "PATH=/ printf 入力; printf"
printf はシェル組み込み関数です。
printf: 使用法: printf [-v var] 形式 [パラメータ]
%/bin/exec -a sh ダッシュ -c "PATH=/ ; printf 入力 ; printf"
printf はシェル組み込み関数です。
sh: 1: printf: 使用法: printf 形式 [arg ...]
%

ただし、PD Korn シェル、Heirloom Bourne シェル、MirBSD Korn シェルの動作はprintf最初にPATH組み込まれていないため、存在しない場合は実行されません。printf

%/bin/exec -a sh `コマンド -v ksh` -c "PATH=/ ; printf 入力 ; printf"
printfが見つかりません
sh: printf: 見つかりません
%/bin/exec -a sh `コマンド -v oksh` -c "PATH=/ ; printf 入力 ; printf"
printfが見つかりません
sh: printf: 見つかりません
%/bin/exec -a sh `コマンド -v jsh` -c "PATH=/ ; printf 入力 ; printf"
printfが見つかりません
sh: printf: 見つかりません
%/bin/exec -a sh mksh -c "PATH=/ ; printf 入力 ; printf"
printfが見つかりません
sh: printf: 見つかりません
%ksh -c "p​​rintfと入力してprintf"
printf は /usr/bin/printf のトレースエイリアスです。
使用法:printf形式[パラメータ...]
%oksh -c "p​​rintf 入力; printf"
printf は /usr/bin/printf のトレースエイリアスです。
使用法:printf形式[パラメータ...]
%jsh -c "p​​rintf 入力; printf"
printfがハッシュされました(/usr/bin/printf)。
使用法:printf形式[パラメータ...]
%mksh -c "p​​rintfを入力してください; printf"
printf は /usr/bin/printf のトレースエイリアスです。
使用法:printf形式[パラメータ...]
$

関連情報