터미널 출력을 파일로 저장하는 방법


688

명령 출력을 파일로 저장하려면 어떻게합니까?

소프트웨어를 사용하지 않는 방법이 있습니까? 방법을 알고 싶습니다.

답변:


735

예, 출력을 파일로 리디렉션하면 가능합니다.

SomeCommand > SomeFile.txt  

또는 데이터를 추가하려는 경우 :

SomeCommand >> SomeFile.txt

stderr이것을 원한다면 이것을 사용하십시오 :

SomeCommand &> SomeFile.txt  

또는 이것을 추가하려면 :

SomeCommand &>> SomeFile.txt  

콘솔 파일 모두 stderr출력을 표시 하려면 다음을 사용하십시오.

SomeCommand 2>&1 | tee SomeFile.txt

(출력 만 원하는 경우 2위의 항목을 삭제하십시오. )


15
그 참고 someCommand 2> someFile.txt하고 someCommand 2>> someFile.txt또한 리디렉션 stterrsomeFile.txt에
Slothworks

gcc 명령 으로이 작업을 수행하려고하지만 작동하지 않습니다. 다른 명령에서는 작동하지만이 명령에서는 작동하지 않습니다. 내부에 아무것도없는 출력 파일을 만듭니다.
Nikos

@ Nik-Lz 종종 명령이 모든 출력을 stderr로 전송하기 때문입니다. gcc가 오류 메시지를 생성하면 가능성이 높습니다. stdout 대신 stderr를 캡처하는 방법은 Slothworks 주석을 참조하십시오.
Jonathan Hartley

1
NB : make명령 출력을 파일로 가져 오려면 대신 다음 구문이 필요합니다. make > someFile.txt 2>&1(source : linuxquestions.org/questions/linux-newbie-8/… )
Gabriel Staples

파일이 약 8MB에 도달하면 쓰기가 중지되는 문제가 있습니다. 이것은 알려진 한계입니까?
relG

863

명령의 출력을 파일에 쓰려면 기본적으로 일반적으로 사용되는 10 가지 방법이 있습니다.

개요 :

있습니다 n.e.구문 열에는 "존재하지 않는"를 의미한다.
방법이 있지만 열에 맞추기에는 너무 복잡합니다. 목록 섹션에서 유용한 링크를 찾을 수 있습니다.

          || visible in terminal ||   visible in file   || existing
  Syntax  ||  StdOut  |  StdErr  ||  StdOut  |  StdErr  ||   file   
==========++==========+==========++==========+==========++===========
    >     ||    no    |   yes    ||   yes    |    no    || overwrite
    >>    ||    no    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
   2>     ||   yes    |    no    ||    no    |   yes    || overwrite
   2>>    ||   yes    |    no    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
   &>     ||    no    |    no    ||   yes    |   yes    || overwrite
   &>>    ||    no    |    no    ||   yes    |   yes    ||  append
          ||          |          ||          |          ||
 | tee    ||   yes    |   yes    ||   yes    |    no    || overwrite
 | tee -a ||   yes    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    || overwrite
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
|& tee    ||   yes    |   yes    ||   yes    |   yes    || overwrite
|& tee -a ||   yes    |   yes    ||   yes    |   yes    ||  append

