改行を使用してスクリプトの複数行出力をファイルに印刷する方法

改行を使用してスクリプトの複数行出力をファイルに印刷する方法

次のスクリプトがあります。

/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"
}

関連情報