Làm cách nào để chỉnh sửa lệnh shell hiện tại mà không thực hiện nó?


13

Dường như có khá nhiều thông tin về cách chỉnh sửa và thực thi lệnh bằng trình soạn thảo của bạn bằng cách sử dụng "edit-and-exec-Command (Cx Ce)", nhưng những gì tôi muốn đạt được là sử dụng lệnh shell hiện tại, áp dụng một số bộ lọc nhất định (sử dụng tập lệnh) và sau đó trả lại cho dấu nhắc để phê duyệt thêm / thay đổi thủ công trước khi thực hiện. Điều này có thể với bash?


Đây không phải là câu trả lời đúng cho câu hỏi, nhưng hãy thử sử dụng thiết bị đầu cuối ZSH thay vì Bash gốc. Nó đã tự động hoàn thành nên không thực hiện lệnh ngay lập tức. Cá nhân tôi đã thử kịch bản cụ thể này và nó luôn yêu cầu tôi nhấn enter bất cứ khi nào tôi làm a edit-and-execute-command.
Praveen Premaratne

1
Phím tắt phù hợp với tôi là Escape+ V, nhưng nó vẫn sẽ thực thi lệnh. Vì vậy, đối với cách giải quyết, tôi sẽ thêm echovào phía trước để thực thi nó bằng cách in lệnh vào bàn điều khiển để xem xét.
kenorb

2
bạn có thể làm một ví dụ cụ thể? Tôi không hiểu "áp dụng bộ lọc nhất định (sử dụng tập lệnh) và sau đó trả lại cho dấu nhắc".
Kent

3
@PraveenPremaratne: zsh không phải là thiết bị đầu cuối , nó là vỏ .
Arkadiusz Drabchot

Câu trả lời:


7

Cập nhật mới nhất về kinh nghiệm của tôi

Phần 0"+y$ddtrong ánh xạ sau đây thực sự là một cái gì đó mà bạn nên suy nghĩ cẩn thận và điều chỉnh nó theo sở thích / quy trình làm việc / kinh nghiệm của bạn.

Chẳng hạn, rất thường xuyên tôi thấy mình kết thúc với nhiều dòng trong bộ đệm, nơi tôi chỉ muốn thực thi một con trỏ đang bật; trong trường hợp này tôi có thể sử dụng 0"+y$dd:%d<CR>thay vì 0"+y$dd.

Và đây chỉ là một trong những tình huống có thể xảy ra.

Câu trả lời cuối cùng cho những ai thích vim

Câu trả lời gốc

Tôi thường cần phải làm như vậy, và tôi làm như sau. (Tôi thường sử dụng set -o vitrong bash, vì vậy điểm 1 và 2 trong những điều sau đây là khác nhau nếu bạn sử dụng set -o emacs, mặc định; dựa trên câu hỏi của bạn có vẻ như điểm 1 và 2 được thống nhất trong Ctrl+ xtiếp theo Ctrl+ e, đó là khó khăn hơn để gõ, IMHO .)

  1. nhấn Escapeđể ở chế độ bình thường,
  2. nhấn vđể vào trình chỉnh sửa để chỉnh sửa lệnh,
  3. chỉnh sửa lệnh theo ý muốn,

(Đây là nơi bạn đặt câu hỏi.)

  1. đánh Escape0"+y$dd:wq,
    • Lưu ý : 0"+y$, không chỉ đơn giản "+yy, vì sau này cũng sẽ sao chép dòng mới và điều này sẽ dẫn đến việc thực thi lệnh khi dán nó trong dòng lệnh,
  2. dán bảng tạm vào dòng lệnh
    • Làm thế nào để làm điều này phụ thuộc vào thiết bị đầu cuối bạn đang sử dụng, tôi đoán; Tôi nhấn Ctrl+ Alt+ vvào URxvt.
  3. tiến hành phê duyệt / chỉnh sửa thủ công.

Rõ ràng đây chỉ là một cách giải quyết, bao gồm sao chép lệnh đã chỉnh sửa vào bảng tạm trước khi xóa toàn bộ lệnh, để không có gì được thực thi khi thoát khỏi trình soạn thảo; tuy nhiên đó là điều tốt nhất tôi có thể có được cho bản thân mình.

Cập nhật

EDITOR(và VISUAL) của tôi bằng vim, khi tôi chỉnh sửa lệnh, tôi chỉnh sửa nó trong vim.

Về mặt này, tôi đã nhận thấy rằng bộ đệm được đặt tên /tmp/bash-fc.random, trong đó randomlà một chuỗi ngẫu nhiên gồm 6 ký tự chữ và số.

Điều này mang lại không gian cho rất nhiều khả năng, nếu bạn sử dụng vimlàm trình soạn thảo của mình, vì bạn có thể xác định một số ánh xạ trong bạn .vimrcđể thực hiện toàn bộ chuỗi Escape0"+y$dd:wq. Chẳng hạn, một lệnh mà bạn hiếm khi sử dụng khi chỉnh sửa một dòng lệnh là Leaderd; do đó bạn có thể đặt mapping sau vào .vimrctệp của mình

au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>

để bước 4 trong công thức trên trở thành

  1. đánh EscapeLeaderd

