7

Иногда я копирую и вставляю пути в терминал, и часто случайно копирую символ новой строки. Например, я хочу найти и прочитать содержимое foobar.txt .

$ locate foobar.txt
/home/sparhawk/Document Directory/foobar.txt

Затем я выбираю вторую строку тройным щелчком. (К сожалению, он также выбирает завершающий перевод строки!) Поскольку в пути есть пробел, мне нужно заключить путь в кавычки. Следовательно, введите

$ cat '

и средний щелчок, чтобы вставить. Это производит

$ cat '/home/sparhawk/Document Directory/foobar.txt
> 

так как я вставил новую строку перед закрытием ' . На данный момент я не могу нажать клавишу Backspace, чтобы удалить символ новой строки. Есть ли способ удалить этот только что напечатанный перевод строки?

Дополнительная информация

На данный момент я могу либо SIGINT с помощью Ctrl+c, либо завершить цитату с другой ' . Допустим, я делаю последнее.

$ cat '/home/sparhawk/Document Directory/foobar.txt
> '
cat: /home/sparhawk/Document Directory/foobar.txt
: No such file or directory

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

$ cat '/home/sparhawk/Document Directory/foobar.txt
'

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

1 ответ1

6

Bash использует GNU Readline Library для ввода и редактирования командной строки. К сожалению, эта библиотека обрабатывает ввод только построчно. Вызов readline() возвращается после завершения строки нажатием Enter. Следующая строка (после отображения приглашения $PS2 " > ") обрабатывается отдельным вызовом readline() .

Когда вы возвращаетесь в историю редактирования к многострочному вводу, Readline обрабатывает ввод как одну "строку" с новыми строками (подсказки $PS2 не отображаются), так что вы можете редактировать весь многострочный ввод, как вы описали.

Я использую следующую уловку, чтобы решить проблему, которую вы представили: Когда у меня есть ввод с нежелательным переводом строки, я отменяю его, нажав Ctrl+c. Затем я возвращаюсь к отмененному вводу, нажимая (или Ctrl+p). Затем я могу удалить новую строку с помощью Backspace и сделать другие изменения.

Ввод с нежелательной новой строкой в конце, нажав Ctrl+c:

$ cat 'xyz
> ^C

После нажатия вход возвращает событие без завершающей строки:

$ cat 'xyz

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