화면뿐만 아니라 파일로 출력을 리디렉션하는 방법은 무엇입니까?


12

내 목표는 스크립트의 모든 출력을 스크립트가 생성 할 디렉토리에 기록하는 것입니다.

예를 들어, 나는 :

~/.abc.sh:

#! /bin/bash
rails new myapp

내가 달릴 때 ...

cd ~/code
. ~/.abc.sh

... 디렉토리에 새로운 Rails 앱을 만듭니다 ~/code/myapp.

Rails가 앱을 만들 때 rails새로 만든 명령 과 같은 디렉토리에있는 로그 파일에 캡처하고 저장하려는 많은 텍스트를 출력합니다 . 또한 터미널에 해당 텍스트를 표시하고 싶습니다.

이 작업은 어떻게합니까?

답변:


23

해당 tee명령을 사용할 수 있습니다 .

command | tee /path/to/logfile

쉘에 쓰지 않는 동등한 것은 다음과 같습니다.

command > /path/to/logfile

을 추가하고 ( >>) 출력을 쉘에 표시하려면 다음 -a옵션을 사용하십시오 .

command | tee -a /path/to/logfile

파이프는 stdout 만 포착하고 stderr에 대한 오류는로 파이프에 의해 처리되지 않습니다 tee. stderr에서 오류를 기록하려면 다음을 사용하십시오.

command 2>&1 | tee /path/to/logfile

이는 다음을 의미합니다. commandstderr 스트림 (2)을 stdout (1)으로 실행 하고 리디렉션합니다. tee응용 프로그램 과 함께 파이프로 전달됩니다 .


당신은 의미 ~/.abc.sh | tee <file>합니까? 그렇다면 문제는 스크립트를 호출 할 때 스크립트가 앱을 만들 디렉토리를 모르는 것이므로 file인수 에서 무엇을 주어야하는지 어떻게 알 수 있습니까? (훌륭한 예를 주셔서 감사합니다)
Zabba

@Zabba : 임시 파일을 만들어 나중에 이동하는 것은 어떻습니까?
Lekensteyn

좋아, 그것은 작동해야한다 :). 이와 관련하여 임의의 이름으로 임시 파일을 생성 한 다음 나중에 원하는 위치로 출력 한 다음 복사 할 수 있습니까? "임시 파일 이름"을 얻기위한 내장 명령이 있습니까?
Zabba

@Zabba : 그 명령은 mktemp입니다. 매뉴얼 페이지를 참조하십시오 man mktemp.
Lekensteyn

charm, 매력처럼 일
Sun

0

script대화 형 세션을 시작하고 모든 출력 (stdout / stderr 등)을 파일에 기록하거나 ( -c매개 변수를 사용하여 ) 명령을 실행하고 해당 출력을 기록합니다.

script -c ~/.abc.sh -f abc.log

참고 : 대화식 세션에서는 일반적으로 (예 : exit또는 Ctrl-D) 세션을 종료하기 만하면 녹화를 중지 할 수 있습니다 .

비디오 재생을 통한 세션 녹화의 경우 asciinema 를 시도 할 수도 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.