現在の日付と時刻と現在のディレクトリ名を持つファイルに出力をリダイレクトするにはどうすればよいですか?

現在の日付と時刻と現在のディレクトリ名を持つファイルに出力をリダイレクトするにはどうすればよいですか?

xtermの現在の作業ディレクトリを使用してリダイレクトしようとしています。

xterm -ls -geometry 80x30 -e 'cd /home/work/test1/; pwd; make | tee test1.log;'
xterm -ls -geometry 80x30 -e 'cd /home/work/temp/test2/; pwd; make | tee test2.log;'
xterm -ls -geometry 80x30 -e 'cd /home/work/tmp/test3/; pwd; make | tee test3.log;'
xterm -ls -geometry 80x30 -e 'cd /home/work/my_test4/; pwd; make | tee my_test4.log;'
xterm -ls -geometry 80x30 -e 'cd /home/work/append/my_test5/; pwd; make | tee my_test5.log;'
...

名前が現在の日付と時刻で、xtermの現在の最後のディレクトリ名であるファイルに出力をリダイレクトしたいと思います。

for example).
xterm -ls -geometry 80x30 -e 'cd /home/work/append/my_test5/; pwd; make | tee my_test5_03:19:12-11-2023.log;'

名前がxtermの現在の日付と時刻で、現在のディレクトリ名であるファイルに出力をリダイレクトするにはどうすればよいですか?

答え1

努力する:

xterm -ls -geometry 80x30 -e sh -o errexit -o nounset -c '
  cd -P -- "$1"
  pwd
  make 2>&1 | tee -- "$OLDPWD/${1##*/}_$(date +%FT%T).log"
  ' sh ~/work/test123
  • shxterm呼び出しが$SHELLシェルコードであると思うものを解釈するのではなく、明示的に呼び出します。
  • これにより、最初の位置引数を使用して、安全な方法でディレクトリをシェルに渡すことができます。
  • errexitコマンドが失敗した場合は中断するオプションを使用して、失敗した場合は実行しないでください。良い測定のために追加されましたが、この単純なコードには必要ありません。makecdnounset
  • ログファイルは、ディレクトリを変更する前に使用された元の作業ディレクトリ(したがって呼び出されたディレクトリ)に作成されますxtermsh$OLDPWDcd$PWD
  • shmakeのstdoutとstderrをパイプにリダイレクトしてエラーも記録します(ただし、エラーはstdoutを介して渡されます。両方ともteeエミュレートされた端末に移動するため、ここでは違いはありませんxterm)。
  • ${1##*/}展開すると、$1一番右のすべての項目が削除されます/$(basename -- "$1")aで終わるとうまくいきますが、改行で終わるとうまくいかないものを使用することもできます。$1/
  • ソートに便利であいまいな標準YYYY-MM-DDTHH-MM-SS形式を使用します。

ファイルが以前に存在していた場合は上書きされ、teeファイル-aに追加するオプションを追加できます。

make(and)の終了ステータスは、発信者に伝播されないshため失われます。xterm

使用の代替案は、改行のerrexit代わりに3つのコマンドをリンクし、使用してすべてがより明確になるようにすることです。&&nounset${var?error message}

xterm -ls -geometry 80x30 -e sh -c '
  cd -P -- "${1?No dir specified}" &&
    pwd &&
    make 2>&1 | tee -- "$OLDPWD/${1##*/}_$(date +%FT%T).log"
  ' sh ~/work/test123

使用の代替はteeuse でありzsh、このmultios機能を使用すると別々の stdout および stderr ストリームを維持できます。そこに$OLDPWD書くことも可能で、~-ヒント拡張を使用して内部的にタイムスタンプを計算することによって$var:t正しいデフォルト名です。

xterm -ls -geometry 80x30 -e zsh -c '
  cd -P -- "${1?No dir specified}" &&
    pwd &&
    make 3> ~-/${1:t}_${(%):-%D{%FT%T}}.log >&1 >&3 2>&2 2>&3 3>&-
  ' zsh ~/work/test123

シャットダウン状態はmake維持されますが、それを便利にするのではなく伝播するには、ターミナルエミュレータが必要ですxterm

関連情報