POSIX

POSIX

Vidar Holenのブログ投稿からddの無駄な使用dd彼はすべてがファイルであり、ファイルをパイプで接続できるため、事実上役に立たないと主張しました。

を使用している場合もよく見られますcat

しかし、Vidalは次の例を提示しました。

# Rip a cdrom to a .iso file
cat /dev/cdrom > myfile.iso

...これが可能かどうか知りたいです。使用しないでくださいcat

明らかに、POSIXシェルは最初の文字セットがコマンド(つまり「[」= "test"など)であると仮定していますが、これは内部演算子を持つ現代言語では一般的ではありません。そして、シェルは実際にcatインタプリタなのですが、なぜ両方とも重複するポイントに達していませんかdd

/dev/cdrom > myfile.isoデバイスからファイルにデータをコピーするのに十分な内部演算子を完全に実装するPOSIXベースのシェルはありますか?

または

POSIX仕様にこの機能を無効にする何かがありますか?

この質問は、例の始めに内部演算子の代わりにコマンド( "<")を使用するという点でUUOC質問とは少し異なります。したがって、最初の単語がコマンドであるという規則にまだ固執します。

(しかし、私は個人的にddが好きです。なぜなら、それがなければウェールズ語を話すのははるかに面白くないからです。:-p)

答え1

ジシュ語:

</dev/cdrom >myfile.iso

演算子は、これを実行するためにのみ使用されます(shシミュレーションでない場合)。ただし、実際の読み取りと書き込みを実行するには、まだ$NULLCMDコマンド(catデフォルト)を実行します。


提案された構文

/dev/cdrom > myfile.iso

実際に動作しますすべてのPOSIXシェルで - 必ずしもシェルをまったく含める必要はないからです。

必要なのは/dev/cdrom実行可能で、実行時にCDの内容を出力するだけです。これはカーネルまたはデバイスドライバが提供できるものです。または、システムexecl(および友達)これ/dev/cdromまたはその内容をブートキーとして使用できます。その他そのファイル名を持つ実行可能ファイル(例cat:)

どちらの場合も、適切なexec機能が提供されている/dev/cdromすべてのシェルでコマンドを実行できます。私は実際にこれを行うどのシステムも知りません。おそらく良い理由のためです。しかし、理論的には許され、可能です。


POSIX

POSIXでは、コマンドの最初の単語をコマンド名として扱う必要があります。コマンドを実行する方法を定義します。:

シェルは別のユーティリティ環境でこのユーティリティを実行する必要があります。これは、POSIX.1-2017システムインタフェースボリュームで定義されているexecl()関数を、コマンド名[...]で設定されたパスとarg0パラメータで呼び出すのと同じです。

execl() 関数が [ENOEXEC] エラーと同等のエラーで失敗した場合、シェルは [...] エラーメッセージを作成し、終了ステータス 126 を返す必要があります。

したがって、一貫性のあるシェルでは、ファイル内のデータを開いて印刷することはできません。ただし、シェルがPOSIX以外の拡張機能でこの動作をサポートできない特別な理由はありません。私はあなたが提案したフォーマットにかなりの欠点があると思いますが、zshのバージョンはほとんど大丈夫です。

関連情報