긴 줄을 다음 줄로 줄이려면 어떻게해야합니까?


108

내가 오랫동안 실망스럽게 생각한 우분투에서 오랫동안 알아 차린 것은 새로운 줄로 줄 바꿈하는 대신 터미널 너비보다 길어지는 명령 줄에 명령을 입력 할 때입니다. 같은 줄에 1 열을 입력하고 내 명령 줄의 시작 부분을 덮어 쓰기 시작합니다. (실제로 실제 명령을 덮어 쓰지는 않지만 시각적으로 표시된 텍스트를 덮어 씁니다).

그것을 보지 않고 설명하기는 어렵지만 터미널의 너비가 20 자 (내가 120 자와 비슷하지만 예제를 위해)라고 가정하고 영어 알파벳을 에코하고 싶습니다. 내가 입력 한 내용은 다음과 같습니다.

echo abcdefghijklmnopqrstuvwxyz

그러나 키를 누르기 전에 터미널이 어떻게 보이는지는 다음과 같습니다.

pqrstuvwxyzghijklmno

내가 엔터를 치면

abcdefghijklmnopqrstuvwxyz

명령이 제대로 수신되었음을 알고 있습니다. 방금 "o"뒤에 입력 내용을 감싼 후 같은 줄에서 다시 시작했습니다.

너비가 20 자에 불과한 터미널에이 명령을 입력하면 다음과 같이됩니다.

echo abcdefghijklmno
pqrstuvwxyz

배경 : bash를 쉘로 사용하고 있으며 ~ / .bashrc에 다음 줄이 있습니다.

set -o vi

VI 명령으로 명령 행을 탐색 할 수 있습니다. 현재 Ubuntu 10.10 서버를 사용하고 있으며 Putty를 사용하여 서버에 연결하고 있습니다.

다른 환경에서 긴 명령 줄을 입력하면 명령이 터미널 너비보다 길어지고 입력을 계속하면 명령을 볼 수있는 줄 아래에 새 줄이 추가됩니다. 2 가지 라인. 그러나 우분투를 사용하는 것을 기억할 수있는 한, 긴 명령은 한 줄만 차지합니다.

이것은 또한 역사에서 이전 명령으로 돌아갈 때 발생합니다 (Esc를 누르고 이전 명령으로 돌아가려면 'K'를 누르십시오)-터미널 너비보다 긴 이전 명령에 도달하면 명령 줄이 나타납니다. 엉망으로 명령에서 내가 어디에 있는지 알 수 없습니다.

전체 긴 명령을 볼 수있는 유일한 해결 방법은 "Esc-V"를 누르면 VI 편집기에서 현재 명령이 열립니다.

내 .bashrc 파일에 이상한 점이 없다고 생각합니다. "set -o vi"줄을 주석 처리했는데 여전히 문제가있었습니다.

새 Putty 사본을 다운로드했지만 구성을 변경하지 않았습니다. 연결하기 위해 호스트 이름을 입력했지만 여전히 문제가 있으므로 Putty와 관련이 없다고 생각합니다 (필요한 경우가 아니면) 구성을 변경하십시오.)

다른 사람 이이 문제를 겪었습니까? 누구 든지이 문제를 해결하는 방법을 생각할 수 있습니까?

편집하다

내 .bashrc 파일이었습니다. 컴퓨터에서 컴퓨터로 동일한 프로파일을 복사했으며 $ PS1에 특수 문자를 사용하여 어떻게 든 버렸습니다. 이제 $ PS1에 대한 표준 bash 변수를 고수하고 있습니다.

.bashrc의 팁에 대한 @ ændrük 감사합니다!

... 편집 종료 ...


1
문제가 .bashrc 파일로 인한 것이 아닌지 확인하기 위해 일시적으로 /etc/skel/.bashrc. 복사본으로 교체하는 것이 좋습니다 . 변경 사항을 적용하려면 다시 연결해야하며 자신의 .bashrc 백업을 유지해야합니다.
ændrük

1
어떤 터미널 응용 프로그램을 사용하고 있습니까? 당신이 묘사하는 행동은 평범하지 않으며, 반드시 기본값이 아닙니다.
João Pinto 2019

