Biểu tượng băm (#) biến thành biểu tượng bảng Anh (£) sau khi trích dẫn nhị phân


42

Đây là cách nhắc bash của tôi được sử dụng để trông như thế nào.

nhắc bash cũ

Sau đó, tôi đã làm một cái gì đó có lẽ không thông minh, tôi đã làm cat /bin/bash. Và bây giờ, dấu nhắc bash của tôi trông như thế này, với ký hiệu bảng Anh (£) thay vì ký hiệu băm (#). Nó thậm chí còn ảnh hưởng đến các biểu tượng băm trong các tập tin, xem tại đây:

biểu tượng pound trong tập tin

Bất kỳ ý tưởng làm thế nào để hoàn nguyên điều này?

Chỉnh sửa: Câu hỏi này không hỏi "Làm cách nào để thay đổi dấu nhắc bash của tôi?", Nhưng "dấu nhắc bash của tôi tự thay đổi, làm cách nào tôi có thể khôi phục nó?"

Hoàn thành.bashrc cho những người quan tâm.



1
(Tôi đã tự do chỉnh sửa tiêu đề một chút để đưa ra nguyên nhân gây ra sự cố. Chỉnh sửa hoặc hoàn nguyên theo ý muốn.)
ilkkachu

9
Dấu nhắc, tệp, vv vẫn chứa mã ký tự cho #, \x23; bây giờ chỉ là thiết bị đầu cuối diễn giải \x23£.
deltab

4
Phần thú vị là "pound" là tên gọi khác của biểu tượng băm trong tiếng Mỹ (và có thể là các quốc tịch khác?) Tiếng Anh ... =)
jpmc26

1
Chương trình thiết bị đầu cuối này đã được thực hiện trong?
SnoringFrog

Câu trả lời:


102

Thiết bị đầu cuối chấp nhận và thực thi một loạt các chuỗi ký tự khác nhau như các lệnh điều khiển. Ví dụ, tất cả các chuyển động con trỏ được thực hiện bằng cách sử dụng những người. Một số mã thực hiện thay đổi vĩnh viễn, như cài đặt màu hoặc yêu cầu thiết bị đầu cuối sử dụng bộ ký tự thay thế. Các tập tin thực thi và các tệp nhị phân khác cũng có thể chứa các byte đại diện cho các lệnh đó, vì vậy việc đưa các tệp nhị phân vào thiết bị đầu cuối có thể có các tác dụng phụ khó chịu. Xem ví dụ ở đây để biết một số mã kiểm soát.

Bối cảnh lịch sử của điều này là ban đầu, các thiết bị đầu cuối là các thiết bị khá câm với màn hình và bàn phím và chúng được kết nối với máy tính thực tế thông qua một cổng nối tiếp. Trước đó, họ là máy in với bàn phím. Không có nhiều giao thức để tách byte dữ liệu khỏi byte lệnh, vì vậy các lệnh được đưa cho thiết bị đầu cuối "nội tuyến". (Hay đúng hơn, mã thoát và ký tự điều khiển là giao thức.) Người ta có thể cho rằng nếu hệ thống được phát minh ngày hôm nay, sẽ có sự phân tách rõ ràng hơn giữa dữ liệu và lệnh.

Thay vì chỉ đóng cửa sổ đầu cuối hoặc tắt trình giả lập, bạn có thể sử dụng resetlệnh , nó sẽ gửi một lệnh tương tự (hoặc một số) để đặt lại thiết bị đầu cuối trở lại mặc định.

Tôi không biết chính xác điều gì sẽ khiến băm thay đổi. (Nhưng @ Random832 thì thấy câu trả lời của họ .) Tôi quen thuộc hơn với "bộ ký tự thay thế", có thể thay đổi tất cả các ký tự thành glyphs vẽ đường thẳng. Ngay cả khi điều đó xảy ra, đầu vào từ bàn phím thường không thay đổi, do đó, việc viết resetEntervẫn hoạt động ngay cả khi các ký tự hiển thị là rác hoặc hoàn toàn không. (So ​​với lời nhắc của bạn bị biến thành một loạt các dòng, bạn chỉ có một hiệu ứng nhỏ.)


1
Cảm ơn bạn đã giải thích chi tiết. Tôi sẽ bỏ phiếu ngay khi tôi có danh tiếng cần thiết.
lhermann

2
Khi tôi lần đầu tiên thử cat /dev/urandomtrong bảng điều khiển cài đặt Debian (độ phân giải màn hình mang đến phần cứng bị gạch), tôi nghĩ rằng tôi đã kích hoạt một lỗi tràn và nhanh chóng điều hướng theo cách của tôi đến nút "từ bỏ tất cả các thay đổi, khởi động lại máy". Bây giờ tôi biết đó là một "tính năng dự định".
wizzwizz4

2
Đây là một tính năng có ý nghĩa lịch sử mà bây giờ không mong muốn. Một số trình giả lập thiết bị đầu cuối (tất cả đều tốt) nên vô hiệu hóa thoát khỏi bộ chuyển đổi ký tự kế thừa khi chạy trong môi trường UTF-8, nhưng liệu chúng có làm như vậy không và cách bạn kích hoạt tùy chọn để làm như vậy nếu không mặc định, được ghi lại kém và khác nhau
R ..

78

Đối với bản ghi, để trả lời tại sao điều này xảy ra và làm thế nào nó có thể được sửa mà không đóng thiết bị đầu cuối (và nếu resetthất bại):

Nhiều thiết bị đầu cuối hỗ trợ, như một tính năng của thiết bị đầu cuối VT220 mà chúng đang mô phỏng, một số bộ ký tự thay thế quốc gia dựa trên ISO 646ISO 2022 . Đặc biệt, rất phổ biến vì một số lý do, ngay cả khi những người khác không hỗ trợ, họ sẽ hỗ trợ bộ ký tự Anh, có ký hiệu tiền tệ ở cùng vị trí nơi ASCII có ký hiệu số.

Vì vậy, khi bạn in một tệp nhị phân đến thiết bị đầu cuối, một số sự trùng hợp ngẫu nhiên xuất ra chuỗi ESC ( A[hoặc có lẽ ESC ) A^N] cho thiết bị đầu cuối. Điều này có thể được hoàn tác thủ công bằng cách in trình tự đặt nó về trạng thái bình thường:

printf '\e(B\e)0\x0f'

Tôi đoán một cái gì đó như thế này, mà không biết chi tiết. Cám ơn vì đã giải thích. Thật tuyệt vời khi có những người như bạn xung quanh!
lhermann

1
Ôi trời ơi, những con mòng biển thay cho Ä và Ö ... Và Terminal trên OS X thậm chí còn hỗ trợ sự thay thế đó, vào năm 2016. Nếu tôi chỉ có một upvote khác để tặng.
ilkkachu

@ilkkachu một số thiết bị đầu cuối hỗ trợ chúng (tôi biết Putty và tôi cũng nghĩ rằng bảng điều khiển Linux) từ chối chúng khi UTF-8 được sử dụng, bởi vì ISO 2022 nói rằng các trình tự khác (ngoài ESC % @) sẽ không được hỗ trợ khi ở trạng thái được sử dụng để hỗ trợ UTF-8. Vì vậy, cuối cùng chúng có thể biến mất khi nhiều ứng dụng buộc phải sử dụng UTF-8 để vẽ đường thẳng [đây là cách sử dụng thực tế được sử dụng rộng rãi nhất của tính năng này, các ký tự khác chủ yếu được đưa vào vì nó "miễn phí" khi bạn triển khai cơ chế ].
Random832

20
Thật dễ dàng để nhớ các chuỗi thoát này: "A" là viết tắt của tiếng Anh, "B" là viết tắt của "American": D
egmont

8
@egmont Tôi đã nghiên cứu vấn đề này, hóa ra, họ được chỉ định tuần tự theo thứ tự họ đã đăng ký với ISO. Đầu tiên là phiên bản tham chiếu quốc tế cũ [với ¤for $] là @, và sau đó phiên bản người Anh đã xảy ra trước phiên bản người Mỹ. Itscj.ipsj.or.jp/itscj_english/index.html cho danh sách tất cả chúng.
Random832

30

Đóng thiết bị đầu cuối và mở một cái mới.


19
Bạn không nên. Câu hỏi có giá trị. Có lẽ ai đó sẽ giải thích tại sao điều này xảy ra chi tiết. Đây phải là một lỗ hổng trong Bash. £ngồi dưới cùng một phím như #chỉ có nó được gọi với Alt. Bằng cách nào đó Altở lại Bash. Dù sao đi nữa, bạn có thể chờ đợi một lời giải thích thích hợp, hoặc nếu bạn hài lòng với câu trả lời của tôi, nhấp vào kiểm tra để chấp nhận nó.
Tomasz

1
Hay đúng hơn là không phải ở Bash, mà là trong chương trình thiết bị đầu cuối. Tôi đã thử tương tự trên một dòng lệnh bên ngoài GUI và nó lặp lại mãi mãi.
Tomasz

5
@Xalious, câu hỏi nói rằng vấn đề xuất hiện khi anh cated /bin/bashđến thiết bị đầu cuối.
ilkkachu

2
Random832 đã đưa ra một lời giải thích tốt về những gì thực sự đã xảy ra
lhermann

16
Đây là quá mức cần thiết - nếu bạn có một số trạng thái trong phiên mà bạn muốn giữ thì sao? Điều gì nếu đó là một giao diện điều khiển chứ không phải là một thiết bị đầu cuối X? resetlà công cụ phù hợp cho công việc.
pericynthion


9

stty sanedường như để khắc phục vấn đề cũng như resetđã làm.


7

Không cần phải đóng và mở lại hoặc đặt lại thiết bị đầu cuối của bạn! Mặc dù thiết lập lại sẽ hoạt động nhưng đây không phải là cách thích hợp!

Bạn chỉ cần xóa / xóa bộ đệm cuộn thiết bị đầu cuối của bạn . Để làm như vậy, chỉ cần sử dụng lệnh dưới đây:

$ echo -ne '\0033\0143'

1
Bạn có một lời giải thích cho phép lạ này?
Tomasz

1
@tomas Có bạn đời cho chắc chắn. khi -ecó hiệu lực, nó sẽ nhận ra một số chuỗi bạn có thể đọc bằng cách chạy man echo, một trong số đó là \0NNNviết tắt của byte với giá trị bát phân NNN. Trong thực tế, bạn không cần phải đặt lại phiên cuối, bạn chỉ cần XÓA bộ đệm cuộn của bạn. Và lệnh tôi đã nói sẽ làm công việc cần thiết. Ví dụ: nếu bạn đang sử dụng MacOS X, có thanh Chỉnh sửa trong thanh menu trong khi sử dụng thiết bị đầu cuối và có một tùy chọn là "Xóa cuộn ngược hoặc ⌥⌘K".
FarazX

5
Trình tự \033\143là ESC c, Đặt lại về Trạng thái ban đầu : "Đặt lại VT100 về trạng thái ban đầu, nghĩa là trạng thái sau khi được bật. Điều này cũng gây ra việc thực hiện tự kiểm tra bật nguồn và báo hiệu INIT H được khẳng định ngắn gọn. "
deltab

1
@deltab Mình quên nhắc đến ESC, cảm ơn một triệu bạn đời.
FarazX

1
@tomas Bất cứ khi nào bạn cố gắng hiển thị một tệp không được hiển thị - ví dụ: tệp nhị phân - thiết bị đầu cuối sẽ hành động kỳ quặc và khó xử. Nhiều người dùng Linux thực hiện thiết lập lại, nhưng đó không phải là lựa chọn tốt nhất vì không cần thiết lập lại phiên cuối và tất cả các bộ đệm cuộn lại đều cần thiết.
FarazX
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.