Tôi có thể định cấu hình bash để thực thi xóa Clear rõ ràng trước khi mỗi lệnh được nhập trong bảng điều khiển không?


22

Tôi muốn cấu hình bash để thực thi clearlệnh mỗi khi tôi gõ một số lệnh trong terminal (trước khi thực hiện lệnh của mình). Làm thế nào tôi có thể làm điều đó?

Tôi đang sử dụng Debian Linux.


Bạn thấy chủ đề này hữu ích.
Thor

3
Chỉ tò mò: ứng dụng của bạn cho việc này là gì? Ngoại trừ khi tôi gỡ lỗi các chương trình có nhiều đầu ra, tôi thường muốn giữ càng nhiều càng tốt trên màn hình để giúp tôi theo dõi bối cảnh tôi đang làm việc.
Joe

Câu trả lời:


22

Bash có một hook preommand . Sắp xếp

preexec () {
  clear
}
preexec_invoke_exec () {
    [ -n "$COMP_LINE" ] && return                     # do nothing if completing
    [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
    local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`; # obtain the command from the history, removing the history number at the beginning
    preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG

Gilles: Tôi đã dán phần trên vào một thiết bị đầu cuối konsole và đầu ra từ mỗi lệnh mà sau đó tôi đã nhập đã bị xóa trước khi tôi có thể đọc nó. Tui bỏ lỡ điều gì vậy? Ngoài ra, điều gì xảy ra cho điều này (và câu trả lời khác bên dưới) nếu tôi gọi một tập lệnh bash nhiều dòng trong đó có nhiều hơn một dòng (hoặc bất kỳ dòng nào ngoài dòng cuối cùng) tạo ra kết quả thú vị?
Joe

@Joe Điều này sẽ xóa màn hình sau khi bạn nhấn Enter, trước khi thực hiện lệnh. Nó hoạt động như thế này đối với tôi. Móc preexec được thực thi cho mỗi lệnh tương tác, không quan trọng là lệnh đó là lệnh tích hợp hay lệnh bên ngoài hoặc nhiều lệnh.
Gilles 'SO- ngừng trở nên xấu xa'

1
@Joe bạn cần thêm dòng này dưới đây không làm gì nếu hoàn thành [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;vấn đề là PROMPT_COMMAND đang được chạy và cũng bị mắc kẹt sau lệnh thực tế; Ngoài ra ai đó có thể cho tôi biết tại sao local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;là ở đây?
MageProspero

@JamesAndino history -1in dòng lệnh cuối cùng, với số lịch sử ở phía trước. Bộ lọc sed thoát khỏi số lịch sử.
Gilles 'SO- đừng trở nên xấu xa'

@JamesAndino Điều đó đã khiến nó hoạt động (và tôi thấy Giles đã thêm nó vào câu trả lời của mình.)
Joe

6
bind 'RETURN: "\e[1~clear; \e[4~\n"'

Sau đó, mỗi lần bạn nhấn returnthay vì chỉ viết, \nnó sẽ di chuyển đến đầu dòng, nhập văn bản clear;, sau đó di chuyển đến cuối và nhập \nnhư mong đợi.


2
Một dòng mới làm cho dấu nhắc được in bằng mọi cách, do đó, việc xóa dấu nhắc trong dấu nhắc sẽ hoàn thành điều tương tự mà không làm ô nhiễm lịch sử clearlệnh bằng các lệnh.
jw013

2
@ jw013 Sự khác biệt là trong trường hợp của tôi clearđược thực thi trước khi lệnh và đầu ra lệnh không biến mất. Tuy nhiên trong trường hợp với dấu nhắc nó không.
vội vàng

Tôi ước có một số cách để làm điều này mà không phải sửa đổi dòng lệnh - tôi chắc chắn rằng điều này sẽ phá vỡ theo những cách thú vị trên các lệnh phức tạp hoặc nhiều dòng nhưng tôi không thể tìm thấy cách nào tốt hơn để làm điều này.
jw013

@ jw013, bạn nói đúng, nó không ngắt cho nhiều dòng .. Nó chèn clear;vào đầu ra cho mỗi phần phụ \n.
Peter.O

Mẹo này rất tốt thx !! Tôi cần liên kết một số mã cụ thể với F2, nhưng đôi khi dòng có một số lệnh tôi đã nhập nhưng không được thực thi, vì vậy với ví dụ này: bind "\"\\eOQ\":\"\e[1~ls;#\\n\""nó sẽ chuyển đến đầu, gõ ls;#nhận xét những gì đã có và chạy lslệnh đúng! cám ơn!
Sức mạnh Bảo Bình

2

từ một câu hỏi tôi đã hỏi ngày hôm nay (với tín dụng cho câu trả lời của người dùng @ aeccar ):

bind '"\C-m": "\C-l\C-j"'

Các \C-mmô phỏng 'Enter', các \C-lmô phỏng Ctrl+lvì nó rõ ràng và \C-jlà "newline-và-indent", do đó lệnh được ràng buộc phím Enter để Ctrl + l & Ctrl + j

hoạt động trên GNU bash, phiên bản 3.2.53 (1) -release (x86_64-apple-darwin14) và các câu trả lời khác về chủ đề này thì không. Ngoài ra, điều này không gây ô nhiễm lịch sử với các lệnh 'xóa' mọi lệnh khác.


1
lưu ý: nếu sử dụng trên ssh, bạn phải thực thi nó trong môi trường đó hoặc điều kỳ lạ xảy ra.
TRB

Xin chào, nó hoạt động trên thiết bị đầu cuối Ubuntu 16.04 của tôi, cảm ơn, nhưng nó hoạt động như thế nào, bạn có thể cung cấp một liên kết hoặc một số tài liệu xin vui lòng?
Andrzej Rehmann
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.