내가 작업 한 셸 (및 Cisco CLI)에서도 화면이 꺼져 있어도 Ctrl-L을 입력하여 입력하는 줄을 다시 표시 할 수 있습니다. 귀하의 상황에서 여전히 깨진 출력이 나올 수 있지만 궁금합니다.
belacqua

3
솔루션을 설명하는 "답변"을 작성하여 수락 된 것으로 표시하십시오. 약간 어리석은 것처럼 보일 수 있지만 적절한 답변을 얻으면 사이트를 체계적으로 정리하고 향후 비슷한 문제가있는 사람들을보다 효과적으로 안내 할 수 있습니다.
ændrük

답변:


136

PS1의 인쇄 할 수없는 모든 바이트가 안에 포함되어 있는지 확인하십시오 \[ \]. 그렇지 않으면 bash는 프롬프트 길이로 계산합니다. 프롬프트 길이를 사용하여 줄을 감쌀시기를 결정합니다.

예를 들어, 여기에서 bash는 프롬프트의 너비를 19 열로 계산하지만 터미널이 표시하는 프롬프트의 너비는 10 열 ( My prompt청록색, >기본 색상)입니다.

PS1='\e[36mMy prompt\e[0m>'         # bash count: 19, actual: 10

여기서는 특수 문자 \[\]이스케이프 사이의 바이트를 무시하기 때문에 프롬프트를 10 열 너비로만 계산합니다 .

PS1='\[\e[36m\]My prompt\[\e[0m\]>' # bash count: 10, actual: 10

그러나 모범 사례를 위해 tput하드 이스케이프 대신 터미널 이스케이프를 생성하는 데 사용하십시오.

cyan=$(tput setaf 6) # \e[36m
reset=$(tput sgr0)   # \e[0m
PS1='\[$cyan\]My prompt\[$reset\]>'

http://mywiki.wooledge.org/BashFAQ/053http://wiki.bash-hackers.org/scripting/terminalcodes 에서 자세한 내용을 참조 하십시오tput .


3
답변이 제공하지 않는 문제에 대한 훌륭한 설명입니다
Jamie Cook

코드의 마지막 줄에 PS1='...'작은 따옴표가 방해하지 않는 이유 : $cyan$reset대체에서?
andrybak

2
@andrybak, 그들은 방지 $cyan하고 $reset대체 하지 않지만 PS1프롬프트가 인쇄 될 때마다 평가됩니다. 시도 PS1='$var> '하여 var다양한 값 을 제공 하고 프롬프트가 어떻게 변경되는지 확인할 수 있습니다. 그런 다음 PS1="$var> " 프롬프트가 정적으로 유지되는지 확인하십시오. $var과제가 진행되는 동안 확장되었으므로 매번 PS1평가되는 것은 아닙니다 .
geirha

1
이것은 놀랍다. 이것을 게시 해 주셔서 감사합니다! 대괄호 탈출이 훨씬 쉽고 읽기 쉽습니다.
phyatt

내가 어떻게이 일을 PS1=${PS1}"\e]2;$@\a". 나는 시도했다PS1=${PS1}"\[\e]2;\]$@\[\a\]"
Ramana Reddy

59

나는 당신이 PS1색상으로 구성했다고 생각합니다 .

