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のバージョンはほとんど大丈夫です。