Вы можете насчитать столько раз, сколько потребуется, чтобы подняться вверх по дереву процессов, пока не найдете лидера сеанса. Как с zsh
в Linux:
lvl() {
local n=0 pid=$$ buf
until
IFS= read -rd '' buf < /proc/$pid/stat
set -- ${(s: :)buf##*\)}
((pid == $4))
do
((n++))
pid=$2
done
echo $n
}
Или POSIXly (но менее эффективно):
lvl() (
unset IFS
pid=$$ n=0
until
set -- $(ps -o ppid= -o sid= -p "$pid")
[ "$pid" -eq "$2" ]
do
n=$((n + 1)) pid=$1
done
echo "$n"
)
Это дало бы 0 для оболочки, запущенной вашим эмулятором терминала или getty, и еще одну для каждого потомка.
Вам нужно сделать это только один раз при запуске. Например, с:
PS1="[$(lvl)]$PS1"
в вашем ~/.zshrc
или эквивалентном, чтобы иметь его в вашей подсказке.
tcsh
и несколько других оболочек (zsh
, ksh93
, fish
и bash
по крайней мере) поддерживают $SHLVL
переменная, которую они увеличивают при запуске (и уменьшают перед запуском другой команды с помощью exec
(если только exec
не находится в подоболочке, если они не глючат (но многие являются))). Это отслеживает только количество вложений shell, а не процессов. Также уровень 0 не гарантирует, что он будет лидером сеанса.
Вы можете создать функцию или скрипт для проверки некоторого файла в текущем каталоге и изменения поведения на основе этого:
l() {
if [ -f./.ls-literal-quote ] ; then
ls --quoting-style=literal "$@"
else
ls --sort=extension "$@"
fi
}
Нечто подобное позволит вам хранить конфигурацию в самом каталоге, а не в каком-то централизованном месте, если вы этого хотите.
Это требует захламления задействованных каталогов дополнительными файлами, но вы можете обойти это, используя расширенные атрибуты (, если ваша система поддерживает это ).