echo를 사용하여 표준 출력을 덮어쓰는 방법은 무엇입니까? [폐쇄]

echo를 사용하여 표준 출력을 덮어쓰는 방법은 무엇입니까? [폐쇄]

우리는 재정의하는 방법을 알고 있으며 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/1stdout에서 열린 파일에 대한 심볼릭 링크입니다. 따라서 다시 열면 >파일이 잘립니다(다른 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 FOOFOO같습니다 print. echoBourne의 와 같은 쉘을 사용하여 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

echoSuchhi의 솔루션에 대한 대안을 사용하려면 이 명령 에 대한 옵션을 printf확인하세요 . 이를 통해 백스페이스 키를 포함한 특정 이스케이프 시퀀스를 사용할 수 있습니다 . 개행을 억제하는 옵션 과 함께 다음을 수행할 수 있습니다.-eecho\b-n

 echo -n "Hello" && sleep 10 && echo -n -e "\b\b\b\b\bworld"

관련 정보