Bash 스크립트는 스크립트 출력을 별도의 로그 파일에 기록합니다.

Bash 스크립트는 스크립트 출력을 별도의 로그 파일에 기록합니다.

표준 출력에 날짜와 시스템 가동 시간을 반영하기 위해 scipt(example.sh)를 작성했습니다. 또한 이 스크립트가 이 출력을 로그 파일에 기록하기를 원합니다. 이게 내 코드야

echo `date`
echo `uptime`

마침내

cat /home/rpeb/example.sh 1> /home/rpeb/example.log 

출력을 로그 파일로 리디렉션합니다.

마지막 줄을 기록하고 싶지 않습니다. 이 코드를 어떻게 변경해야 합니까?

답변1

#!/bin/sh
{ date; uptime; } | tee "$HOME/example.log"

그러면 두 가지의 출력이 실행 date되어 현재 사용자의 홈 디렉터리에 있는 파일로 파이프됩니다.uptimeteeexample.log그리고스크립트의 표준 출력에. { ...; }명령 집합을 전체적으로 리디렉션할 수 있는 "복합 명령"으로 결합하는 데 사용됩니다 .

그렇지 않은 경우 { ...; }스크립트에서 두 가지 리디렉션을 수행해야 합니다.

#!/bin/sh
date   | tee    "$HOME/example.log"
uptime | tee -a "$HOME/example.log"

두 번째 호출에는 로그 파일에 옵션이 추가 tee되어야 합니다 -a. 그렇지 않으면 로그 파일이 잘리고 명령의 출력이 손실됩니다 date.


echo일반적으로 명령 대체 결과만 인쇄하고 싶지는 않습니다 . 명령 대체(backtick 명령 또는 $(...))는 명령의 출력을 다른 명령에서 사용하는 문자열에 삽입하는 데 도움이 될 수 있습니다.산출명령의 결과에는 명령 대체가 필요하지 않습니다 echo(예: 명령줄에서 이 작업을 수행할 필요도 없고 echo $(ls)스크립트에서도 수행할 필요도 없습니다).

답변2

이것은 작동합니다:

echo `date`
echo `uptime`

그러나 이것이 더 좋습니다:

echo $(date)
echo $(uptime)

(이유를 읽어보세요.여기)


그리고 이 특별한 경우에는 다음 사항에 만족할 수 있습니다.

date
uptime

이것:

cat /home/rpeb/example.sh 1> /home/rpeb/example.log

~하지 않을 것이다스크립트를 실행하세요.

cat /home/rpeb/example.sh내용만 인쇄하세요/home/rpeb/example.sh

그런 다음 stdout해당 명령에서 파일로 리디렉션 됩니다 /home/rpeb/example.log. 따라서 여기서 실제로 수행하는 작업 /home/rpeb/example.sh/home/rpeb/example.log. 이것은 당신이 원하는 것이 아닌 것 같습니다.

하지만 다음과 같이 하면 더 간결해집니다.

cat /home/rpeb/example.sh > /home/rpeb/example.log

만 사용하는 경우 >앞에 1오는 내용이 암시됩니다.


/home/rpeb/example.sh스크립트를 실행 한 후 해당 출력을 파일로 리디렉션 하려면 /home/rpeb/example.log먼저 /home/rpeb/example.sh다음과 같이 실행 권한을 부여하세요.

chmod u+x /home/rpeb/example.sh

그런 다음 스크립트를 실행하고 경로를 작성하고 다음과 같이 출력을 리디렉션하세요.

/home/rpeb/example.sh > /home/rpeb/example.log

그런데 두 파일(스크립트와 로그)이 모두 동일한 파일에 있고 dir그 안에 있으면 dir다음을 실행할 수 있습니다.

./example.sh > example.log

example.sh출력을 터미널에 인쇄하고 로그인 하려면 example.log다음을 수행할 수 있습니다.

./example.sh | tee example.log

관련 정보