Возвращаясь назад в приглашении bash - PullRequest
7 голосов
/ 10 ноября 2008

Я хотел бы иметь пустую строку после моего приглашения bash и перед выводом на мой Mac. Это должно выглядеть так:

echo; ls

Могу ли я добавить новую строку в приглашение bash, а затем вернуться на одну строку вверх, чтобы дождаться ввода пользователя? Я что-то упускаю из виду?

Ответы [ 7 ]

8 голосов
/ 23 октября 2012

Я знаю, что это старо, но для кого-то вроде меня, кто сталкивался с этим, пока гуглил. Вот как ты это делаешь ... Это на самом деле довольно просто!

Проверьте эту ссылку -> Движение курсора

В основном для перемещения вверх на N строк:

echo -e "\033[<N>A HELLO WORLD\n"

Просто измените " " на столько строк, на которые вы хотите вернуться ... Например, чтобы продвинуться вверх на 5 строк, это будет "/ 033 [5A"

4 голосов
/ 10 ноября 2008

Насколько мне известно, это невозможно, если вы не углубитесь в более низкоуровневые вещи, такие как полноэкранные эмуляторы, такие как curses.

3 голосов
/ 10 ноября 2008

Это немного удар в темноте, но вы можете иметь возможность использовать коды клемм VT102 для управления курсором без использования Curses. Все соответствующие команды VT102, которые вас заинтересуют, состоят из отправки ESC, затем [, а затем параметров конкретной команды.

Например, чтобы переместить курсор вверх на одну строку, нужно вывести:

ESC  [    1    A
0x1B 0x5B 0x31 0x41

Имейте в виду, что в документации VT102 обычно используется восьмеричное значение, поэтому держите под рукой таблицу ascii , если вы используете hex.

Весь этот совет дан без его проверки - я не знаю, могут ли команды VT102 быть встроены в вашу подсказку bash, но я подумал, что это может стоить попытки.

Редактировать: Да - похоже, многие люди используют коды форматирования VT102 в своих приглашениях bash. Чтобы перевести мой приведенный выше пример во что-то, что Bash узнает, добавив:

\e[1A

в вашем приглашении должен переместить курсор вверх на одну строку.

2 голосов
/ 03 августа 2010

Это работает:

trap echo DEBUG

Не добавляется дополнительный символ новой строки, если вы нажмете return в пустом окне.

Приведенная выше команда приведет к выводу новой строки для каждого элемента конвейера или многокомпонентной строки, например:

$ echo foo; echo bar
\n
foo
\n
bar

Чтобы предотвратить это, чтобы перед выходом всей команды выводился только один дополнительный символ новой строки:

PROMPT_COMMAND='_nl=true'; trap -- '$_nl && [[ $BASH_COMMAND != $PROMPT_COMMAND ]] && echo; _nl=false' DEBUG

Ловушка DEBUG выполняется перед каждой командой, поэтому перед первой командой она проверяет, является ли флаг истинным, и, если это так, выводит символ новой строки. Затем он устанавливает флаг в значение false, чтобы каждая последующая команда в строке не вызывала дополнительный символ новой строки.

Содержимое $PROMPT_COMMAND выполняется перед выводом приглашения, поэтому для флага установлено значение true - готово к следующему циклу.

Поскольку нажатие клавиши ввода в пустой командной строке по-прежнему вызывает выполнение содержимого $PROMPT_COMMAND, тест в ловушке также проверяет это содержимое в качестве текущей команды и не выполняет echo, если они совпадают.

2 голосов
/ 13 мая 2009

Это очень возможно. Если ваш bash имеет C-v, установленный в качестве команды readline quoted-insert, вы можете просто добавить следующее к вашему ~/.inputrc:

RETURN: "\C-e\C-v\n\C-v\n\n"

Это заставит bash (на самом деле readline) вставить два дословных перевода строки перед обычным интерпретируемым переводом строки. По умолчанию вставляется только один, что приводит к тому, что вывод начинается в строке после приглашения.

Вы можете проверить, установлен ли C-v в кавычки, введя его в bash (это Ctrl+V), а затем, например, стрелка вверх. Это должно напечатать ^[[A или что-то подобное. Если этого не произойдет, вы также можете связать его с ~/.inputrc:

C-v: quoted-insert
RETURN: "\C-e\C-v\n\C-v\n\n"

~/.inputrc можно создать, если он не существует. Изменения не вступят в силу при запуске бешей, если вы не введете команду readline re-read-init-file (по умолчанию C-x C-r). Будьте осторожны, хотя. Если вы делаете что-то не так, команда enter больше не будет выдавать команды, и исправление вашей ошибки может оказаться затруднительным. Если вы сделаете что-то не так, C-o по умолчанию также примет строку.

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

1 голос
/ 10 ноября 2008

Я верю (но не пытался), если вы введете '\n\b' в строку приглашения, это будет сделано.

0 голосов
/ 10 июня 2009

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

В этом случае курсор вверх на одну строку код может быть определен с помощью:

tput cuu1

Если вы перенаправите вывод tput в файл, вы увидите, какие управляющие символы используются.

Bash также поддерживает переменную PROMPT_COMMAND, что позволяет вам запускать произвольные команды перед каждым запросом.

...