ssh-agent に、サブコマンドを指示する引数を付けた場合の挙動について
ssh-agent には次のようにして、サブコマンドを指示する引数を付ける起動法があります。
ssh-agent cmd
たとえば ssh-agent bash のようにして、エージェント配下の環境を引き継ぐために使うものですが、man ssh-agent を読むと、その際の挙動について、次のようにあります。
If a command line is given, this is executed as a subprocess of the agent. When the command dies, so does the agent.
そのまま素直に読めば ssh-agent が親プロセスとなり、子プロセスの側で引数として名前を与えたものを exec する、という意味に読めます*1……が、実際にやってみると、逆であることがわかります。
以下は私の手元の FreeBSD で、試してみた一例ですが(ps コマンドの結果から見つけやすくするため、起動するコマンドは csh にしています)、
$ exec ssh-agent csh % ps axd PID TT STAT TIME COMMAND 0 - DLs 4:16.86 [kernel] 1 - ILs 0:00.08 - /sbin/init -- 121 - Is 0:00.01 |-- adjkerntz -i (略) 73430 v0 R 0:00.63 |-- mlterm 73431 15 Ss 0:00.08 | `-- csh 73445 - Ss 0:00.00 | |-- ssh-agent csh 73910 15 R+ 0:00.01 | |-- ps axd 73911 15 S+ 0:00.01 | `-- less
というように、親プロセスのほうが引数として与えたほうを exec していて、ssh-agent は子プロセスの側に、つまり、それ以降にこのシェルから実行されるプロセスから見ると、きょうだいプロセスの位置にあります。
実装の変更にドキュメントが追随していないだけか、とも思ったのですが、どうも最初からのようです。
もうちょっと調査したら、OpenSSH プロジェクトに報告するつもりで……いたのですが、だいぶ放置してしまっています。どこにもアウトプットしてなかったので、ここに置いておきます。
*1:記憶にある限り、既存の解説書などの図でも、全てそのようになっています。