1つのコマンドが別のコマンド内で使用されます

1つのコマンドが別のコマンド内で使用されます

djvused コマンドには次のオプションがあります。

-e コマンド

djv はオプション引数コマンドで指定されたコマンドを実行するために使用されます。不要なシェル拡張を防ぐために、djvusedコマンドを一重引用符で囲むことをお勧めします。

たとえば、djvused myfile.djvu -e 'print-pure-txt'

私にとって珍しいことは、1つのコマンド(ここではdjvused)が別のコマンド(-eここではオプション)を実行できることです。これがどのように可能か疑問に思います。これはコマンドラインインターフェイスで一般的な慣行ですか?

これはawkコマンドで使用されている印刷コマンドと似ていますか?

私が知っている1つのコマンドが別のコマンド内で使用される唯一の方法は次のとおりです。

echo `echo hello`

ありがとうございます!

答え1

これは非常に一般的であり、一部のプログラムはこの方法でのみ機能します。

心に浮かぶより一般的な例は次suのとおりです。sudoxterm

su -c 'ls -l /root'
sudo ls -l root
xterm -e 'top -d 10'

あなたの例とは異なります

echo `echo hello`

バックティックはシェルによって解釈され、プログラム自体は何もしません。

suまた、との違いに注意してくださいsudo。 1つ目は、拡張変数など、ユーザーの観点から設定するのが難しい文字列を使用します。今後コマンドで確認できます。 2番目のコマンドは一連の文字列で、はるかに簡単です(例には引用符はありませんsudo)。

内部タスクを実装するために何を使用しますか?デフォルトでは、systemライブラリルーチンとシステムコールexecの2つの方法があります。最初はシェルを呼び出し、次のようなさまざまなシェル拡張を許可します。

su -c 'ls -ld /root/.*'

第2のアプローチは、この自由を許さない。

答え2

バックティックは入れ子になりにくく、他のフォントのアポストロフィと容易に区別されないため、使用されなくなりました。

代わりに$(cmd)を使用してください。これは簡単です。

echo $(echo $(echo $(echo $(echo $(echo hello)))))

はい、ほとんど使用されていなくても頻繁に必要な機能です。

しかし、コマンドを処理しても必ずしも自分自身を再度呼び出すわけではない多数のプログラムがあります。

  • もちろん、シェルはbash, dash, zshそれが好きです。
  • すべてのスクリプト可能な言語(例:scala, haskell, ruby, python, lua, perl, php, ...
  • より具体的な言語、例:bc, r, ...
  • SQLインタフェースは次のとおりです。psql -c "SELECT foo FROM bar" sampledb
  • リモートシェルなどssh, telnet, ...

答え3

最高のVimテキストエディタである古いviには、次の機能があります。

カーソルが空行にあり、!)date と入力すると、コマンドの出力がdate空行に配置されます。

私は、タイムスタンプが表示されたアイテムを取得するためにメモでいっぱいのファイルまたはタスクリストに追加するときに、この小さな順序を使用します。

Vimでは、テキスト段落の最初の行にカーソルを置き、Vを押してからjを使用して、段落の最後の行に一度に1行ずつ下に移動できます。 !fmt をクリックし、テキストの書式を 80 未満の行と列で指定します。 Vimはマーカーを強調表示しますが、古いviバージョンの一般的なトリックであるバリアントはマーカーのみを強調表示します: 'a,'b!fmt

より技術的な問題は、さまざまな方法で処理できます。 C標準ライブラリ呼び出しは、system(3)外部コマンドを実行する一般的な方法です。その標準ライブラリ呼び出しは、実行したい操作にあまりにも多くの仮定を課す可能性があります。この場合、システムfork(2)コールを使用してファイル記述子などを変更する新しいプロセスをインポートし、システムコールを呼び出してexecve(2)カーネルを生成します。別の実行可能ファイルを新しいプロセスのアドレス空間にロードします。

これは、他のコマンドと一緒に再利用できるため、コマンドラインプログラムで比較的一般的に行われます。

関連情報