내 프롬프트 정의와 zsh의 cat 사이에 충돌이 있습니다.

내 프롬프트 정의와 zsh의 cat 사이에 충돌이 있습니다.

원격 파일 시스템에 짧은 텍스트 문자열(한 줄에 있는 일련의 숫자)이 포함된 파일이 있습니다. nano나 Emacs 같은 텍스트 편집기에서 파일을 열면 문자열을 볼 수 있습니다. 또한 이것이 관련이 있는지 확실하지 않지만 ls파일은 8바이트*로 보고됩니다.

이상한 건 cat이걸 신고 해도 cat아무 것도 보고되지 않는다는 거예요.

그런데 줄 끝에 줄바꿈을 추가하면 cat내용이 표시되어 혼란스럽습니다.

그래서 내 질문은 다음과 같습니다

  • 왜 이런 일이 발생합니까? cat내용을 인쇄 하려면 각 줄 끝에 줄 바꿈이 정말로 필요 합니까? 이것이 기본 동작입니까 cat? (그렇다면 그 이유는 무엇입니까?)
  • cat줄 바꿈 여부에 관계없이 파일의 모든 내용을 강제로 인쇄하는 방법이 있습니까 ?

고쳐 쓰다:

아래 답변을 바탕으로 프롬프트를 정의한 방법을 게시하는 것이 적절할 것이라고 생각했습니다. 나는 에 있고 zsh다음을 가지고 있습니다두 줄~/.zshrc:

export PS1="%{$fg[white]%}%n%{$reset_color%} @ %{$fg[green]%}%m: %{$fg[yellow]%}%~ %{$reset_color%}%%
> "

프롬프트를 정의하기 전에 다음 두 줄이 있는데, 이를 통해 셸에서 색상 별칭을 사용할 수 있다고 생각됩니다.

autoload -U colors
colors

질문을 바꿔보세요:

위 사항을 고려하여 어떻게 프롬프트에 줄 바꿈을 추가하고 cat위에서 설명한 대로 파일을 올바르게 인쇄할 수 있습니까?


touch*내가 랜덤 파일 이라면 ls파일이 0바이트만 있다고 보고될 텐데, ls내 파일이 8바이트라는 사실을 보고하는 게 맞다고 생각합니다. 하지만 이것이 도움이 될지는 확실하지 않습니다.

답변1

Zsh는 프롬프트가 알려진 위치에서 시작할 수 있도록 프롬프트 앞에 자동으로 CR을 출력합니다. zsh가 아닌 다른 쉘을 사용하면 다음을 얻을 수 있습니다.

$ cat file
12345678$ _ <-- your prompt after the file contents

이 문제에 대한 FAQ 항목은 다음과 같습니다.http://zsh.sourceforge.net/FAQ/zshfaq03.html#l40

이러한 이유로 텍스트 파일은 줄 바꿈으로 끝나야 합니다. 줄 바꿈을 포함하지 않는 텍스트 파일을 생성하는 도구를 찾는 것은 드뭅니다(크로스 플랫폼 환경 제외 - Windows 메모장은 줄 바꿈으로 파일을 끝내지 않습니다) 예)

대부분의 명령 출력 후 프롬프트 앞에 빈 줄이 추가되는 것을 허용할 수 있다면(예: Windows에서) 프롬프트 시작 부분에 개행 문자를 추가해 보세요.

export PS1="
%{$fg[white]%}%n%{$reset_color%} @ %{$fg[green]%}%m: %{$fg[yellow]%}%~ %{$reset_color%}%%
> "

그리고 (켜도 실제로 작동할 수도 있음) 프롬프트_cr 쉘 옵션을 비활성화하십시오. 링크 이메일에서 "공간선" 옵션을 사용해 볼 수도 있습니다.

답변2

내 생각엔 쉘 프롬프트가 cat이 작성한 줄을 덮어쓴 것 같습니다. 이러한 경우인지 확인하려면 다음을 시도해 보십시오.

cat file; echo

쉘에 따라 이러한 일이 발생하지 않도록 어떤 방식으로든 구성 파일을 조정할 수 있습니다.

답변3

그렇다면 (캐리지 리턴) 문자 printf %q "$PS1"가 표시됩니까 ? \r이것이 설명할 것입니다: cat줄 바꿈 없이 일부 문자열을 출력한 다음 처리할 때 $PS1줄의 시작 부분으로 돌아가서 값을 계속 덮어씁니다. 이런 경우인지 간접적으로 확인하려면 파일에 값을 써볼 수 있습니다.더 길게프롬프트보다(또는 프롬프트를 파일 시작 부분에 복사하여) 출력이 cat프롬프트를 통해 흐르는지 확인하세요.

답변4

나는 PS1을 다음과 같이 정의합니다.

PS1='\n\u@\h \w\n(\\$\\$='$$') \! \$ '

내 프롬프트는 다음과 같습니다

...output of last command

glennj@machine ~
($$=29608) 1403 $

그 앞에 빈 줄이 있습니다. 따라서 출력에 후행 개행 문자가 없어도 여전히 표시됩니다.

glennj@auds916 ~
($$=29608) 1403 $ printf hello
hello
glennj@auds916 ~
($$=29608) 1404 $

관련 정보