콘솔에 모든 명령을 입력하기 전에 "clear"를 실행하도록 bash를 구성 할 수 있습니까?


22

clear터미널에 명령을 입력 할 때마다 명령 을 실행하도록 bash를 구성 하고 싶습니다 (명령을 실행하기 전에). 어떻게해야합니까?

데비안 리눅스를 사용하고 있습니다.


당신은 발견 스레드가 유용합니다.
Thor

3
궁금한 점은 무엇입니까? 출력이 많은 프로그램을 디버깅 할 때를 제외하고는 보통 작업중인 컨텍스트를 추적하는 데 도움이되도록 화면에 최대한 많이 유지하려고합니다.
Joe

답변:


22

Bash에는 precommand hook이 있습니다. 일종의.

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 : 위의 내용을 konsole 터미널에 붙여 넣었고 이후에 입력 한 각 명령의 출력이 지워져서 읽을 수있었습니다. 뭔가 빠졌습니까? 또한 둘 이상의 줄 (또는 마지막 줄 이외의 줄)이 흥미로운 결과를 생성하는 여러 줄 bash 스크립트를 호출하면이 (및 아래의 다른 대답)는 어떻게됩니까?
Joe

@Joe Enter명령을 실행하기 전에을 누른 후 화면을 지워야합니다 . 그것은 나를 위해 이렇게 작동합니다. 사전 실행 후크는 각 대화식 명령에 대해 실행되며 명령이 내장 명령인지 외부 명령인지 또는 많은 명령인지는 중요하지 않습니다.
Gilles 'SO- 악한 중지'

1
당신이 완전한 경우 아무것도하지 않고 노호이 줄을 추가해야 @Joe [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;문제가 PROMPT_COMMAND 실제 명령 다음에 갇혀도되고 실행하고 있다는 것이다; 또한 왜 local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;여기에 있는지 말해 줄 수 있습니까 ?
MageProspero 2016 년

@JamesAndino history -1는 마지막 명령 행을 히스토리 번호 앞에 인쇄합니다. sed 필터는 기록 번호를 제거합니다.
Gilles 'SO- 악마 그만'

@JamesAndino 그것이 작동하게 만들었습니다 (그리고 Giles가 그의 답변에 추가 한 것을 보았습니다)
Joe

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

그런 다음 return글을 쓰지 않고 누를 때마다 \n줄의 시작 부분으로 clear;이동 하고 텍스트를 입력 한 다음 끝으로 이동하여 \n예상대로 입력하십시오 .


2
줄 바꿈을 사용하면 프롬프트가 어쨌든 인쇄되므로 프롬프트를 명확하게 표시 하면 명령으로 명령 내역을 오염시키지 않고 동일한 작업 수행 할 수 clear있습니다.
jw013

2
@ jw013 차이점은 내 경우 clear에는 명령 전에 명령이 실행되고 명령 출력이 사라지지 않는다는 것입니다. 그러나 프롬프트가있는 경우에는 그렇지 않습니다.
러시

명령 줄 자체를 수정하지 않고도이 작업을 수행 할 수있는 방법이 있었으면 좋겠습니다. 복잡하거나 여러 줄 명령에서 흥미로운 방식으로 실패 할 것이라고 확신하지만 더 좋은 방법을 찾을 수는 없습니다.
jw013

@ jw013, 맞습니다. 여러 줄에 끊어 집니다. clear;각 여분의 출력에 삽입 합니다 \n.
Peter.O

이 팁은 아주 좋은 것입니다! 특정 코드를 F2에 바인딩해야했지만 때로는 행에 입력했지만 실행되지 않은 일부 명령이 있습니다.이 ex와 함께 bind "\"\\eOQ\":\"\e[1~ls;#\\n\""시작 부분으로 이동하고 ls;#거기에 무엇이 있는지 주석을 입력 하고 ls명령을 올바르게 실행합니다 ! 고마워!
물병 자리 힘

2

오늘 내가 물었던 질문에서 ( @aecolley의 답변에 대한 크레딧으로 ) :

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

\C-m의 '입력'키를 시뮬레이션 \C-l시뮬레이션 Ctrl+l이 분명하고 같이 \C-j있다 "줄 바꿈 및 들여 쓰기"명령은 Ctrl 키 + 1 및 Ctrl 키 + J 키를 입력 구속력이 있도록

GNU bash 버전 3.2.53 (1)-릴리스 (x86_64-apple-darwin14)에서 작동하지만이 스레드의 다른 답변은 그렇지 않습니다. 또한 이것은 다른 명령마다 'clear'명령으로 기록을 오염시키지 않습니다.


1
참고 : over ssh를 사용하는 경우 해당 환경에서 실행해야하거나 이상이 발생합니다.
TRB

그것은 내 우분투 16.04 터미널에서 작동하지만 감사합니다. 어떻게 작동합니까? 링크 또는 문서를 제공 할 수 있습니까?
Andrzej Rehmann

0

원할 때만 지우기를 고려하십시오.

cb4() {
  preexec () {
    clear
  }
}

이것은라는 후크를 사용하고 preexeczsh에서도 작동합니다.

그런 다음 모든 명령을 실행하기 전에 자동으로 지우려는 세션 : cb4

확실하다면 항상 모든 상황에서 정리하고 싶습니다

preexec () {
  clear
}

실제로 터미널을 재설정하려는 경우

단어를 clear바꾸다tput reset

tput 선택 사항이지만 재설정 프로세스 속도를 높입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.