ksh: как захватить текущую вызванную команду и аргументы?

Вопрос или проблема

Как получить переменную с текущей командой и аргументами? Я хотел бы использовать escape-код, чтобы вывести это в строке заголовка Xterm.

Я вижу, что Terminal.app на MacOS каким-то образом определяет имя вызванной команды. Я нашел следующее решение для zsh, однако я ищу для ksh.

if [ "$SHELL" = '/usr/bin/zsh' ]
then
    case $TERM in
         rxvt|*term)
         precmd() { print -Pn "\e]0;%m:%~\a" }
         preexec () { print -Pn "\e]0;$1\a" }
         ;;
    esac
fi

Я читаю этот пост о использовании DEBUG trap в ksh, или автор комментария также упоминает, что “запуск фоновой задачи, которая регулярно проверяет вывод ps -o stat= -o args=, чтобы увидеть, какие процессы выполняются в фоне и какую команду они выполняют,” предпочтительнее. У кого-нибудь есть дополнительная информация об этом?

С ksh93:

set -o functrace
trap 'printf "\e]0;%s\a" "${.sh.command}" > /dev/tty' DEBUG
HOSTNAME=$(uname -n)
PS1=$'\e]0;$HOSTNAME:${PWD/#"$HOME"/\\~}\a\e[32m$HOSTNAME\e[m:\e[35m${PWD/#"$HOME"/\\~}\e[m$ '

Будет выполнять нечто подобное вашему коду для zsh: отображает простые команды, которые выполняются в заголовке, прямо перед их выполнением (для цепочек, он печатает только простые команды в правой компоненте), и при возвращении к приглашению hostname:current-directory (с заменой $HOME на ~).

Соответствующие разделы man страницы:

.sh.command
При обработке ловушки DEBUG эта переменная содержит текущую строку команды, которая будет выполнена. Значение такое же, как и вывод, сгенерированный опцией xtrace (за исключением предшествующего приглашения PS4).

functrace
Заставляет состояние опции -x и действие ловушки DEBUG наследоваться функциями, определенными с использованием ключевого слова function (см. раздел Функции выше), вместо сброса к значению по умолчанию. Изменения, сделанные в них внутри функции, не распространяются обратно в родительскую область. Аналогично, эта опция также заставляет действие ловушки DEBUG наследоваться дочерними shell.

Ответ или решение

Вопрос о том, как в ksh (KornShell) получить переменную с текущей командой и её аргументами и использовать её для отображения в заголовке окна Xterm, представляет интерес для администраторов и разработчиков, работающих в Unix-системах. KornShell, один из популярных шеллов, предлагает свои уникальные возможности, которые можно использовать для этого. Давайте разберемся, как можно решить эту задачу, начиная с теории, затем рассмотрим конкретный пример, и закончим приложением на практике.

Теория

ksh93 предоставляет мощные механизмы для обработки и выполнения команд. Одним из таких механизмов является ловушка DEBUG, которая позволяет перехватывать выполнение команд и получать информацию о командной строке перед её выполнением. Эта функция полезна для различных задач, таких как отладка или автоматизация процесса встраивания информации в заголовок окна терминала.

В ksh93 переменная .sh.command содержит текущую команду, которая собирается быть выполненной. Эта переменная особенно полезна в комбинации с DEBUG ловушкой, так как позволяет динамически изменять и управлять состоянием среды исполнения.

Другой важный элемент — это параметр оболочки PS1, который позволяет настроить приглашение командной строки и задавать такие элементы, как имя хоста, текущий рабочий каталог и т. д. Все это может быть отображено и в заголовке окна терминала Xterm с помощью управляющих последовательностей.

Пример

Рассмотрим небольшой пример, чтобы иллюстрировать вышеупомянутые концепции. Следующий скрипт демонстрирует, как можно настроить ksh для автоматического обновления заголовка окна Xterm текущей выполняемой командой:

set -o functrace
trap 'printf "\e]0;%s\a" "${.sh.command}" > /dev/tty' DEBUG
HOSTNAME=$(uname -n)
PS1=$'\e]0;$HOSTNAME:${PWD/#"$HOME"/\\~}\a\e[32m$HOSTNAME\e[m:\e[35m${PWD/#"$HOME"/\\~}\e[m$ '

Здесь:

  • set -o functrace обеспечивает наследование состояния бегущей команды в функциях и подпроцессах.
  • Ловушка trap с аргументом DEBUG устанавливает функцию, которая выполняет печать текущей команды на стандартный вывод терминала, обновляя заголовок окна Xterm.
  • Переменная PS1 задает приглашение командной строки так, чтобы оно также содержало имя хоста и текущий каталог.

Применение

Это применение может быть особенно полезным для айтишников, часто работающих в многозадачных Unix-системах, где важно иметь быстрый визуальный доступ к информации о выполняемых процессах в различных окнах терминала.

Когда пользователь вводит команду и нажимает Enter, DEBUG ловушка срабатывает, и текущая команда отображается в заголовке окна. Таким образом, даже если у пользователя открыто несколько терминалов, он может быстро ориентироваться, что выполняется в каждом из них.

С другой стороны, для более сложного мониторинга процессов, состоящих из множества команд или длинных конвейеров, полезно использовать средства вывода командного состояния, такие как ps, вместе с регулярным анализом вывода. Однако, это может быть более ресурсоемким и сложным.

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

Заключение

ksh предоставляет гибкие возможности для получения и использования текущей команды и её аргументов через встроенные механизмы, такие как DEBUG ловушка. Это эффективно для настройки интерфейса пользователя через заголовки окон терминала и улучшения общей управляемости процессов в Unix-системах. В совокупности с другими инструментами, как скриптовыми, так и системными, это позволяет заострить контроль над рабочей средой и улучшить продуктивность пользователей.

Оцените материал
Добавить комментарий

Капча загружается...