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