Câu trả lời ngắn: lệnh dựng sẵn fc
(lệnh fix) của bash
fc
là lệnh, được tích hợp trong bash shell, được thực hiện để chỉnh sửa & thực hiện lại các lệnh của lịch sử.
Nó cũng có mặt trên CygWin và nó hoạt động trên tất cả các bản phân phối Linux mà tôi đã thử nghiệm:
fc -s '\'='/' -1
Một số giải thích
Một số từ thêm về lý do tại sao bạn nhận được "thay thế thất bại"
Có vẻ như đối với công cụ s
sửa đổi chưa (chưa) thực hiện thay thế ký tự dấu gạch chéo ngược \
, đó là lối thoát. Để chắc chắn, chúng ta sẽ thấy mã, ví dụ, phiên bản gnu của bản mở rộng lịch sử bash (nhưng có lệnh trên để có được những gì bạn đang cố gắng làm ... vì vậy tôi lười biếng ....).
Một số lưu ý:
Chúng tôi có thể nghĩ rằng nó sẽ hoạt động với mỗi RegEx mà chúng tôi thấy đang hoạt động sed
, nhưng nó không được bảo đảm. Dấu gạch chéo ngược là ký tự thoát của bản mở rộng và vấn đề nằm ở đây. Ngoài ra, hành vi của việc mở rộng có liên quan đến các shopt
tùy chọn, vì vậy chúng ta nên bắt đầu xem từng trường hợp ...
Khi bạn dán chuỗi cd C:\Foo\Bar
vào bash shell, nó sẽ được mở rộng và nó sẽ xuất hiện cho trình thông dịch như cd C:FooBar
; ở dạng này, nó cũng sẽ được lưu trong $_
biến nội bộ.
Nếu bạn thay vì dán cd "C:\Foo\Bar"
hoặc cd 'C:\Foo\Bar'
trong $_
biến bạn nên tìm C:\Foo\Bar
.
Vì việc mở rộng Lịch sử được thực hiện ngay lập tức sau khi đọc một dòng hoàn chỉnh, trước khi trình bao phá vỡ nó thành từ, bạn có thể bị bắt đầu sử dụng nó với một số bashism ít nhiều, ví dụ, với một số dẫn xuất từ (có thể thêm :p
hoặc :q
, ""
, phân tích cú pháp và vân vân ...)
!!:0 ${_//\\/\/}
Đây là thời điểm cần nhớ rằng không an toàn khi bắt đầu chơi với đường dẫn và tên tệp , đặc biệt nếu chúng đến từ bảng tạm của windows (đọc chung trang Tại sao không phân tích ls
?, Về cơ bản liên quan đến khả năng sử dụng tab, dấu cách và dòng mới dưới dạng ký tự chính xác cho tên tệp và thư mục ...).
Ngoài ra, khi bạn dán một văn bản được chụp bằng chuột , bạn cũng có thể dán một không gian hàng đầu. Điều này có thể tránh việc lệnh của bạn sẽ kết thúc trong lịch sử (nó phụ thuộc vào các tùy chọn shell ...). Nếu vậy, sau đây của bạn !!
sẽ là một lệnh không được kiểm soát ... (xem một ví dụ trong câu trả lời khác ).Đây là một rủi ro hữu hình không cần thiết .
Phần kết luận
Mở rộng lịch sử giới thiệu các từ từ danh sách lịch sử vào luồng đầu vào, giúp dễ dàng lặp lại các lệnh, chèn các đối số vào một lệnh trước đó vào dòng đầu vào hiện tại hoặc sửa lỗi nhanh chóng trong các lệnh trước đó.
Nếu nó không dễ dàng tôi bắt đầu nghĩ rằng chúng ta đang làm gì đó sai ;-)
Quảng cáo nauseam: một thử nghiệm nhỏ
Tôi đã kích hoạt histverify
trong trình bao rồi ...
shopt -s histverify
echo C:\Foo\Bar
!!:s|C|D| {1,2}A
sau đó tôi nhấn Entervà khi xác minh mở rộng tôi tìm thấy
echo D:\Foo\Bar {1,2}A
sau đó tôi nhấn Entermột lần nữa và nó lặp lại
D:FooBar 1A 2A
Điều này dường như chỉ ra rằng cái substitution failed
được tạo ra trong bản mở rộng lịch sử được xử lý trước khi mở rộng Brace , vì vậy trước hết , và dường như nó xác nhận rằng bộ s
sửa đổi lịch sử đã không (chưa) xử lý việc thay thế \
nhân vật như một regex thực sự. ..
cd 'C:\foo\bar'