Đối với tôi đây là cách tốt nhất để chỉnh sửa các lệnh
A.Villegas

2

Không thể làm điều đó trong Bash / readline nhưng trong zsh có thể sử dụng edit-command-linelệnh:

darkstar% autoload edit-command-line; zle -N edit-command-line
darkstar% bindkey "^X^E" edit-command-line

Bây giờ nhấn Control- x Control- eđể mở trình soạn thảo của bạn, chỉnh sửa dòng, rời khỏi trình chỉnh sửa - bạn sẽ thấy dòng lệnh được cập nhật nhưng nó sẽ không được thực thi tự động.


1

Bây giờ tôi nghĩ về nó, có lẽ một biến thể của những gì @kenorb đề xuất trong một bình luận là cách giải quyết tốt nhất (vì dường như không có giải pháp nào tồn tại), nếu chúng ta muốn bám vào bash.

Những gì bạn có thể làm là thêm một #(ký tự nhận xét bash) vào lệnh, chứ không phải echo. Sau đó, khi bạn thoát khỏi exitor, lệnh sẽ không hiệu quả và bạn sẽ chỉ phải nhấn arrow up(hoặc k, nếu bạn sử dụng set -o vi), xóa #và xác nhận.

Lưu ý rằng chiến lược này chỉ thêm một vài lần nhấn phím, vì vậy nó có thể khá hiệu quả, tùy thuộc vào mức độ gõ của bạn.


1

Những mảnh này có thể giúp bạn đến gần hơn:

a) thay thế các ràng buộc thông thường cho dòng mới dòng (ctrl-M) bind -x '"\C-M":date"

b) lấy dòng hiện tại từ lịch sử bằng cách sử dụng !#

thay thế ngày bằng bất cứ kịch bản nào bạn muốn

c) chỉnh sửa thủ công

d) nếu cần thiết, bằng cách nào đó buộc trong !!:pđó in lệnh mới vào dòng lệnh nhưng không thực thi nó, do đó cho phép bạn chỉnh sửa thủ công.

e) sử dụng ctrl-J gửi lệnh đã chỉnh sửa thay vì dòng mới

hoặc họ có thể không ....


1

Có một tùy chọn trong bash để sửa đổi lệnh từ lịch sử mà không thực hiện nó. Tôi không chắc có thể sử dụng tập lệnh cho việc này, dường như không có khả năng. Mặc dù, bạn có thể thực hiện sửa đổi bằng cách sử dụng sửa đổi lịch sử.

  1. Cho phép tùy chọn histverify để ngăn thực thi lệnh đã sửa đổi
  2. Sử dụng chuỗi sửa đổi để thay đổi lệnh cuối cùng
  3. Sử dụng "!!" để đưa kết quả của bạn vào dòng lệnh để chỉnh sửa cuối cùng

Đây là cách nó trông:

$ shopt -s histverify
$ ls *.sh
script1.sh  script2.sh  script3.sh  script-return.sh
$ !!:s/*/script1/:p
ls script1.sh
$ !!:s/1/2/:p
ls script2.sh
$ !!
$ ls script2.sh
script2.sh

1

Tôi muốn chỉ cho bạn đến Composure khuôn khổ cho Bash (tôi không liên kết với nó): https://github.com/erichs/composure

Nó cung cấp draftvà các revisechức năng nghe có vẻ như có thể giúp với những gì bạn đang cố gắng thực hiện. Đây là một trích dẫn (dài) từ tệp readme của dự án:

Sự điềm tĩnh giúp bằng cách cho phép bạn nhanh chóng phác thảo các hàm shell đơn giản, phá vỡ các bộ lọc đường ống dài và các lệnh phức tạp thành các phần có thể đọc và tái sử dụng.

Dự thảo trước, đặt câu hỏi sau

Khi bạn đã tạo ra lệnh của bạn, đừng vứt nó đi! Sử dụng draft ()và đặt cho nó một cái tên tốt. Điều này lưu trữ lệnh cuối cùng của bạn như là một chức năng bạn có thể sử dụng lại sau này. Hãy nghĩ về nó như một bản nháp thô.

  $ cat servers.txt
  bashful: up
  doc: down

  up-arrow

  $ cat servers.txt | grep down
  doc: down

  $ draft finddown

  $ finddown | mail -s "down server(s)" admin@here.com

Sửa lại, sửa lại, sửa lại!

Bây giờ bạn đã có một hàm shell tối thiểu, bạn có thể muốn làm cho nó tốt hơn thông qua tái cấu trúc và sửa đổi. Sử dụng revise ()lệnh để sửa lại chức năng shell của bạn trong trình soạn thảo yêu thích của bạn.

  • khái quát hóa các chức năng với các tham số đầu vào
  • thêm hoặc xóa chức năng
  • thêm siêu dữ liệu hỗ trợ cho tài liệu

    $ revise finddown
    finddown ()
    {
      about finds servers marked 'down' in text file
      group admin
      cat $1 | grep down
    }
    
    $ finddown servers.txt
    doc: down

0

Dường như không thể với phím tắt, ít nhất là:

$ bind -P | grep -e command -e edit
complete-command can be found on "\e!".
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
possible-command-completions can be found on "\C-x!".
vi-editing-mode is not bound to any keys
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.