cat 명령 후 bash가 새 줄에 프롬프트를 표시하는 방법은 무엇입니까?


17

내가 얻는 것 :

host:~ user$ cat example.txt
some texthost:~ stas$

내가 얻고 싶은 것 :

host:~ user$ cat example.txt
some text
host:~ stas$

cat이렇게 행동 할 수있는 방법 이 있습니까?

Mac OS X에서 bash를 사용하고 있습니다.

답변:


15

대부분의 유닉스 도구는 텍스트 파일과 잘 작동하도록 설계되었습니다. 텍스트 파일은 일련의 줄로 구성됩니다. 줄은 줄 바꿈 문자로 끝나는 일련의 인쇄 가능한 문자로 구성됩니다. 특히 비어 있지 않은 텍스트 파일의 마지막 문자는 항상 줄 바꿈 문자입니다. 분명히 마지막 개행 문자 example.txt가 포함되어 some text있지 않으므로 텍스트 파일이 아닙니다.

cat간단한 일을한다. 임의의 파일을 텍스트 파일로 변환하는 것은 해당 작업의 일부가 아닙니다. 다른 도구는 항상 입력을 텍스트 파일로 바꿉니다. 표시하는 파일이 줄 바꿈으로 끝나는 것이 확실하지 않으면 awk 1대신 대신 실행하십시오 cat.

이전 명령이 마지막 여백 이외의 다른 곳에 커서를 둔 경우 bash가 다음 줄에 프롬프트를 표시하도록 할 수 있습니다. 이것을 .bashrc( Dennis Williamson 의 제안 대한 GetFree 의 변형) 넣으십시오 .

shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1

효과적인 해결책과 간결한 설명에 감사드립니다! 나는 이것이 가난한 사람들에게는 조금 크다는 것을 이해 cat하므로이 문제가 다시 나를 귀찮게하기 시작할 때 마지막 수단으로 이것을 사용할 것입니다.
Stanislav Shabalin

이것은 bash 환경 설정이므로 파이프 명령을 깨뜨릴 수 있습니까?
Stanislav Shabalin

1
@StanislavShabalin 배관에는 영향을 미치지 않으며 프롬프트에만 영향을줍니다.
Gilles 'SO- 악마 그만해'

이것이 올바르게 작동하려면 "COLUMNS"다음에 "-1"을 제거해야합니다.
rafak

이 솔루션은 터미널 창의 크기를 조정할 때 프롬프트를 이동시킵니다. 이 작업을 안정적으로 수행하려면 현재 열을 PROMPT_COMMAND가져와야하고 0이 아닌 경우 개행 ( \n)을 첫 번째 문자로 사용하십시오 PS1.
Brian Donovan

10

다음 방법을 선호합니다 ...

cat example.txt ; echo

이것은 example.txt개행 내용을 평가하지 않거나 때로는 개행을 추가 하지 않습니다 . 고양이가 완성되고 기억하기 쉬우면 개행 문자를 표시하며 강하게 인용을 사용하는지 약한 인용을 제대로 사용하고 있는지 아무도 생각하지 않습니다.

실제로 유일한 단점은 파일에 후행 줄 바꿈이 있으면 추가 줄 바꿈이 표시된다는 것입니다.


7

@Gilles의 대답을 사용하기 시작했지만 터미널이 열 수를 변경하면 프롬프트가 더 이상 예상대로 줄의 시작 부분에 있지 않다는 것을 알았습니다. 이것은 tmux / screen splits, GUI 컨테이너의 수동 크기 조정, 글꼴 변경 등 다양한 이유로 발생할 수 있습니다.

내가 정말로 원했던 것은 터미널이 첫 번째 열 이외의 다른 곳에서 프롬프트를 인쇄하기 시작하면 줄 바꿈을 추가하는 것입니다. 이렇게하려면 현재 열을 얻는 방법을 알아야했습니다. 이 답변을 사용 했습니다. . 을 . 최종 작업 프롬프트 구성은 다음과 같습니다.

###
# Configure PS1 by using the old value but ensuring it starts on a new line.
###
__configure_prompt() {
  PS1=""

  if [ "$(__get_terminal_column)" != 0 ]; then
    PS1="\n"
  fi

  PS1+="$PS1_WITHOUT_PREPENDED_NEWLINE"
}

###
# Get the current terminal column value.
#
# From /programming//a/2575525/549363.
###
__get_terminal_column() {
  exec < /dev/tty
  local oldstty=$(stty -g)
  stty raw -echo min 0
  echo -en "\033[6n" > /dev/tty
  local pos
  IFS=';' read -r -d R -a pos
  stty $oldstty
  echo "$((${pos[1]} - 1))"
}

# Save the current PS1 for later.
PS1_WITHOUT_PREPENDED_NEWLINE="$PS1"

# Use our prompt configuration function, preserving whatever existing
# PROMPT_COMMAND might be configured.
PROMPT_COMMAND="__configure_prompt;$PROMPT_COMMAND"

이 솔루션을 사용하지만 여러 줄 명령을 쉘에 붙여 넣으려고하면 첫 번째 줄을 붙여 넣은 후에 줄의 일부 / 모든 줄을 먹는 것으로 보입니다. 이것에 대한 해결책이 있습니까?
1

@onlynone 아마도 귀하의 명령이 개별적으로 그리고 제 시간에 플러시되지 __get_terminal_column않습니까?
Androbin

대신에 PS1="\n"나는 단지 echo수정할 필요가 없다 PS1.
Androbin

4

이에 대한 문제는 example.txt에 파일 끝에 줄 바꿈이 없기 때문일 수 있습니다.


2
문제는 파일 끝에 줄 바꿈이 있는지 여부는 중요하지 않습니다. 나는 고양이 출력이 더 명확 하고이 혼란스럽지 않다는 것을 알기를 원합니다 cat.
Stanislav Shabalin

1
이것은 example.txt파일 끝에 줄 바꿈 이없는 대답이 아닙니다. 질문의 요점입니다.
Willem D' Haeseleer 5

2

를 사용한다고 주장 cat하면 끝에 줄 바꿈이 있거나없는 두 가지 유형의 파일 모두에서 작동합니다.

echo "`cat example.txt`"

당신은 당신의 선택 (심지어의 이름과 기능으로 바꿀 수 있습니다 cat) 당신의 .bashrc:

cat1(){ echo "`/bin/cat $@`";}

1
비록 그것이 작동하더라도 지금은 너무 많습니다. ;-) 그래도 감사합니다!
Stanislav Shabalin

0

.bashrc에 추가 할 수 있습니다

PROMPT_COMMAND="printf '\n';$PROMPT_COMMAND"

나를 위해 작동합니다.


1
유틸리티가 줄 바꿈으로 올바르게 종료 된 것을 출력 할 때마다 터미널에 빈 줄 이 추가 됩니다.
Kusalananda

사실입니다. 그러나 간단하고, 그것이 더 이상 줄을 가지게하지 않는다면 ...
klaus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.