현재 날짜 및 시간과 현재 디렉터리 이름이 지정된 파일로 출력을 리디렉션하려면 어떻게 해야 합니까?

현재 날짜 및 시간과 현재 디렉터리 이름이 지정된 파일로 출력을 리디렉션하려면 어떻게 해야 합니까?

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
  • 로그 파일은 디렉토리를 변경하기 전에 사용되었던 원래 작업 디렉토리(따라서 호출된 디렉토리)에 생성됩니다 xterm.sh$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.

관련 정보