명부:

  • command > output.txt

    표준 출력 스트림은 파일로만 리디렉션되며 터미널에서는 보이지 않습니다. 파일이 이미 존재하면 덮어 씁니다.

  • command >> output.txt

    표준 출력 스트림은 파일로만 리디렉션되며 터미널에서는 보이지 않습니다. 파일이 이미 존재하면 새 데이터가 파일 끝에 추가됩니다.

  • command 2> output.txt

    표준 오류 스트림은 파일로만 리디렉션되며 터미널에서는 보이지 않습니다. 파일이 이미 존재하면 덮어 씁니다.

  • command 2>> output.txt

    표준 오류 스트림은 파일로만 리디렉션되며 터미널에서는 보이지 않습니다. 파일이 이미 존재하면 새 데이터가 파일 끝에 추가됩니다.

  • command &> output.txt

    표준 출력 및 표준 오류 스트림은 모두 파일로만 리디렉션되며 터미널에는 아무것도 표시되지 않습니다. 파일이 이미 존재하면 덮어 씁니다.

  • command &>> output.txt

    표준 출력 및 표준 오류 스트림은 모두 파일로만 리디렉션되며 터미널에는 아무것도 표시되지 않습니다. 파일이 이미 존재하면 새 데이터가 파일 끝에 추가됩니다.

  • command | tee output.txt

    표준 출력 스트림은 파일로 복사되며 터미널에서 여전히 볼 수 있습니다. 파일이 이미 존재하면 덮어 씁니다.

  • command | tee -a output.txt

    표준 출력 스트림이 파일로 복사되며 터미널에서 계속 볼 수 있습니다. 파일이 이미 존재하면 새 데이터가 파일 끝에 추가됩니다.

  • (*)

    Bash에는 StdErr 만 두 번째 명령으로 파이프 할 수있는 약식 구문이 없습니다.이 명령 tee은 테이블을 완성하기 위해 다시 결합 해야합니다. 정말로 그런 것이 필요하다면 "stdout이 아닌 stderr를 파이프하는 방법"을보십시오. 스트림 스왑 또는 프로세스 대체를 사용하여이를 수행하는 방법에 대해 스택 오버플로 에서

  • command |& tee output.txt

    표준 출력 및 표준 오류 스트림은 모두 터미널에서 여전히 보이는 동안 파일로 복사됩니다. 파일이 이미 존재하면 덮어 씁니다.

  • command |& tee -a output.txt

    표준 출력 및 표준 오류 스트림은 모두 터미널에서 여전히 보이는 동안 파일로 복사됩니다. 파일이 이미 존재하면 새 데이터가 파일 끝에 추가됩니다.


66
테이블 주셔서 감사합니다, 우수합니다! 이것은 정답
DevShark

3
@ karthick87 이것은 하나의 스트림을 다른 스트림으로 리디렉션하기 때문에 출력을 파일로 리디렉션하는 것에 관한 질문과 실제로 관련이 없습니다. 2>&1STDERR을 STDOUT으로 1>&2리디렉션하고 STDOUT을 STDERR로 3>&1리디렉션하며 스트림 3을 STDERR로 리디렉션합니다.
바이트 커맨더

18
macOS에서는 '| &'가 작동하지 않는다는 점에 유의하십시오. 이것은 이전 버전의 bash가 있기 때문입니다 (제 생각에). 덜 우아한 '2> & 1 |' 그래도 잘 작동합니다
Danny Parker

2
@ByteCommander 오류가 발생합니다 : c9.io 서버의 Python 스크립트에서 sh: 1: Syntax error: "&" unexpected사용할 때 |& tee. 다른 쉘이 사용되고있는 것 같습니다. 버전 4.3.11 (1)-릴리스를 echo $SHELL표시 /bin/bash하고 $SHELL --version표시합니다. #!/bin/bash파이썬 스크립트를 사용해 보았지만 여전히 얻습니다 sh: 1: Syntax error. 필요한 것을 얻었으므로 서버 사이 shbash서버 에서 이상한 점을 정렬하는 것을 포기했습니다 . 감사.
samkhan13

1
@ samkhan13는 실행중인 모양 sh이 아닌 bash(또는 어쩌면 bashsh... 모드). 신뢰할 수없고 다른 서브 쉘을 시작했는지 여부를 무시하고 로그인 쉘을 표시 ps -p $$ -o cmd=하므로 현재 쉘 프로세스가 정확히 무엇을 사용 echo $SHELL중인지 확인할 수 있습니다.
바이트 사령관

108

tee출력을 파일로 보내는 데 사용할 수도 있습니다 .

command | tee ~/outputfile.txt

약간의 수정도 stderr을 잡을 것입니다 :

command 2>&1 | tee ~/outputfile.txt

또는 약간 짧고 덜 복잡합니다.

command |& tee ~/outputfile.txt

tee명령 출력을 실시간으로 보면서 캡처 할 수있는 경우에 유용합니다 .


&는 예상치 못한 것이며 명령 실행과 동시에 로그를 쓰지 않습니다. 그러나 이것을 bash 파일에서 사용하고 있는데 차이점이 있습니까?
tim687

