2015-11-24 8 views
1

Мне нужно просмотреть ввод запроса пользователя в фоновом скрипте. (как в zsh, так и в bash).Как контролировать входной сигнал bash/zsh?

Например, если пользователь ввел

[3:[email protected]]> ssh [email protected] ls -alh 

Мой фоновый процесс нуждается в строку «SSH [email protected] Ls -alh», прежде чем они нажмите клавишу ВВОД.

$ PS1 имеет строку приглашения, но не пользовательский ввод.

Возможно ли это?

Для фона общая цель состоит в том, чтобы принять частичный ввод пользователя и перевести оболочку на английский язык. Например, если бы я набрал ls -al, мои $ PS1 или $ PS2 изменились бы, чтобы сказать «перечислить все файлы в длинном формате в текущем каталоге». Итак, если кто-то точно не помнил, если переадресация X11 с поддержкой -X или -x с помощью ssh, они могут ввести ее и посмотреть, соответствует ли простой перевод на английский язык их ожиданиям.

Я хочу, чтобы это был zsh-плагин, или скрипт, который люди бросали в файлы rc, поэтому не может быть ничего слишком крупного.

+1

Возможно, вы используете ловушку 'DEBUG' в' bash', а 'zle', IIRC, имеет возможность редактировать командную строку до ее фактического выполнения. Это звучит немного как проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Зачем вам нужен вход? – chepner

+0

Похоже на очень подозрительное поведение –

+0

Это звучит подозрительно, @ glenn-jackman, но я хочу создать сценарий, который будет транслировать команды оболочки на простой английский. Поэтому, когда вы в командной строке вводите обычный нормальный материал, например «tar -xvf», он покажет (и обновится в режиме реального времени по мере ввода дальше) «извлеките архив по _____, verbosely». У меня есть репо здесь с началом оболочки на английский перевод https://github.com/tennysonholloway/shell-to-english –

ответ

1

Вам нужен вход в режиме реального времени? или, по крайней мере, до того, как линия будет принята?

Для последней опции в zsh есть виджет accept-line, который запускается, когда принимается входная строка. Вы можете переопределить виджет по умолчанию с вы владеете, как это:

function accept-line 
{ 
    #here, send the input to your script 
    yourscript "$BUFFER" 

    # ... do something here if you want 

    # trigger the real widget to accept the line and run the input 
    zle .accept-line 
} 
# register your new accept-line widget to replace the builtin one 
zle -N accept-line 

Здесь я использовал имя accept-line, но если вы хотите назвать свою функцию переопределения my_superOverride вы можете переопределить виджет по умолчанию на конце:

zle -N accept-line my_superOverride 
Смежные вопросы