20以上のサーバーのリストがあり、それらが使用するシェルを取得したいと思います。サーバーにログインしたら、次のコマンドを実行できます。
$ ps -p $$
PID TTY TIME CMD
12022 pts/6 00:00:00 bash
各サーバーに触れるのではなく、リストで繰り返してみました。
$ for i in `cat servlist`; do echo $i ; ssh $i ps -p $$ ; done
serv1
PID TTY TIME CMD
serv2
PID TTY TIME CMD
serv3
PID TTY TIME CMD
これを繰り返すと、予想される出力は表示されません。その後、単一のサーバーでSSH経由でコマンドを実行しようとしましたが、同じエラーが発生しました。
$ ssh serv4 ps -p $$
PID TTY TIME CMD
SSHのマニュアルページには、なぜこれが起こるのかを考えさせるものはありません。
答え1
その理由は、プロセスが存在しないからです。
ローカルに評価されており$$
、すべてのサーバーが同じ番号を渡します。現在サーバーで使用されているPID以外の番号。
すべては$
コマンドではなくシェルによって行われます。サーバーのシェルがそれを評価できるようにエスケープする必要があります。
努力する\$\$
例えば
for i in $(cat servlist); do echo $i; ssh $i 'ps -p $$'; done
未テスト