%20%EC%BA%A1%EC%B2%98%20%EB%B0%8F%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98.png)
다음과 같이 스크립트의 모든 항목에 대해 stdout/stderr을 리디렉션할 수 있습니다.
#!/bin/bash
exec > stdout_file
echo example
하지만 이제는 전체 스크립트의 stdin을 파일에 쓰고 싶습니다. 나는 이것을 시도했습니다 :
#!/bin/bash
exec 0>stdin_file
sleep 5
sleep이 실행되는 동안 "foo"를 입력하면 파일에 쓰지 않지만 bash는 스크립트가 종료된 후 "foo" 명령을 실행하려고 시도합니다. 나는 이것이 bash가 stdin을 sleep의 stdin에 연결하지만 sleep이 stdin에서 읽지 않기 때문이라고 생각합니다.
나는 모든 사용자 입력이 스크립트 명령의 표준 입력(여기서는 "sleep"으로 표시됨)으로 전송되는 대신 파일로 리디렉션되기를 원합니다.
그 외에도 나도 시도해 봤는데
cat - >stdin_file &
그러나 bash는 cats stdin을 백그라운드로 보내는 동안 연결을 끊기 때문에 작동하지 않습니다.
답변1
귀하의 목표가 무엇인지 잘 모르겠지만 터미널에 들어가서 대화식으로 명령을 내리는 것은 약간 까다로울 수 있습니다. 이를 위해 설계된 도구는 다음과 같습니다.스크립트(1), util-linux에서.
다음을 포함하는 파일이 있다고 가정해 보겠습니다 bridge.sh
.
#!/bin/sh
read -p "What… is your name? " NAME
read -p "What… is your quest? " QUEST
read -p "What… is your favourite colour? " COLOUR
echo "Go on. Off you go."
다음 명령을 사용하여 터미널 세션을 캡처할 수 있습니다.
script -c ./bridge.sh bridge_script
사용자의 입력에만 관심이 있으므로 다음을 사용할 수 있습니다.
script -c ./bridge.sh --log-in bridge_input_script
매뉴얼 페이지 경고:
스크립트는 줄 바꿈 및 백스페이스를 포함하여 모든 것을 로그 파일에 넣습니다. 이것은 순진한 사용자가 기대하는 것이 아닙니다.
실제로 입력 로그에서 각 입력 끝에 기본 CR이 있는 것을 볼 수 있습니다. (말이 됩니다. 클릭하면 ⏎CR이 기록됩니다.)
> cat -A bridge_input_script
Script started on 2023-05-24 09:46:19-04:00 [TERM="xterm-256color" TTY="/dev/pts/4" COLUMNS="124" LINES="40"]$
My name is Sir Lancelot of Camelot.^MTo seek the Holy Grail.^MBlue.^M$
Script done on 2023-05-24 09:46:32-04:00 [COMMAND_EXIT_CODE="0"]$
(이것은 계측 중인 명령에 대해 더 많이 알지 않고도 할 수 있는 최선의 방법입니다.)
향후 분석에 필요할 수 있는 모든 데이터를 확보하기 위해 일반적으로 수행하는 작업은 다음과 같습니다.
script -c ./bridge.sh --log-timing bridge_timing_log --log-io bridge_io_log
나는 사용한다스크립트 재생(1)재생 세션:
scriptreplay --log-io bridge_io_log --log-timing bridge_timing_log -m 0.01
(저는 시간에 크게 신경쓰지 않기 때문에 -m 0.01
최대 지연 시간을 10ms로 제한합니다.)
script
다음을 포함한 몇 가지 추가 팁이 있습니다.스크립트 라이브(1), 어느실제로 세션을 다시 실행하세요.로그에서. (발에 총을 쏠 수도 있습니다. RTFM, 조심하세요!)
답변2
#! /bin/bash -
tee input.log | {
# contents of your script here
}
표준 입력은 저장되고 input.log
중괄호 안의 코드에 제공됩니다. 코드는 파이프의 입력을 보게 되며, 이는 tty 장치의 입력이 필요한 경우 동작에 영향을 미칠 수 있습니다.
다음을 사용하여 입력 및 출력을 저장할 수 있습니다.
#! /bin/bash -
set -o pipefail
tee input.log | {
# contents of your script here
} | tee output.log
( pipefail
아무것도 놓치지 않도록 tee
또는암호하지만 파이프라인 내의 종료 상태에도 영향을 미친다는 점에 유의하세요.암호).