Vô hiệu hóa hành vi Sao chép & Dán mặc định trong Bash


9

Khi tôi dán vào phiên cuối của mình, shell sẽ thực thi lệnh ngay lập tức mà không cần tôi nhấn phím enter.

Tôi thực sự không biết làm thế nào để vô hiệu hóa hành vi đó.

Tôi đang sử dụng thiết bị đầu cuối được cài đặt sẵn trên MacOS Yosemite.


9
Tất nhiên, nó chỉ làm điều đó nếu bộ đệm dán chứa một dòng mới. Điều này có (hầu như) không có gì để làm với bash. (Nó chỉ liên quan đến bash nếu và khi nó sử dụng thư viện readline.)
Peter - Rebstate Monica

... và chưa bash(với sự giúp đỡ của readline) có cách khắc phục.
alexis

Câu trả lời:


16

Với bash4.4 hoặc mới hơn và trong các thiết bị đầu cuối hỗ trợ dán dấu ngoặc xterm, bạn có thể thực hiện:

bind 'set enable-bracketed-paste'

(hoặc thêm set enable-bracketed-pastevào của bạn ~/.inputrc)

Điều đó sẽ khiến bộ đệm sao chép được chèn vào dấu nhắc thay vì các ký tự trong nó được hiểu như thể được gõ (bạn vẫn có thể gặp vấn đề nếu bộ đệm đó chứa các ký tự như ^C, ^Zvà trình giả lập thiết bị đầu cuối của bạn không lọc chúng) .

zsh theo mặc định kể từ phiên bản 5.1.

Đối với các shell hoặc thiết bị đầu cuối khác, xem thêm: Làm thế nào tôi có thể tự bảo vệ mình khỏi loại lạm dụng clipboard này?


Tôi sẽ nhìn thẳng vào nó
Opaldes

cách gian hàng dường như không hoạt động
Opaldes

@Opaldes, bạn đã thử làm gì? Với phiên bản nào của vỏ và trên thiết bị đầu cuối nào? Tôi tin rằng OS / X cũng có sẵn xterm, thay vào đó bạn có thể thử nó. Bạn đã thử perlkịch bản tại câu hỏi liên kết?
Stéphane Chazelas

1
@Opaldes, theo cách dán mã vào cửa sổ đầu cuối vào vim trên Mac OS X OS / X Terminal hỗ trợ dán dấu ngoặc kể từ OS / X Lion. Vì vậy, có vẻ như tất cả những gì bạn cần là một phiên bản zsh hoặc bash đủ gần đây. Với các phiên bản zsh cũ hơn, điều đó cũng có thể đạt được thông qua cấu hình.
Stéphane Chazelas

1
Chúng tôi có thể cảm ơn Daniel Colascione vì đã thêm tính năng hữu ích này vào Bash / Readline: gnu-bash.2382.n7.nabble.com/ Kẻ
Anthony Geoghegan

6

Điều này xảy ra khi bạn dán một ký tự "dòng mới". Ví dụ: nếu bạn dán nhiều dòng hoặc bạn vô tình sao chép trả lại vận chuyển ở cuối dòng. AFAIK không có cách nào để thực sự vô hiệu hóa hành vi này nhưng có nhiều cách để giảm thiểu hành vi đó.

Cách dễ nhất là chỉ sao chép một dòng tại một thời điểm và bỏ qua ký tự cuối cùng, thêm thủ công sau đó.

Hoặc, như the_velour_fog chỉ ra bên dưới, bạn cũng có thể dán nó vào trình chỉnh sửa hiển thị các ký tự không được in và chọn lại mà không có dòng mới.

Có một hoặc hai cách giải quyết nổi xung quanh các bản phân phối GNU / Linux nhưng không biết khái niệm này có thể được chuyển sang MacOS hay không. Bất kể, hãy xem ở đây và xem nếu có một tệp tương tự trong mac mà bạn có thể thay đổi. Thật không may, tôi nghi ngờ nó.


Tôi chỉ dán nó vào một trình soạn thảo hiển thị các ký tự không được in, sau đó chọn lại mà không có dòng mới
the_velour_fog

Đề nghị tốt, chỉnh sửa để bao gồm.
I_GNU_it_all_along

thật tốt khi biết rằng điều đó xảy ra không phải lúc nào cũng xảy ra. Tôi nêu lên câu trả lời của bạn nhưng nó là một giải pháp hơn cho tôi.
Opaldes

Đó là một nỗi đau nhưng có thể hữu ích khi sao chép một loạt các lệnh.
I_GNU_it_all_along

"Giải pháp" của tôi cũng là một cách giải quyết vấn đề hack, nhưng nó nhanh hơn việc chọn riêng, IMO.
Peter Cordes

5

Trước khi dán, gõ một trích dẫn , sau đó dán. control-c và mũi tên lên để chỉnh sửa nó thành một dòng khổng lồ.

dấu ngoặc kép cũng hoạt động, trong trường hợp văn bản chứa dấu ngoặc đơn nhưng không dấu ngoặc kép. Sẽ ổn nếu nó chứa $hoặc những thứ khác mở rộng bên trong dấu ngoặc kép, bởi vì bạn không thực sự chạy dòng khổng lồ được trích dẫn dưới dạng một lệnh.