@ tim687 해당 편집 내용을 제거했습니다. 그것에 대해 죄송합니다 ... 원래 답변의 일부가 아니 었습니다.
Aaron

@Aaron 감사합니다! 티는 실시간으로 파일을 추가 할 것입니다. PC를 백업하는 데 사용하는 백업 스크립트가 있지만 로깅은 실시간이 아닙니다. 백업이 완료된 후 PC가 절전 모드로 전환되고 로그 파일이 비어 있습니다. 다른 명령을 사용하여 명령을 기록해야합니까?
tim687

의 의미를 2>&1어떻게 해석 합니까?
Mahesha999

@ Mahesha999 2는 STDERR의 파일 설명자이고 1은 STDOUT입니다. 따라서 2> & 1은 STDERR을 STDOUT으로 보냅니다. 이 SO 질문은 꽤 잘 설명합니다. stackoverflow.com/questions/818255/…
Aaron

20

명령 출력을 파일로 리디렉션 할 수 있습니다.

your_command >/path/to/file

파일을 덮어 쓰지 않고 명령 출력을 파일에 추가하려면 다음을 사용하십시오.

your_command >>/path/to/file

고마워요! 제한이 있습니까? 파일의 최대 크기처럼?
led-Zepp

3
최대 파일 크기는 파일 시스템을 통해 제한됩니다.
chaos

이 답변은 stderr을 저장하지 않습니다. &> 사용, stackoverflow.com/questions/637827/…tldp.org/LDP/abs/html/io-redirection.html
Panther

3
OP는 결코 stderr를 구하라고 요구하지 않았습니다
혼돈

"그러한 파일이나 디렉토리가 없습니다"라고 표시되어 있습니다. 디렉토리를 자동으로 작성할 수도 있습니까?
Qwerty

14

고려해야 할 개선 사항-

다양한 스크립트가 색상 코드를 출력에 삽입하여 로그 파일을 어지럽히 지 않을 수 있습니다.

이 문제를 해결하기 위해 sed 프로그램을 사용하여 해당 코드를 제거 할 수 있습니다 . 예:

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt

1
색상이 보존되는 방식으로 출력물을 저장하는 방법은 무엇입니까? libreoffice에서 명령 결과를 가져와 색상을 유지하고 싶습니다.
madrang

@ madrang : 나는 당신의 의견을 읽었지만이 답변이 유용 할 수 있습니다 .
Sylvain Pineau

아, 거의 정확히 내가 찾고있는 것. 출력물을 화면에 인쇄하는 방법?
Sigur

1
표준 출력이 터미널 인 경우에만 색상 코드를 출력 하는 , ls및 등의 채색 된 출력을 생성하는 많은 명령에 유의하십시오 . grep--color=auto
Eliah Kagan

5

들어 cron작업 등 당신은 배쉬 확장을 피하려고. 동등한 POSIX sh리디렉션 연산자는

Bash          POSIX
------------  --------------
foo &> bar    foo >bar 2>&1
foo &>> bar   foo >>bar 2>&1
foo |& bar    foo 2>&1 | bar

POSIX 시설이 어떤 의미에서는 더 단순하고 간단하다는 것을 알 수 있습니다. 이 &>구문은 빌려 왔으며 csh이미 나쁜 생각임을 확신시켜 줄 것입니다.


1

some_command | tee command.log그리고 some_command > command.log그들이에 명령 출력을 저장하지 않는 문제가 command.log실시간으로 파일을.

이러한 문제를 피하고 명령 출력을 실시간으로 저장하기 위해 패키지 unbuffer와 함께 제공되는을 추가 할 수 있습니다 expect.


예:

sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log

다음을 log.py포함 한다고 가정 합니다.

import time
print('testing')
time.sleep(100) # sleeping for 100 seconds

당신은 실행할 수 있습니다 unbuffer python log.py | tee command.log또는unbuffer python log.py > command.log

추가 정보 : 명령 출력을 파일에 실시간으로 저장하려면 어떻게해야합니까?


그들은 출력을받을 때 저장합니다. 문제는 출력이 TTY가 아닌 경우 파이썬이 버퍼링을 설정한다는 것입니다. 파이썬에서 이것을 비활성화하기위한 다른 옵션 : stackoverflow.com/q/107705/2072269
muru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.