これがbash -cがすることです。「録音してますか?

これがbash -cがすることです。「録音してますか?

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や他の広く使用されているプロジェクトのほとんどは、インプレッションに必要と考えられるものだけを含む安定した明確に定義された外部インターフェースを維持し、必要に応じて内部実装を進めることに焦点を当てています。このアプローチは、革新と改善能力を犠牲にすることなく、ソフトウェアが強力で安全で効率的な状態を維持することを保証します。

したがって、あなたの質問に答える場合は、いいえ。これは文書化されていないため、これに依存してはいけません。内部制約を追加すると開発がさらに制限されるため、これらの状況や他の同様の状況が文書化される可能性もほとんどありません。

関連情報