bash -c "COMMAND"
(少なくとも一般的なLinuxバージョンでは)実行するときに何のコマンドもなくコマンドがあることが知られています。メタ文字(とは別にスペース、商標または新しいチーム)、bash -c
プロセスは分岐せず、自己最適化の代わりにシステムコールの実行をCOMMAND
直接使用するため、結果は1つのプロセスのみになります。execve
$ pid=$$; bash -c "pstree -p $pid"
bash(5285)───pstree(14314)
メタ文字(リダイレクトなど)がある場合、または複数のコマンド(いずれにせよ1つのメタ文字が必要です)がある場合は、bash
実行されるすべてのコマンドが分岐します。
$ pid=$$; bash -c ":; pstree -p $pid"
bash(5285)───bash(28769)───pstree(28770)
$ pid=$$; bash -c "pstree -p $pid 2>/dev/null"
bash(5285)───bash(14403)───pstree(14404)
これは文書化されていない最適化機能ですか(つまり保証されていません)、またはどこかに文書化され保証されていますか?
メモ:すべてのバージョンがこのように動作するわけではなく、一部のバージョンでは保証ではなく実装の詳細と見なされますが、少なくとも一部のバージョンがこれを明示的にサポートし、その条件を文書化したかどうかをbash
知りたいです。bash
たとえば、;
コマンドの後に2番目のコマンドがない文字が続く場合でも、bash
分岐execve
しません。
$ pid=$$; bash -c "pstree -p $pid ; "
bash(17516)───pstree(17658)
私の質問の背景
前述のように、これらの動作は経験豊富なユーザー1 2bash
によく知られており、長い間慣れていました。
ある日、次のコメントを見ました。対話型bashシェル:コマンドラインオプションを使用して作業ディレクトリを設定する@dave_thompson_085が書いたところ:
bash
最後の(または唯一の)コマンドを自動的に実行(つまり自分自身を置き換えます)します-c
。
私はコマンドが1つだけの場合にのみ当てはまると答えました。でも気になりました。bash
最後のコマンドがどこにあるかについてのバージョンはありますか?はい exec
以前に別のコマンドがあっても、edで分岐しませんでしたか?通常、この動作は保証されますか?一部のbash
バージョンでは、ソースコードの外側にこの機能を公開(および詳細)しますか?
その他参考資料
答え1
使い方exec
は実装の詳細です。文書化されていない場合、すべてのリリースで動作は保証されません。広く使用されている他のソフトウェア(Linuxカーネル)を開発した私の経験に基づいて、私たちがこれらのことを文書化しない傾向がある理由を少し見直すことが役に立ちます。
一般的に広く使用されているソフトウェアでは、通常、そのソフトウェアの機能、動作、および標準動作のみを説明しようとします。人々は、その動作に対する下流の依存関係を作成することを恐れて、内部最適化の詳細を調べることを避けることがよくあります。
私がカーネルメモリ管理作業をしている私の仕事の分野の例では、リサイクル優先順位の内部がどのように機能するか、LRUスキャンなどの作業が行われる時期を詳細に文書化しようとしません。これを文書化すると、最適化やその他の変更に対する将来の決定が複雑になります。これは、目に見えず、未知のダウンストリーム依存関係が破損しているかどうかを考慮する必要があるためです。
同様に、bashまたは他の複雑なソフトウェアシステムでは、内部メカニズム(たとえば、exec
新しいプロセスをフォークするのではなく使用することを決定)が短期間で変更されることがあります。突然、execを使用する必要がない新しいパフォーマンスの最適化、セキュリティの考慮事項、または互換性の問題があると想像してください。私たちはこのように運営し続けるために本当に契約に縛られていることを望みますか?当然じゃない。
Bashや他の広く使用されているプロジェクトのほとんどは、インプレッションに必要と考えられるものだけを含む安定した明確に定義された外部インターフェースを維持し、必要に応じて内部実装を進めることに焦点を当てています。このアプローチは、革新と改善能力を犠牲にすることなく、ソフトウェアが強力で安全で効率的な状態を維持することを保証します。
したがって、あなたの質問に答える場合は、いいえ。これは文書化されていないため、これに依存してはいけません。内部制約を追加すると開発がさらに制限されるため、これらの状況や他の同様の状況が文書化される可能性もほとんどありません。