Конечно, это происходит только в том случае, если буфер вставки содержит новую строку. Это (почти) не имеет ничего общего с Bash. (Это касается bash только в том случае, если он использует библиотеку readline.)
Питер - Восстановить Монику
... и все же bash(с помощью readline) есть исправление.
Алексис
Ответы:
16
С bash4.4 или новее и в терминалах, которые поддерживают вставку в скобках а-ля xterm, вы можете сделать:
bind 'set enable-bracketed-paste'
(или добавить set enable-bracketed-pasteв свой ~/.inputrc)
Это приведет к тому, что в командной строке будет вставлен буфер копирования-вставки, а не символы в нем, которые будут интерпретироваться как набранные (у вас все еще могут быть проблемы, если этот буфер содержит такие символы, как ^C, ^Zа эмулятор терминала не фильтрует их) ,
zsh делает это по умолчанию, начиная с версии 5.1.
@Opaldes, что ты пробовал? С какой версией какой оболочки и на каких терминалах? Я верю, что OS / X также поставляется с xterm, вы можете попробовать это вместо этого. Вы пробовали perlскрипт по связанному вопросу?
Стефан Шазелас
1
@Opaldes, в соответствии с Вставкой кода в окно терминала в vim на Mac OS X OS / X Terminal поддерживает вставку в скобках начиная с OS / X Lion. Так что, похоже, все, что вам нужно, это достаточно свежая версия zsh или bash. В старых версиях zsh этого также можно достичь с помощью конфигурации.
Стефан Шазелас
1
Мы можем поблагодарить Daniel Colascione за добавление этой полезной функции в Bash / Readline: gnu-bash.2382.n7.nabble.com/…
Энтони
6
Это происходит, когда вы вставляете символ новой строки. Например, если вы вставляете несколько строк или копируете возврат каретки в конце строки. На самом деле, нет способа отключить это поведение, но есть способы его смягчить.
Самый простой способ - просто скопировать одну строку за раз и пропустить последний символ, добавив его вручную.
Или, как указывает the_velour_fog ниже, вы также можете вставить его в редактор, который показывает непечатные символы и повторно выбирать без перевода строки.
Есть один или два обходных пути для дистрибутивов GNU / Linux, но не знаю, можно ли перенести эту концепцию на MacOS. В любом случае, посмотрите здесь и посмотрите, есть ли в Mac похожий файл, который вы можете изменить. К сожалению, я сомневаюсь в этом.
Я просто вставляю его в редактор, который показывает
непечатные
Хорошее предложение, отредактировано, чтобы включить.
I_GNU_it_all_along
Приятно знать, что это объясняет, что это происходит не всегда. Я проголосовал за ваш ответ, но для меня это скорее обходной путь.
Опалдес
Это боль, но может быть полезно при копировании серии команд.
I_GNU_it_all_along
Мое "решение" также является своего рода обходным путем, но это быстрее, чем выбор отдельно, IMO.
Питер Кордес
5
Перед вставкой введите одинарную кавычку , затем вставьте. control-c и стрелка вверх, чтобы редактировать его как одну гигантскую линию.
двойные кавычки также работают, если текст содержит одинарные, но не двойные кавычки. Это нормально, если он содержит $или другие вещи, которые расширяются внутри двойных кавычек, потому что вы на самом деле не запускаете цитируемую гигантскую строку как одну команду.
Вы не можете отредактировать все это прямо здесь, потому что переводы строк запускают приглашение продолжения (а не официальную терминологию) вместо создания одной большой длинной строки.
учитывая эти 4 строки:
echo
ls
foo
bar
вставка, как я предлагаю, приведет к тому, что на вашем экране:
$ 'echo
> ls
> foo
> bar <or cursor here if you didn't include a trailing newline
>[cursor here]
Затем вы можете нажать control-C и стрелку вверх. (control-C уничтожает все в той же строке, что и курсор, поэтому сначала нажмите return, если там есть полезный текст.)
Альтернативой является закрытие кавычки и нажатие возврата, затем стрелка вверх.
Во всяком случае, после стрелки вверх
$ 'echo
ls
foo
bar
управляй и убирай ведущий '. Используйте control-left и control-right для быстрого перемещения по блоку вставки (словами). Или, если настройка вашего терминала не поддерживает клавиши управления стрелками, alt-b и alt-f.
Буквальные символы новой строки фактически разделяют команды, и эти 4 строки войдут в историю ваших команд отдельно . Вы можете изменить их на ;или &&. (Я не знаю хитрости для этого, просто используйте key-repeat для forward или backward-word, чтобы быстро туда добраться и сделать это вручную.)
Это происходит потому, что ваша вставка заканчивается новой строкой, а эмуляторы терминала в основном передают вставку в символ за символом. В этом процессе bash на самом деле не узнает машинистку из машины.
Я обычно обращаю особое внимание на то, что при вставке копий в него не входит перевод строки, но есть один прием, который вы можете попробовать: перед вставкой, в bash, введите C-x C-e. Должен запускаться $EDITORс пустым файлом. Что бы вы ни сохранили в этом файле и не вышли, bash выполнится. Так что теперь вы можете вставить свою команду в редактор, возможно, манипулировать вещами дальше, а затем запустить их все за один раз.
Я НЕ связан с компанией, я очень довольный клиент. Попробуйте эту терминальную программу: http://www.emtec.com/zoc/index.html . Также доступна версия для Mac.
Если я нарушу с этим ответом какое-либо правило SE, пожалуйста, дайте мне знать, и я удалю ответ.
Редактировать:
Когда я правильно понял другие ответы, эта проблема может быть вызвана программой терминала. Терминальная программа ZOC - это профессиональное программное обеспечение, идеально разработанное для работы. Он вставляет выбранный текст без каких-либо дополнительных символов. Вы можете записывать свои сессии в отдельном текстовом файле. И многое другое
Обновить:
Терминальная программа имеет опцию Paste without final 'newline'. Может быть, это помогает.
Пожалуйста, по крайней мере, скажите, как это отвечает на вопрос
Стефан Шазелас
Что произойдет, если вы вставите строку, содержащую символы перевода строки или возврата каретки по приглашению оболочки, запущенной в этом терминале? Если это не приводит к тому, что оболочка сразу же выполняет команды (как здесь спрашивается), как она это делает? Убирает ли эти символы из выделения? Вставляет ли он символ ^ V, прежде чем экранировать его для bash?
Стефан Шазелас
2
Таким образом, это больше похоже на спам (хотя я уверен, что вы не хотели спамить этот сайт). Он не отвечает на вопрос и является просто рекламой для соответствующего коммерческого продукта.
Стефан Шазелас
2
@AlBundy, узнайте, решает ли ваш любимый терминальный клиент эту проблему, испробовав эксплойты, описанные в security.stackexchange.com/q/39118 (упомянутые в ответе Стефана), и ссылки, которые вы найдете там. Если это защищает вас, у вас есть веские основания рекомендовать его (укажите подробности ваших тестов в своем ответе).
Алексис
Обычно проблема заключается в том , что вы выбрали действительно включать в себя символ новой строки. Чем «вставка выбранного вами текста» отличается от обычного поведения любого другого эмулятора терминала?
bash
(с помощьюreadline
) есть исправление.Ответы:
С
bash
4.4 или новее и в терминалах, которые поддерживают вставку в скобках а-ляxterm
, вы можете сделать:(или добавить
set enable-bracketed-paste
в свой~/.inputrc
)Это приведет к тому, что в командной строке будет вставлен буфер копирования-вставки, а не символы в нем, которые будут интерпретироваться как набранные (у вас все еще могут быть проблемы, если этот буфер содержит такие символы, как
^C
,^Z
а эмулятор терминала не фильтрует их) ,zsh
делает это по умолчанию, начиная с версии 5.1.Для других оболочек или терминалов см. Также: Как я могу защитить себя от такого рода злоупотреблений буфером обмена?
источник
xterm
, вы можете попробовать это вместо этого. Вы пробовалиperl
скрипт по связанному вопросу?Это происходит, когда вы вставляете символ новой строки. Например, если вы вставляете несколько строк или копируете возврат каретки в конце строки. На самом деле, нет способа отключить это поведение, но есть способы его смягчить.
Самый простой способ - просто скопировать одну строку за раз и пропустить последний символ, добавив его вручную.
Или, как указывает the_velour_fog ниже, вы также можете вставить его в редактор, который показывает непечатные символы и повторно выбирать без перевода строки.
Есть один или два обходных пути для дистрибутивов GNU / Linux, но не знаю, можно ли перенести эту концепцию на MacOS. В любом случае, посмотрите здесь и посмотрите, есть ли в Mac похожий файл, который вы можете изменить. К сожалению, я сомневаюсь в этом.
источник
Перед вставкой введите одинарную кавычку , затем вставьте. control-c и стрелка вверх, чтобы редактировать его как одну гигантскую линию.
двойные кавычки также работают, если текст содержит одинарные, но не двойные кавычки. Это нормально, если он содержит
$
или другие вещи, которые расширяются внутри двойных кавычек, потому что вы на самом деле не запускаете цитируемую гигантскую строку как одну команду.Вы не можете отредактировать все это прямо здесь, потому что переводы строк запускают приглашение продолжения (а не официальную терминологию) вместо создания одной большой длинной строки.
учитывая эти 4 строки:
вставка, как я предлагаю, приведет к тому, что на вашем экране:
Затем вы можете нажать control-C и стрелку вверх. (control-C уничтожает все в той же строке, что и курсор, поэтому сначала нажмите return, если там есть полезный текст.)
Альтернативой является закрытие кавычки и нажатие возврата, затем стрелка вверх.
Во всяком случае, после стрелки вверх
управляй и убирай ведущий
'
. Используйте control-left и control-right для быстрого перемещения по блоку вставки (словами). Или, если настройка вашего терминала не поддерживает клавиши управления стрелками, alt-b и alt-f.Буквальные символы новой строки фактически разделяют команды, и эти 4 строки войдут в историю ваших команд отдельно . Вы можете изменить их на
;
или&&
. (Я не знаю хитрости для этого, просто используйте key-repeat для forward или backward-word, чтобы быстро туда добраться и сделать это вручную.)источник
Это происходит потому, что ваша вставка заканчивается новой строкой, а эмуляторы терминала в основном передают вставку в символ за символом. В этом процессе bash на самом деле не узнает машинистку из машины.
Я обычно обращаю особое внимание на то, что при вставке копий в него не входит перевод строки, но есть один прием, который вы можете попробовать: перед вставкой, в bash, введите
C-x C-e
. Должен запускаться$EDITOR
с пустым файлом. Что бы вы ни сохранили в этом файле и не вышли, bash выполнится. Так что теперь вы можете вставить свою команду в редактор, возможно, манипулировать вещами дальше, а затем запустить их все за один раз.источник
Я НЕ связан с компанией, я очень довольный клиент. Попробуйте эту терминальную программу: http://www.emtec.com/zoc/index.html . Также доступна версия для Mac.
Если я нарушу с этим ответом какое-либо правило SE, пожалуйста, дайте мне знать, и я удалю ответ.
Редактировать:
Когда я правильно понял другие ответы, эта проблема может быть вызвана программой терминала. Терминальная программа ZOC - это профессиональное программное обеспечение, идеально разработанное для работы. Он вставляет выбранный текст без каких-либо дополнительных символов. Вы можете записывать свои сессии в отдельном текстовом файле. И многое другое
Обновить:
Терминальная программа имеет опцию
Paste without final 'newline'
. Может быть, это помогает.источник