![echo를 사용하여 표준 출력을 덮어쓰는 방법은 무엇입니까? [폐쇄]](https://linux55.com/image/54450/echo%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%91%9C%EC%A4%80%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EB%8D%AE%EC%96%B4%EC%93%B0%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%ED%8F%90%EC%87%84%5D.png)
우리는 재정의하는 방법을 알고 있으며 bar.txt
다음을 사용할 수 있습니다.
echo "foo" > bar.txt
하지만 표준 출력을 어떻게 덮어쓰나요? 나는 다음 명령을 시도했습니다.
echo "foo" >
그러나 그것은 실패했습니다. 나는 다음과 같은 것을 인쇄하고 싶기 때문에 이것을 원합니다.
Hello
world
I'm
HERE
한 번에 한 단어씩 이전 단어를 삭제하고 싶습니다(표준 출력에서는 한 번에 한 단어씩).
답변1
echo
항상 표준 출력 1 로 출력합니다 . echo foo
항상 하나를 만드십시오 write(1, "foo\n")
.
이렇게 하면 echo foo > file
쉘은 echo
명령의 표준 출력을 새 file
파일로 변경합니다. echo foo
그런 다음 여전히 a를 실행 write(1, "foo\n")
하지만 이번에는 stdout(파일 설명자 1) file
이 쉘에서 상속한 stdout 대신을 가리킵니다.
stdout이 필요하지 않고 stdout에 쓰고 싶다면리디렉션, 쓰다:
echo foo
stdout이 가리키는 리소스를 각 echo
.
Linux(및 Linux에만 해당)에서는 다음을 수행할 수 있습니다.
echo foo > /dev/fd/1
echo bar > /dev/fd/1
# now the file stdout points to (if it's a regular file) contains "bar"
Linux에서는 /dev/fd/1
stdout에서 열린 파일에 대한 심볼릭 링크입니다. 따라서 다시 열면 >
파일이 잘립니다(다른 Unices에서는 이와 > /dev/fd/n
같이 dup2(n,1)
파일이 잘리지 않습니다). 표준 출력이 소켓에 연결되어 있으면 작동하지 않습니다.
그렇지 않으면 ftruncate()
stdout(fd 1)을 호출하여 잘라낼 수 있습니다.
perl -e 'truncate STDOUT,0'
echo foo
perl -e 'truncate STDOUT,0'
echo bar
대신에 이런 말을 원하신다면,stdout이 터미널인 경우화면에서 서로 오버레이하려면 터미널 제어 문자를 사용하여 커서 위치에 영향을 줄 수 있습니다.
printf %s FOO
printf '\r%s' BAR
BAR은 FOO보다 우선합니다. FOO는 \r
터미널에 커서를 줄의 시작 부분으로 이동하도록 지시하는 제어 문자이기 때문입니다.
이렇게 하면:
printf %s FOOBAR
printf '\r%s' BAZ
그러나 BAZBAR
화면에서는 볼 수 있습니다. 라인을 지우려면 다른 제어 시퀀스를 사용해야 할 수도 있습니다. 캐리지 리턴은 보편적 이지만 \r
화면을 지우는 제어 순서는 터미널마다 다릅니다. 가장 좋은 방법은 terminfo 데이터베이스를 쿼리하여 tput
찾는 것입니다.
clr_eol=$(tput el)
printf %s FOOBAR
printf '\r%s%s' "$clr_eol" BAZ
1 Korn 또는 Z 쉘을 사용하는 경우 다른 파일 설명자에 쓰기를 지원하는 또 다른 출력 명령은 print
다음 print -u2 FOO
과 FOO
같습니다 print
. echo
Bourne의 와 같은 쉘을 사용하여 echo >&2 FOO
동일한 결과를 얻을 수 있습니다. echo
여전히 표준 출력에 쓰고 있지만 쉘 >&2
리디렉션 연산자를 사용하여 표준 출력을 쉘의 stderr에 복사했습니다.
답변2
당신은 말할 수 있습니다,
$clear && printf "before" && sleep 1 && clear && printf "after\n"
당신의 세상을 위해,
$clear && printf "Hello" && sleep 1 && clear && printf "World" && sleep 1 && clear && printf "I'm" && sleep 1 && clear && printf "Here\n"
답변3
어쨌든 터미널에 인쇄하는 경우 개행 문자( -n
)를 생략하고 명시적인 캐리지 리턴을 사용할 수 있습니다.
echo -en 'hello, dear\r'; sleep 5; echo -en 'world\r'; echo
(문자열을 완전히 덮으려면 문자열을 공백으로 채워야 합니다.)
답변4
echo
Suchhi의 솔루션에 대한 대안을 사용하려면 이 명령 에 대한 옵션을 printf
확인하세요 . 이를 통해 백스페이스 키를 포함한 특정 이스케이프 시퀀스를 사용할 수 있습니다 . 개행을 억제하는 옵션 과 함께 다음을 수행할 수 있습니다.-e
echo
\b
-n
echo -n "Hello" && sleep 10 && echo -n -e "\b\b\b\b\bworld"