색상 세트 앞에 따옴표 \[안에 넣었는지 확인하십시오.PS1

예를 들면 다음과 같습니다.

PS1='\[\e[0;32m\u@\w/:\[\e[m '

내 PS1은 export PS1='^[[96m'$(hostname)'<^[[92m${PWD}^[[96m>^[[97m '-오랫동안 사용했습니다
-KSH

2
와. 나는 터미널 프롬프트를 영원히 사용 해 왔으며 이전에는이 ​​문제가 없었습니다. 결코 알아 차리지 못했을 것입니다. 감사.
bchurchill

3
간단한 인용 부호를 사용하는 동안 \ [를 사용하면 의도하지 않은 슬래시가 생성됩니다. 또한 가장 투표 않음에 명시된 바와 같이, 마법 문자의 끝에서]가 표기
igorsantos07

2
-1 작동하지 않습니다. 비 인쇄 섹션을 시작과 끝 으로 감싸 야 합니다 . \[\]
wjandrea

@ igorsantos07의 이중 역 슬래시 \\[는 편집으로 인한 오타였습니다. 나는 그것을 고쳤다.
wjandrea

11

비슷한 문제가 있었고 마침내 간단한 해결책을 찾았습니다.

.bashrc파일에 다음 줄을 추가 하십시오.

COLUMNS=250

그런 다음 source ~/.bashrc원하는 효과를 얻으려면 입력 하십시오.


좁은 종료 자 세분화와 같은 일부 경우, 문제는 프롬 색상 문자가 아니라 잘못된 COLUMNS 값입니다. 이 대답은 매우 귀찮은 구멍에서 나를 데려 갔다!
Carles Sala

1
로그 오프 할 필요가 없습니다. 마십시오 source .bashrc. 프롬프트가 즉시 업데이트됩니다
Sergiy Kolodyazhnyy

1
나는 shopt 내부하지 않았기 때문에 발견 setwinsize내 떠들썩한 파티를 위해 세트를, 그래서 그것은 바로, 참조 열을 업데이트하지 않은 unix.stackexchange.com/a/167911/8337
rogerdpack

1
나는 export COLUMNS=250계속해서 export TERM=xterm행복했다.
Philip Kearns

5

색상 코드 \[\]구분 기호를 포함하더라도 사용자 정의 색상 프롬프트와 동일한 문제가 발생했습니다 . bash는 함수 내부에서 색상을 반향하는 데 문제가 있음이 밝혀졌습니다 . 나는 프롬프트에 변수를 사용하고 결국 .bashrc는 조금 덜 우아하지만 모든 것이 잘 작동합니다.


여전히이 사람을 읽고 있다면 실제로 함수에서 색상을 벗어날 수 있습니다. 링크 된 질문 에서이 답변 을 참조하십시오 .
wjandrea

3

간단한 방법은 PS1을 설정하기 전에 다음 줄을 추가하는 것입니다.

stty columns 1000

예를 들어

stty columns 1000
PS1='\[\e[0;32m\u@\w/:[\e[m '

그러나 이것은 ls 및 man과 같은 다른 유닉스 명령에 영향을 미칩니다.


1
OSX에서 작동합니다.
raskhadafi

4
이것은 또한 vim에 심각하게 영향을 미칩니다. 이것을 사용하지 마십시오.
justhalf

0

tmux에 연결할 때이 문제가 발생했습니다. 문제는 내가 ipython백그라운드에서 세션을 가지고 있었고 ctrl + z어떻게 든 줄 바꿈이 발생했다는 것입니다. 터미널을 종료하자마자 ( fg, ctrl+d+d) 터미널이 제대로 작동하기 시작했습니다.

따라서 대화식 프롬프트가 중지되었는지 확인하십시오.


0

그래서 나는 약간의 왜곡 으로 같은 문제를 겪었고 작은 뉘앙스를 추가하기 위해 솔루션을 공유 할 것이라고 생각했습니다.

나의 초기 PS1은

PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$"

내가 가진 문제는 터미널 제목 과 명령 프롬프트 를 변경하려고한다는 것 입니다. 내가 한 방법 \[\033]0;\]Title\aPS1 변수 에 추가 하는 것 입니다.

이제 내 PS1은 다음과 같습니다.

PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$\[\033]0;\]Title\a"

이것은 나를 위해 줄 바꿈을 엉망으로 만들었습니다. 마침내 배쉬가 마지막에있는 것처럼 보이지 않는다는 것을 알았습니다 \a. 이것을 피하기 위해 제목에 변수를 넣었습니다.

TITLE="\033]0;Title\a"
PS1="\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$\[$TITLE\]"

0

\[그리고 \]나를 위해 작동하지 않았다. 외부 프로그램에서 프롬프트를 생성하는 방법이나 프롬프트가 "동적"이기 때문에 다른 점이 있다고 생각합니다.

이것을 읽은 후 실제로 0x010x02바이트를 사용하여 색상 코드를 벗어날 수 있음을 알았습니다 .

예를 들어 특수 버전의 분필을 사용 하고 있으며 이것을 사용하여 색상을 래핑합니다.

const Chalk = require('@nasc/chalk');

const chalk = new Chalk.constructor({
  wrapper: {
    pre: '\1',
    post: '\2',
  }
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.