원격 파일 시스템에 짧은 텍스트 문자열(한 줄에 있는 일련의 숫자)이 포함된 파일이 있습니다. 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 $