3

В файле истории zsh все команды регистрируются из всех сеансов терминала. Есть ли способ войти в сеанс терминала, в котором была выполнена команда (т. Е. Уникальный идентификатор для этого экземпляра оболочки?).

Возможный вариант использования для этого - просмотреть файл истории и определить, что выполнялось до или после данной команды, ограниченной этим конкретным сеансом.

1 ответ1

1

Если вы измените файл истории, вы сами создадите себе проблемы!

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

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

function log_and_accept {
    echo "$TTY $BUFFER" >> /tmp/log
    zle accept-line
}

Теперь $ TTY - это идентификатор вашей текущей оболочки, но он не единственный, который вы можете использовать. $ TTY - это путь к файлу /dev /pts /NUMBER. Единственная проблема здесь состоит в том, что этот номер всегда является следующим доступным номером, поэтому, если вы закроете один терминал и откроете другой, вы будете использовать тот же самый номер tty.

Если вам это не нравится, то также возможно получить путь, который включает в себя идентификатор процесса оболочки (идентификаторы процессов также могут быть использованы повторно, но это менее вероятно будет препятствовать вам - идентификаторы процессов используются всеми процессами, пока ттыс только терминалы). Это легко сделать благодаря символической ссылке /proc /self, которая всегда указывает на папку процесса для процесса, который на него смотрит. Таким образом, чтобы использовать папку процесса, вышеуказанная функция будет:

function log_and_accept {
    process=/proc/self
    echo "${process:A} $BUFFER" >> /tmp/log
    zle accept-line
}

Теперь, когда вы определились с тем, как вы хотите идентифицировать строку, следующая часть должна фактически заменить поведение по умолчанию вашей новой функцией. Поведение по умолчанию, которое мы заменяем, - это функция accept-line, и если мы посмотрим на документацию zle, вы увидите, что accept-line связана с ^ J и ^ M.

Чтобы связать эту функцию с этими буквами, сначала нужно превратить ее в виджет:

zle -N log_and_accept_widget log_and_accept

Затем вы можете связать его, заменив старое поведение:

bindkey '^J' log_and_accept_widget
bindkey '^M' log_and_accept_widget

Теперь у zsh есть поддержка нескольких строк, поэтому при просмотре этого файла вы можете обнаружить, что строки оказываются менее четкими, чем вы изначально надеялись. Вот некоторые результаты из файла, который я сгенерировал во время тестирования:

/proc/19170 function log_and_accept {
shell=/proc/self
echo "${shell:A} $BUFFER" >> /tmp/log
zle accept-line
}
/proc/19170 echo woo
/proc/19170 cat /tmp/log

Возможно, вы захотите пропустить $ BUFFER через какой-нибудь симпатичный принтер, прежде чем регистрировать его.

Если вы столкнулись с проблемами при выполнении этого, и вы просто действительно хотите вернуть старое поведение, то вы можете восстановить его с помощью:

bindkey '^J' accept-line
bindkey '^M' accept-line

Хотя на самом деле выполнение этих команд может быть ... сложным.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .