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
sh
xterm 호출이$SHELL
쉘 코드라고 생각하는 것을 해석하도록 하는 대신 명시적으로 호출하십시오.- 또한 이를 통해 첫 번째 위치 인수를 통해 안전한 방법으로 디렉토리를 쉘에 전달할 수 있습니다.
errexit
명령이 실패하면 중단하는 옵션을 사용하여 실패하면 실행하지 않도록 하세요 . 좋은 측정을 위해 추가되었지만 이 간단한 코드에는 필요하지 않습니다.make
cd
nounset
- 로그 파일은 디렉토리를 변경하기 전에 사용되었던 원래 작업 디렉토리(따라서 호출된 디렉토리)에 생성됩니다
xterm
.sh
$OLDPWD
cd
$PWD
sh
make의 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
사용의 대안은 tee
use 이며 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
.