Вимкнути поведінку копіювання та вставки за замовчуванням у Bash


9

Коли я вставляю в свій термінальний сеанс, оболонка негайно виконує команду, не натискаючи клавішу введення.

Я справді не знаю, як відключити таку поведінку.

Я використовую попередньо встановлений термінал на MacOS Yosemite.


9
Це робиться лише, звичайно, якщо буфер вставки містить новий рядок. Це (майже) нічого спільного з баш. (Це стосується bash лише в тому випадку, якщо і наскільки він використовує бібліотеку readline.)
Пітер - Відновіть Моніку

... і все ж bash(за допомогою readline) має виправлення.
alexis

Відповіді:


16

З bash4.4 або новішою версією та в терміналах, які підтримують скоботу з вставкою a la 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, термінал підтримує вставну скотчем з OS / X Lion. Тому, здавалося б, все, що вам потрібно, - це досить недавня версія zsh або bash. Зі старими версіями zsh це також можна досягти за допомогою конфігурації.
Стефан Шазелас

1
Ми можемо подякувати Даніелю Колашчону за додавання цієї корисної функції до Bash / Readline: gnu-bash.2382.n7.nabble.com/…
Ентоні

6

Це відбувається, коли ви вставляєте символ "нового рядка". Наприклад, якщо ви вставляєте кілька рядків або невідомо копіюєте повернення каретки в кінці рядка. AFAIK немає способу фактично відключити цю поведінку, але є способи її пом’якшити.

Найпростіший спосіб - просто скопіювати по одному рядку за раз і пропустити останній символ, додавши його вручну.

Або, як вказано 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]

Потім можна натиснути клавіші управління-C та стрілку вгору. (control-C знищує все в тому ж рядку, що і курсор, тому натисніть клавішу return, якщо там є корисний текст.)

Альтернативою є закриття пропозиції та натискання клавіші повернення, а потім стрілка вгору.

У будь-якому випадку, після стрілки вгору

$ 'echo
ls
foo
bar

control-a і видаліть провідну '. Використовуйте керування ліворуч і управління праворуч для швидкого переміщення через блок вставлення (словами). Або якщо ваша установка терміналу не підтримує клавіші управління-стрілки, alt-b і alt-f.


Буквальні нові рядки насправді окремі команди, і ці 4 рядки будуть входити в історію вашої команди окремо . Ви можете змінити їх на ;або &&. (Я не знаю хитрості для цього, просто використовуйте клавішу-повтор для перемотування вперед або назад, щоб швидко дістатися туди і зробити це вручну.)


2

Це трапляється через те, що вставка закінчується новим рядком, а термінальні емулятори в основному подають пасту на символ символу. У цьому процесі Баш насправді не знає людину-машиністку з машини.

Зазвичай я просто звертаю додаткову увагу, роблячи вставку копій, щоб вона не включала новий рядок, але ви можете спробувати один трюк: перед вставкою, в bash, введіть C-x C-e. Він повинен запускатися $EDITORз порожнього файлу. Що б ви не зберегли у цьому файлі та вийшли, bash виконає. Тепер ви можете вставити свою команду в редактор, можливо, маніпулювати речами далі, а потім запустити їх за один раз.


-1

Я НЕ пов'язаний з компанією, я дуже задоволений клієнт. Спробуйте цю термінальну програму: http://www.emtec.com/zoc/index.html . Також доступна версія для Mac.

Якщо я порушую цією відповіддю будь-яке правило SE, будь ласка, повідомте мене, і я видалю відповідь.

Редагувати:

Коли я правильно зрозумів інші відповіді, ця проблема може бути викликана термінальною програмою. Програма терміналу ZOC - це професійне програмне забезпечення, яке ідеально призначене для роботи. Він вставляє вибраний текст без додаткових символів. Ви можете записати свої сеанси в окремий текстовий файл. І багато іншого

Оновлення:

У термінальній програмі є опція Paste without final 'newline'. Можливо, це допомагає.


3
Принаймні скажіть, як це відповідає на питання
Стефан Шазелас

Якщо вставити рядок, що містить символи нового рядка або повернення каретки, на запит оболонки, що працює в цьому терміналі, що відбувається? Якщо вона не змушує оболонку виконувати команди відразу (про що тут питають), як це зробити? Чи видаляє ці символи з вибраного? Він вставляє символ ^ V перед тим, як уникнути його для баш?
Стефан Шазелас

2
Як такий, він більше схожий на спам (хоча я впевнений, що це не було вашим наміром спамувати цей сайт). Це не відповідає на питання і є лише рекламою відповідного комерційного продукту.
Стефан Шазелас

2
@AlBundy, з’ясуйте, чи вирішує цю проблему ваш улюблений клієнт-термінал, випробувавши подвиги, обговорені в security.stackexchange.com/q/39118 (згадується у відповіді Стефана), та посилання, які ви знайдете там. Якщо він захищає вас, у вас є вагомі підстави рекомендувати його (вкажіть у відповіді деталі тестів).
alexis

Зазвичай проблема полягає в тому, що те, що ви вибрали , включає новий рядок. Чим "вставлення обраного вами тексту" відрізняється від нормальної поведінки будь-якого іншого термінального емулятора?
Пітер Кордес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.