Câu hỏi Trong bash, làm thế nào để thoát khỏi một dấu chấm than?


Tôi muốn làm một cái gì đó như bzr commit -m "It works!". Tôi có thể thoát khỏi dấu chấm than bằng cách làm bzr commit -m "It works\!". Tuy nhiên, sau đó thông báo cam kết của tôi bao gồm dấu gạch chéo ngược. Làm cách nào để thoát khỏi dấu chấm than, trong khi vẫn bỏ qua dấu gạch chéo ngược?


163
2018-04-22 18:53


gốc


Đang làm bzr commit -m "It works"! cũng vậy. - kba
Như tôi đã lưu ý trước khi lệnh bạn đặt thực sự hoạt động trên chính nó :) bzr commit -m "It works!" - h4unt3r
Một trường hợp thậm chí quirkier với dấu ngoặc kép lồng nhau: stackoverflow.com/questions/22125658/… - Ciro Santilli 新疆改造中心 六四事件 法轮功
Mặc dù câu trả lời được chấp nhận là một giải pháp tốt cho các vấn đề cam kết của bạn, tôi cảm thấy đó không phải là câu trả lời cho vấn đề thực tế: Mở rộng lịch sử Bash. Hãy xem xét chấp nhận câu trả lời của Dennis? - Arjan


Các câu trả lời:


Vì bạn không phụ thuộc vào bash để mở rộng các biến trong thông điệp cam kết của bạn, bạn có thể sử dụng dấu nháy đơn để thay thế. Các chuỗi trong dấu nháy đơn không được bash mở rộng.

bzr commit -m 'This does work!' 

134
2018-04-22 19:31



Vì câu hỏi là "Làm cách nào để thoát khỏi dấu chấm than?" và không phải "Làm thế nào để tôi không mở rộng một dấu chấm than?" Tôi không nghĩ rằng điều này là hợp lệ. Có một số lần (như khi đi qua dấu nháy đơn và dấu chấm than trong cùng một dòng lệnh) rằng điều này không hoạt động. Câu trả lời dưới đây hoạt động tốt hơn nhiều để làm những gì nhiều người cần. - Jann
@ Jann: Bạn có 100% ngay trên điều này, nhưng tôi nghĩ vấn đề ở đây là vấn đề với rất nhiều câu hỏi về siêu người dùng: Chúng ta có trả lời câu hỏi đó không, hay chúng ta giúp mọi người giải quyết vấn đề cụ thể của họ. Tôi nghĩ cả hai cách có thể hữu ích và điều này đang tìm kiếm trợ giúp về một vấn đề cụ thể. - Benjamin Bannier
touché! Đây là một vấn đề cụ thể. Tôi chỉ có xu hướng muốn có câu trả lời cho câu hỏi của mình để có thể sử dụng trong nhiều tình huống. pS: Lý do tôi thậm chí đề cập đến điều này là tôi đã cần phải vượt qua cả một dấu nháy đơn và dấu chấm than cho một chương trình perl và tôi cần giải pháp dưới đây. :) - Jann
Tôi đồng ý với cả Benjamin và Jann nhưng đã đưa ra một lời giới thiệu. Tiêu đề của câu hỏi được lập chỉ mục bởi các công cụ tìm kiếm và đó là cách tôi đến đây và có lẽ hầu hết người dùng đến đây. Đó là lý do tại sao tôi tin rằng điều quan trọng là câu hỏi thực sự phản ánh vấn đề đằng sau nó. Trong các diễn đàn khác, mọi người được khuyên (hầu như bắt buộc) để hỏi chính xác những gì họ tìm kiếm. Trả lời các câu hỏi được thể hiện kém hỗ trợ sloppiness và đó là lý do chính xác cho downvote của tôi ở đây. Như một giải pháp / giải pháp, đề xuất của tôi là giúp điều chỉnh tiêu đề để nó phản ánh vấn đề thực tế. - ChristophK


Câu hỏi cũ tôi biết, nhưng đối với người tìm kiếm trong tương lai:

Bạn cũng có thể sử dụng phương thức này nếu bạn muốn báo giá kép cũng như dấu chấm than:

echo "It's broken"'!'

Điều này hoạt động ngay cả khi ! không phải ở cuối dòng.

Ví dụ:

echo "hello there"'!'" and goodbye"

