Tại sao không `echo abc ^ H` chỉ in` ab`?


7

Như tôi nhớ, ^Hcó nghĩa là Backspace. Tôi tạo ra nó bằng cách nhấn CTRL+V, CTRL+H.

Vì vậy, ^Hnên loại bỏ ký tự cuối cùng, vì nó giống như Backspacevà nó sẽ hoạt động giống như khi tôi nhấn Backspacevào vị trí này.

Tại sao đầu ra của echo abc^Hvẫn còn abcvà không ab?


^Hcó nghĩa là "con trỏ bên trái một".
Ignacio Vazquez-Abrams

Câu trả lời:


17

backspace chỉ di chuyển con trỏ lùi lại.

backspace(hoặc deletebất kỳ ký tự nào tùy thuộc vào cấu hình) chỉ xóa ký tự được in cuối cùng khi các điều kiện này được đáp ứng:

  • nó được gõ trên bàn phím, không phải là đầu ra lệnh như echotrong ví dụ của bạn
  • thiết bị đầu cuối ở chế độ nấu (trường hợp thông thường)

Nếu bạn muốn xóa ctrong ví dụ của mình, bạn cần ghi đè lên nó bằng một ký tự khác, ví dụ:

echo "abc^H "

Btw thậm chí echo "abc^H "không làm việc cho tôi, tuy nhiên echo -e "abc\b "đã làm. Tôi không thể hiểu tại sao ^Hkhông làm việc. ps. Vỏ của tôi là bash 4.1.5.
vội vàng

2
@Rush: Đảm bảo bạn nhập ^Hbằng cách nhập Ctrl-V,Ctrl-H
jlliagre

về mặt kỹ thuật: nếu chế độ nấu (trong trình điều khiển) hoặc một cái gì đó hoạt động như chế độ nấu như bash + readline.
dave_thndry_085

0

Bằng cách nhập ^ V ^ H, bạn đang chèn mã Backspace trong chuỗi, không phát lệnh Backspace. ^ H không bắt buộc phải là một backspace phá hoại; một số phần mềm sử dụng nó để in đè.

Suy nghĩ lại: Người tạo ra tiếng vang (1) lý do rằng nếu bạn nhập ^ V và mã điều khiển, bạn làm như vậy vì bạn muốn một quy trình khác, không phải tiếng vang (1), để phân tích mã điều khiển. Trong trường hợp Ctrl-H, echo (1) đặt 0x08 vào chuỗi đầu ra và hiển thị rằng với dấu mũ và H. Nếu chuỗi được chuyển hướng đến thứ gì đó PARSES 0x08 làm khoảng lùi bị phá hủy trong INPUT của nó, bạn có thể nhận được kết quả như ý.


Câu trả lời được chấp nhận đã nói như vậy.
RalfFriedl

echo (1) không làm những điều này; trình điều khiển đầu cuối và / hoặc shell thực hiện, sau đó chuyển kết quả (một byte có giá trị 0x08) sang echo (1) chỉ xuất ra nó giống như bất kỳ mã ký tự nào khác. Tương tự như vậy trong bash, ksh, Zsh bạn có thể sử dụng $'\b'vỏ cải để một 0x08 và chuyển đến chương trình hoặc lệnh khác.
dave_thndry_085

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.