Можно ли в zsh (или любой другой оболочке) определить псевдонимы, чувствительные к каталогу?

Вы можете насчитать столько раз, сколько потребуется, чтобы подняться вверх по дереву процессов, пока не найдете лидера сеанса. Как с 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 не гарантирует, что он будет лидером сеанса.

1
05.07.2017, 18:39
1 ответ

Вы можете создать функцию или скрипт для проверки некоторого файла в текущем каталоге и изменения поведения на основе этого:

l() {
    if [ -f./.ls-literal-quote ] ; then
         ls --quoting-style=literal "$@"
    else
         ls --sort=extension "$@"
    fi
}

Нечто подобное позволит вам хранить конфигурацию в самом каталоге, а не в каком-то централизованном месте, если вы этого хотите.

Это требует захламления задействованных каталогов дополнительными файлами, но вы можете обойти это, используя расширенные атрибуты (, если ваша система поддерживает это ).

4
27.01.2020, 23:13

Теги

Похожие вопросы