다음 스크립트가 있습니다.
/usr/bin/daily-execution
#!/bin/bash
log_folder=/var/log/hans-keeper
now=$(date +"%Y-%m-%d-%H:%M:%S")
if [ ! -d "/var/log/hans-keeper" ]
then
mkdir /var/log/hans-keeper
fi
target_file="$log_folder/$now"
exec_log(){
echo "executing $1 and log into: $target_file"
result=$(sudo $1)
echo "$1" >> $target_file
echo "-------------------------------------------------" >> $target_file
printf "%s\n" $result >> $target_file
echo "-------------------------------------------------" >> $target_file
echo "" >> $target_file
}
exec_log /usr/bin/hans-keeper
exec_log /usr/bin/move-sync-staging
/usr/bin/hans-keeper
아래와 같이 여러 줄의 에코 가 있습니다 .
echo "line 1"
echo "line 2"
echo "line 3"
게다가 move-sync-staging
.
/usr/bin/hans-keeper
쉘에서 직접 실행하면 다음과 같이 인쇄되는 것을 확인했습니다 .
line 1
line 2
line 3
그러나 결과에서 로그 파일을 열면 /usr/bin/daily-execution
다음과 같이 인쇄됩니다.
line 1line 2line 3
/usr/bin/hans-keeper
쉘에서 직접 스크립트를 실행 하면 출력에 개행 문자가 포함되지 않는 것 같습니다 .
이 문제를 해결하고 스크립트를 개선하는 데 도움을 주시면 정말 감사하겠습니다.
답변1
echo "executing $1 and log into: $target_file" result=$(sudo $1) echo "$1" >> $target_file echo "-------------------------------------------------" >> $target_file printf "%s\n" $result >> $target_file echo "-------------------------------------------------" >> $target_file echo "" >> $target_file
인용되지 않은 확장이 $result
이유입니다. { cmd1; cmd2 } >> file
별도의 리디렉션 대신 사용하세요 .
exec_log() {
echo "executing $1 and log into: $target_file"
{
echo "$1"
echo "-------------------------------------------------"
sudo "$1"
echo "-------------------------------------------------"
echo ""
}>> "$target_file"
}