Я использовал Mac OS 10.7 Lion, но я думаю, что это будет довольно переносимо для Bourne-подобных оболочек в других Unix-подобных системах. У вас могут возникнуть проблемы с ключевым словом command в аргументе ps.
Я поместил следующий код в файл с именем procsup.sh, который определяет функцию оболочки, которая следует за родителями процесса до идентификатора процесса 1. (Я часто нахожу, что с функциями оболочки легче работать, чем с псевдонимами).
procsup()
{
leaf=$$
ps -eo pid,ppid,command | awk -v leaf="$leaf" \
'{parent[$1]=$2;command[$1]=$3;}
function print_ancestry(pid)
{
print pid " (" command[pid] ") child of " parent[pid];
if(pid!=1) print_ancestry(parent[pid])
};
END{\
print_ancestry(leaf)
}'
}
Затем я запустил оболочку и загрузил procsup.sh. В реальной жизни вы гарантируете, что ваши новые оболочки будут автоматически загружать procsup.sh при запуске, возможно, в ваш личный .bashrc. Сначала я проверил родословную этой оболочки. Затем я запустил vi из этой оболочки. Как обычно, взаимодействие с vi не дошло до расшифровки, пока я не сделал :shell
. Окно моего терминала выглядело так:
Mariel:~/Library/Scripts 1j david$
Mariel:~/Library/Scripts 1j david$
Mariel:~/Library/Scripts 1j david$ . procsup.sh
Mariel:~/Library/Scripts 1j david$ procsup
41926 (-bash) child of 41922
41922 (login) child of 41917
41917 (/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal) child of 19281
19281 (/sbin/launchd) child of 1
1 (/sbin/launchd) child of 0
Mariel:~/Library/Scripts 1j david$
Mariel:~/Library/Scripts 1j david$
Mariel:~/Library/Scripts 1j david$ vi
bash-3.2$ # Have just done :shell.
bash-3.2$ . procsup.sh
bash-3.2$ procsup
42325 (/bin/bash) child of 42324
42324 (vi) child of 41926
41926 (-bash) child of 41922
41922 (login) child of 41917
41917 (/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal) child of 19281
19281 (/sbin/launchd) child of 1
1 (/sbin/launchd) child of 0
bash-3.2$
bash-3.2$