cp -RのPOSIX記述

cp -RのPOSIX記述

cp -Rbashコマンドの実行方法とbashコマンドの実行方法は本当に混乱しています。POSIXの言葉はどうなりますか?

posixの定義を考えると、cp -R srcDir existingDestDir結果は次のようになります。コンテンツ代わりに、shのbashとcshの実装はそれを既存のDestDirにコピーしますsrcDirexistingDestDirsrcDir

posix cp -R定義の関連部分:

各 source_file に対して次の手順を実行する必要があります。

(...)

2. source_fileがディレクトリタイプの場合は、次の手順を実行する必要があります。

(...)

F. source_fileディレクトリ内のファイルは、ここにリストされている4つのステップ(1〜4)に従って、そのファイルをsource_filesとして使用してdest_fileディレクトリにコピーする必要があります。

誰もが私のためにこの問題を解決できればとても感謝します。

答え1

POSIXドキュメントで追加の段落を見逃しました。

3番目の要約形式(cp -R [-H|-L|-P] [-fip] source_file... target)は、-Rオプションを指定した2つ以上のオペランドで表されます。 cpユーティリティは、各source_fileのファイル階層内の各ファイルを次の名前の宛先パスにコピーする必要があります。

  • targetが存在し、既存のディレクトリの名前を指定する場合、ファイル階層内の各ファイルに対応するターゲットパス名は、target、単一<slash>文字(targetで終わらない場合<slash>)、およびそのディレクトリへのファイルパス名の関連付けでなければなりません。 。 source_fileを含むディレクトリ。

あなたの場合

cp -R srcDir existingDestDir

「source_file」はsrcDir、「target」はですexistingDestDir。その段落で、「ファイル階層内の各ファイルのターゲットパス」は、表示されるexistingDestDir/srcDir動作を説明します。

答え2

明確にする必要があるいくつかの点があります。

  • cpスタンドアロンユーティリティですbash。一部の人々は、次の組み込みコマンドによって混乱を招く可能性があります。cdそしてpwdこれは POSIX シェルまたはその一部である可能性があります。
  • POSIXは以下を指します。シリーズドキュメントThe Open GroupとIEEEが共同で管理し、IEEE標準1003.1™
  • bashPOSIXで説明されている機能を実装するいくつかのシェルの1つ。ほとんどのシェルはPOSIXシェルとは少し違いがあります。sh;シェルが実行される名前は、POSIXで説明されている機能です。
  • このセクションの2.14.特殊組み込みユーティリティ、POSIXは言います。

用語「内蔵」これは、シェルがユーティリティを検索せずに直接実行できることを意味します。実装では、以下を使用することを選択できます。どの組み込みユーティリティ。ただし、ここで説明する特殊な組み込みユーティリティは、2つの点で一般的な組み込みユーティリティとは異なります。

だから原則としてcp できるbash開発者が選択すると、その一部になることができます。bash実際には、うまく機能する機能を追加して作業をより複雑にする必要がないため、これは行われません。それぞれからbash

次に、質問に記載されているリンクはに基づいてPOSIXではそうではありません。これPOSIXドキュメント。最後に免責事項を見ることができます。

部分 このテキストの再印刷と再印刷...

そして

このページに表示される印刷エラーまたはフォーマットエラーは、ソースファイルをマニュアルページフォーマットに変換中に発生した可能性があります。

しかし、マニュアルページのほとんどはPOSIXからそのままコピーされました。 POSIXドキュメントは、作成者が既存の実装が異なることを知っている部分を詳しく説明せず、実装内部の詳細が異なる可能性があると考える部分を詳細に説明しないコンプライアンススタイルで書かれています。したがって、プログラムが実行した操作の段階的な説明が提供され、さまざまな手順がどのように関連しているかを説明するために他の作成者によって追加された詳細は(通常)省略されます。一部のPOSIX文書はセクションを提供します。基本的なしかし、これらでさえ少数に属するようです。結果はあいまいなことが多いですが、既存のプログラムの共通特性を説明する意図を考慮する必要があります。

これは混乱を示す質問の特定の部分です。

posixの定義を考えるとcp -R srcDir 既存の宛先ディレクトリその結果、内容ソースディレクトリにコピーされます既存の宛先ディレクトリ。代わりにソースディレクトリにコピーされます既存の宛先ディレクトリshのbashとcshの実装で。

文書の要旨目次ソースでも、次の同じ繰り返しおよび再帰記述を使用して処理されます。ノーマル文書。ルールの1つが説明されています。要約部分:

cp -R [-H|-L|-P] [-fip] source_file... target

-Rこれは3番目の例であり、このオプションが言及されている唯一の例です。これについては後で述べます。説明する:

これ第三ダイジェスト形式は、-R オプションを指定した 2 つ以上のオペランドで表されます。これcpユーティリティーは、各 source_file のファイル階層内の各ファイルを次の名前の宛先パスにコピーする必要があります。

  • もしターゲット存在と名前既存のディレクトリ、ファイル階層内の各ファイルに対応する宛先パスの名前は、以下を連結する必要があります。ターゲット、単一<slash>文字の場合ターゲットaで終わらず、含まれている<slash>ディレクトリに対するファイルのパス名。ソースファイル

  • もしターゲット存在せず、2つのオペランドが指定されている場合、対応する宛先パス名は次のようになります。ソースファイルしなければならないターゲット;ファイル階層の他のすべてのファイルの対応するターゲットパスの名前は、次のように関連付ける必要があります。ターゲット<slash>文字、ファイルへの相対パス名ソースファイル

つまり、ディレクトリ名は最初の箇条書きエントリで「ファイル」として扱われ、宛先ディレクトリ名に関連付けられます。

追加資料:

GNU coreutils のマニュアルページには詳細な情報がありません。 Solaris のマニュアルページで POSIX ドキュメントのスタイルの一部を見ることができます。

/usr/bin/cp -r | -R [-H | -L | -P] [-fip@] source_dir... target

そして

3番目の要約フォームでは、次のように指定された1つ以上のディレクトリソースディレクトリ宛先が指定したディレクトリにコピーします。または、いずれかを指定する必要があります-r-Rそれぞれソースディレクトリcpすべてのファイルとサブディレクトリをコピーします。

関連情報