Bạn thực sự không thể chỉnh sửa toàn bộ mọi thứ ngay tại đó, bởi vì các dòng mới bắt đầu một dấu nhắc tiếp tục (không phải là thuật ngữ chính thức) thay vì tạo một dòng dài lớn.

đưa ra 4 dòng sau:

echo
ls
foo
bar

dán như tôi đề nghị sẽ dẫn đến điều này trên màn hình của bạn:

$ 'echo 
> ls
> foo
> bar        <or cursor here if you didn't include a trailing newline
> [cursor here]

Sau đó, bạn có thể nhấn control-C và mũi tên lên. (control-C phá hủy mọi thứ trên cùng một dòng với con trỏ, vì vậy hãy nhấn return trước nếu có văn bản hữu ích ở đó.)

Một cách khác là đóng báo giá và nhấn return, sau đó mũi tên lên đó.

Dù sao, sau khi mũi tên lên

$ 'echo
ls
foo
bar

kiểm soát-a và loại bỏ hàng đầu '. Sử dụng control-left và control-right để di chuyển nhanh qua khối dán (bằng từ). Hoặc nếu thiết lập đầu cuối của bạn không hỗ trợ các phím mũi tên điều khiển, alt-b và alt-f.


Các dòng mới thực sự thực hiện các lệnh riêng biệt và 4 dòng này sẽ đi vào lịch sử lệnh của bạn một cách riêng biệt . Bạn có thể muốn thay đổi chúng thành ;hoặc &&. (Tôi không biết một mẹo cho điều đó, chỉ cần sử dụng phím lặp để chuyển tiếp hoặc từ lùi để đến đó nhanh chóng và thực hiện thủ công.)


2

Điều này xảy ra bởi vì phần dán của bạn kết thúc bằng một dòng mới và các trình giả lập thiết bị đầu cuối về cơ bản cung cấp phần dán để bash theo từng ký tự. Trong quá trình này, bash không biết người đánh máy từ máy thực sự.

Tôi thường chỉ chú ý thêm khi thực hiện dán sao chép rằng nó không bao gồm một dòng mới, nhưng có một mẹo mà bạn có thể thử: trước khi dán, trong bash, hãy nhập C-x C-e. Nó sẽ khởi chạy $EDITORvới một tập tin trống. Bất cứ điều gì bạn lưu trong tệp đó và thoát, bash sẽ thực thi. Vì vậy, bây giờ bạn có thể dán lệnh của mình vào trình chỉnh sửa, có thể thao tác mọi thứ hơn nữa và sau đó chạy tất cả chúng trong một lần.


-1

Tôi KHÔNG liên quan đến công ty, tôi là một khách hàng rất hài lòng. Hãy thử chương trình thiết bị đầu cuối này: http://www.emtec.com/zoc/index.html . Ngoài ra còn có một phiên bản Mac có sẵn.

Nếu tôi vi phạm với câu trả lời này, bất kỳ quy tắc SE nào, vui lòng cho tôi biết và tôi xóa câu trả lời.

Biên tập:

Khi tôi hiểu chính xác các câu trả lời khác, vấn đề này có thể do chương trình đầu cuối gây ra. Chương trình thiết bị đầu cuối ZOC là một phần mềm chuyên nghiệp được thiết kế hoàn hảo cho công việc. Nó dán văn bản bạn đã chọn mà không có bất kỳ ký tự bổ sung. Bạn có thể đăng nhập các phiên của bạn trong một tệp văn bản riêng biệt. Và nhiều hơn nữa

Cập nhật:

Chương trình thiết bị đầu cuối có một tùy chọn Paste without final 'newline'. Có thể điều này sẽ giúp.


3
Ít nhất hãy nói cách nó trả lời câu hỏi
Stéphane Chazelas

Nếu bạn dán một chuỗi có chứa các ký tự dòng mới hoặc dòng vận chuyển trở lại tại dấu nhắc của một vỏ đang chạy trong thiết bị đầu cuối đó, điều gì xảy ra? Nếu nó không làm cho shell thực thi các lệnh ngay lập tức (như được hỏi ở đây), thì nó làm như thế nào? Liệu nó có loại bỏ các ký tự khỏi lựa chọn? Nó có chèn một ký tự ^ V trước để thoát nó cho bash không?
Stéphane Chazelas

2
Như vậy, nó trông giống như thư rác hơn (mặc dù tôi chắc chắn đó không phải là ý định của bạn để spam trang web này). Nó không trả lời câu hỏi và chỉ là quảng cáo cho một sản phẩm thương mại liên quan.
Stéphane Chazelas

2
@AlBundy, tìm hiểu xem máy khách đầu cuối yêu thích của bạn có giải quyết được vấn đề này hay không bằng cách thử các khai thác được thảo luận trong security.stackexchange.com/q/39118 (được đề cập trong câu trả lời của Stephane) và các liên kết bạn sẽ tìm thấy ở đó. Nếu nó bảo vệ bạn, bạn có cơ sở tốt để giới thiệu nó (hãy cung cấp chi tiết các bài kiểm tra của bạn trong câu trả lời của bạn.).
alexis

Thông thường vấn đề là những gì bạn đã chọn không bao gồm một dòng mới. Làm thế nào là "dán văn bản bạn đã chọn" khác với hành vi bình thường của bất kỳ trình giả lập thiết bị đầu cuối khác?
Peter Cordes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.