최신 Mac OS를 실행하고 zshell을 사용하고 있는데 쉘 스크립트를 작성하는 데 문제가 있습니다. 내 작업의 대부분은 명령줄을 통해 수행되며 모든 입력 명령과 출력을 자동으로 저장하고 기록하는 bash 스크립트를 갖고 싶습니다.
가장 확실한 선택은 일반적으로 다음과 같이 명령줄에서 실행되는 bash "script" 명령입니다.
script -a <filename>.txt
log.sh
다음 내용으로 쉘 스크립트를 작성했습니다 .
#! /bin/sh
echo "Welcome to the jungle."
# get date
now=$(date +%Y_%m_%d)
# create filename
fname='log_'$now'.txt'
# file save location
floc=~/path/to/directory/$fname
# start script
script -a -q $floc
그러면 파일 이름이 오늘 날짜이고 지정된 디렉터리에 저장되는 스크립트가 시작됩니다. 그러나 파일 내용을 쓰는 것 외에는 잘 작동합니다. 예상했던 계획된 텍스트 입력/출력 대신 파일을 읽기 어렵게 만드는 ANSI 문자라고 생각되는 내용을 얻었습니다.
내 명령줄은 다음과 같습니다.
~$ bash log.sh
Welcome to the jungle.
~$ echo "Hello world"
Hello world
~$ exit
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
그리고 로그 파일에 기록되는 방식은 다음과 같습니다.
[1m[7m%[27m[1m[0m
]7;file://<myname>/Users/<myusername>
[0m[27m[24m[J[36m<myusername> [38;5;246m~[39m$ [K[?2004heecho "Hello world! "[?2004l
Hello world
[1m[7m%[27m[1m[0m
]7;file://<myname>/Users/<myusername>
[0m[27m[24m[J[36m<myusername> [38;5;246m~[39m$ [K[?2004heexit[?2004l
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
명령을 사용하여 cat
텍스트를 표시하거나 Perl 스크립트를 사용하여 키를 제거하는 등 파일을 만든 후 ANSI 키를 처리하는 방법이 여러 가지 있다는 것을 알고 있지만 cat
큰 파일을 보려고 하면 짜증이 납니다. 명령을 사용하는 것도 귀찮고 파일을 수동으로 정리해야 하는 것도 귀찮습니다. 명령줄 입력 및 출력을 기록할 수 있는 방법이 있습니까?아니요ANSI 키?
감사합니다!
답변1
쉬운 방법은 를 사용하는 것입니다 less -R
. 이것은 정확히 귀하가 요청한 내용은 아니지만 어쨌든 도움이 될 수 있습니다.
답변2
이것은 작동하는 것 같습니다:
#!/usr/bin/env zsh
{
# Create a named pipe, using a temp file name.
mkfifo -m 600 ${fifo::=$(mktemp -u)}
logFile="~/logs/log-$(date +%F-%H-%M-%S).txt"
print "Logging to $logFile"
# Launch the filter in the background (&), so it will
# run in parallel with the script utility.
# This will read from the named pipe, remove the ansi
# color escapes, and write the result to the log.
# (perl source: https://superuser.com/a/1388860).
perl -pe 's/\e\[[\x30-\x3f]*[\x20-\x2f]*[\x40-\x7e]//g;
s/\e[PX^_].*?\e\\//g;
s/\e\][^\a]*(?:\a|\e\\)//g;
s/\e[\[\]A-Z\\^_@]//g;' \
< $fifo > ${~logFile} &
# Get the process id of the background process.
fifoPid=$!
# Launch the script utility, capturing data from the
# interactive shell. -F ensures writes are immediately
# available in other processes.
script -q -F $fifo
# script -q -F $fifo bash
# The background process will end when the script
# utility closes its handle to the fifo, i.e. when the
# shell launched by 'script' exits. But it may not exit
# immediately, so it could be running when we get to
# this point. This will bring it to the foreground, just
# in case some other actions follow this script.
wait $fifoPid
} always {
# cleanup temp fifo.
if [[ -p $fifo ]] rm $fifo
}
이것은명명된 파이프script
실시간으로 출력을 필터링 합니다 . 시작된 쉘에서 후처리로 정리 필터를 실행할 수도 있지만 script
그다지 재미는 없습니다.