Tiền thưởng: Một kỹ thuật tương tự có thể được sử dụng để thoát bất kì văn bản trong Sh hoặc Bash (với sự trợ giúp của sed): xem tùy chọn đầu tiên trong câu trả lời này. Hơn nữa, nếu bạn có bash-completion cài đặt, bạn có thể có các quote() chức năng đã có sẵn.


139
2018-06-23 19:16



Mẹo hay, JWD. Tôi đã không nhận ra các chuỗi bash có thể được ghép nối đơn giản bằng cách bỏ qua khoảng trống giữa chúng. - Alan H.
Trên thực tế, nếu dấu chấm than ở cuối chuỗi bạn đang ở trong echo "Happy birthday!" sẽ làm việc như mong đợi nếu không bạn có thể thoát khỏi nó với một dấu gạch chéo ngược, nhưng dấu gạch chéo ngược sẽ được in cũng XD Bash không dành cho người yếu tim :) - h4unt3r
@ h4unt3r: Lạ thật, đó không phải là kinh nghiệm của tôi. Cho tôi, echo "Happy Birthday!" xuất ra 2 dòng. Đầu tiên là echo "Happy birthday" (không có dấu chấm than), và thứ hai là "Chúc mừng sinh nhật" (một lần nữa, không có dấu chấm than). Bạn đã mở rộng lịch sử khi bạn thực hiện thử nghiệm này chưa? - jwd
@ jwd bạn đang chạy phiên bản bash nào? Tôi luôn mở rộng lịch sử. Bạn đã vô tình sử dụng hai !! cho thử nghiệm của bạn? - h4unt3r
@ h4unt3r: version 4.1.2(1)-release (x86_64-redhat-linux-gnu), chắc chắn chỉ có một ! đang được sử dụng. Tôi có histexpand trình bày trong $SHELLOPTS. Tuy nhiên, tôi đã thử chỉ 4.3.18 (2) -release trên máy khác, và nó hoạt động như bạn mô tả. Tôi đoán đó là một lỗi đã được sửa. - jwd


Tắt mở rộng lịch sử:

set +H

hoặc là

set +o histexpand

63
2018-04-22 18:58



Cảm ơn - điều này đã hiệu quả, nhưng tôi phải làm set +o histexpand, không phải set -o histexpand. Bạn có thể chỉnh sửa câu trả lời của mình để sửa lỗi này không? - Matthew
Rất tiếc, lỗi chính tả, xin lỗi. Đã sửa. - Dennis Williamson
xuất sắc! đang tìm kiếm điều này cho AGES .... thx vm! như trốn thoát wont làm việc ... Tôi không muốn sử dụng dấu nháy đơn quá ... Tôi sẽ thêm này vào của tôi .bashrc thx !!, không bao giờ được sử dụng ! trong kịch bản và không có gì !! nó luôn gây rắc rối ... - Aquarius Power
Việc này thật là tuyệt! echo "@AquariusPower!" - joehanna


Sử dụng dấu nháy đơn (') thay vì dấu ngoặc kép ("). Dấu nháy đơn tắt tất cả các thông dịch của các công cụ trong đó, trong khi dấu ngoặc kép chỉ tắt một số.

bzr commit -m 'It works!'

9
2018-04-22 19:32





Bây giờ tôi đã tìm ra một cách khác, ít nhất sẽ làm việc với echoing chuỗi (câu) bạn muốn chấm câu với dấu chấm than. Nó thực hiện một phép toán cuối cùng, nhiều hơn hoặc ít hơn, xung quanh Bash histexpand và chỉ mất một chút thời gian để mã hóa.

Hex cho dấu chấm than, như được liệt kê trên http://www.ascii-code.com/, là 21, vì vậy nếu bạn đặt \x21 ở cuối chuỗi của bạn, echo -e $foo, chế tạo $foo tiếng vọng mở rộng của chính nó [tức là, foo=$(echo -e "$foo")], những gì bạn nhận được khi bạn echo $foo một lần nữa là chuỗi với một ! cuối cùng. Và không có chuyển đổi histexpand hoặc.

Hoạt động chắc chắn trong Bash 4+. Các phiên bản trước đó, ymmv.


4
2017-11-23 04:28



Hmmm nó không làm việc cho tôi. - lzap