ANSI 문자를 저장하지 않고 모든 명령줄 입력 및 출력이 포함된 텍스트 파일을 어떻게 저장할 수 있습니까?

ANSI 문자를 저장하지 않고 모든 명령줄 입력 및 출력이 포함된 텍스트 파일을 어떻게 저장할 수 있습니까?

최신 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그다지 재미는 없습니다.

관련 정보