명령과 실행 결과를 동시에 파일에 저장하는 방법

명령과 실행 결과를 동시에 파일에 저장하는 방법

java -cp src/ nlp.lm.BigramModel wsj/ 0.1명령이 있고 명령 자체와 명령 실행 출력을 모두 파일에 저장하고 싶다고 가정해 보겠습니다 .

이를 수행하는 한 가지 방법은 다음과 같습니다.

echo "$ java -cp src/ nlp.lm.BigramModel atis/ 0.1" > trace/bigram-trace.txt    
java -cp src/ nlp.lm.BigramModel atis/ 0.1 >> trace/bigram-trace.txt

더 좋은 방법이 있나요?

답변1

( exec >logfile 2>&1; set -x; somecommand )

그렇지 않으면

( set -x; somecommand ) >logfile 2>&1

그러면 하위 쉘에서 추적이 활성화 (...)되고 모든 출력이 파일로 리디렉션됩니다 logfile.

그렇다면 파일은 다음과 같이 보일 수 있습니다 somecommand.mountlogfile

+ mount
/dev/sd0a on / type ffs (local)
/dev/sd0d on /tmp type ffs (local, nodev, nosuid, softdep)
/dev/sd0e on /var type ffs (local, nodev, nosuid)
/dev/sd0f on /usr type ffs (local, nodev)
/dev/sd0g on /usr/local type ffs (local, nodev, wxallowed)
/dev/sd0h on /home type ffs (local, nodev, nosuid, wxallowed, softdep)
/dev/sd0j on /backup type ffs (local, nodev, nosuid)
/dev/sd0k on /extra type ffs (local, nodev, nosuid, wxallowed, softdep)
mfs:92196 on /tmp_mfs type mfs (asynchronous, local, nodev, nosuid, wxallowed, size=8388608 512-blocks)

명령 +␣(더하기 기호 및 공백) 앞에 오는 것은 추적 프롬프트 또는 4차 프롬프트이며 PS4프롬프트 문자열을 설정하여 변경할 수 있습니다.

( PS4='$ '; set -x; df /tmp ) >logfile 2>&1

위와 비슷한 결과가 나올 수 있습니다

$ df /tmp
Filesystem  512-blocks      Used     Avail Capacity  Mounted on
/dev/sd0d     10315164       160   9799248     0%    /tmp

존재하다 logfile.

이는 아마도 필요한 간단한 명령에 적합합니다. 복합 명령의 경우 script사람들이 입력할 때처럼 복합 명령에 대한 셸 추적이 표시되지 않기 때문에 유사한 유틸리티를 사용하는 다른 답변이 더 적절할 수 있습니다. 변수 등도 추적 출력에서 ​​확장됩니다.

답변2

다음을 수행할 수 있습니다.

echo date | script -q bigram-trace.txt

결과:

$ cat bigram-trace.txt
date
sh-4.4$ date
Sun, Feb 18, 2018  6:22:13 PM
sh-4.4$ exit

또는 파이프 없이:

script -q bigram-trace.txt <<'eof'
date
eof

답변3

특히 하나의 명령이 아니라 여러 명령을 저장하려는 경우 간단하고 편리한 방법은 해당 명령을 먼저 실행 script한 다음 명령을 실행하는 것입니다. script각 명령의 입력과 출력을 저장합니다. 완료되면 입력 exit하거나 Ctrl-D를 눌러 종료합니다 script.

예를 들어 두 명령의 입력과 출력을 기록하려면 다음을 수행합니다.

$ script
Script started, file is typescript
$ date
Sun Feb 18 16:59:45 PST 2018
$ for i in {1..3}; do echo $((i**2)); done
1
4
9
$ exit
Script done, file is typescript

저장된 정보를 보려면 cat다음을 파일로 저장하세요 typescript.

$ cat typescript
Script started on Sun 18 Feb 2018 04:59:37 PM PST
$ date
Sun Feb 18 16:59:45 PST 2018
$ for i in {1..3}; do echo $((i**2)); done
1
4
9
$ exit

Script done on Sun 18 Feb 2018 05:00:13 PM PST

script많은 옵션이 있습니다. man script자세히보다.

답변4

나는 정기적으로 하는 일에 대한 대본을 만듭니다.

cat > foo
#! /bin/bash
echo "\$ $1" > "$2"
$1 >> "$2"
^D
chmod +x foo

그런 다음 실행

./foo "java -cp src/ nlp.lm.BigramModel atis/ 0.1" "trace/bigram-trace.txt"

관련 정보