표준 출력에 날짜와 시스템 가동 시간을 반영하기 위해 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
되어 현재 사용자의 홈 디렉터리에 있는 파일로 파이프됩니다.uptime
tee
example.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