명령이 사용자 입력을 요구할 때 명령 출력을 파일로 리디렉션하는 방법은 무엇입니까?

명령이 사용자 입력을 요구할 때 명령 출력을 파일로 리디렉션하는 방법은 무엇입니까?

사용자에게 일부 입력을 요청한 다음 결과를 터미널에 출력하는 명령이 있습니다. 출력을 파일로 리디렉션하기 위해 아래와 같은 명령을 입력했습니다.

$the_command > abc.txt

하지만 작동하지 않습니다. 문제는 프롬프트가 없다는 것입니다. 해당 프롬프트 질문의 텍스트는 내가 원하는 결과가 아닌 abc.txt로 출력됩니다.

답변1

명령이 작동하고 출력을 파일로 올바르게 리디렉션합니다 abc.txt.
질문은 ~이야스크립트가 입력 데이터를 요청하는 방식은 어떻습니까?스크립트를 어떻게 실행하고 있나요?
두 가지 예를 살펴보겠습니다.

# Script_1.sh                                     # 1
echo Please, enter your firstname and lastname    # 2
read FN LN                                        # 3
echo "Hi! $LN, $FN !"                             # 4

그리고

# Script_2.sh                                     # 5
read -p "Enter a comment " CM                     # 6
echo  "You said $CM"                              # 7

실행하면 /bin/bash Script1.sh > abc.txttty에 "Please enter..."라는 질문이 표시되지 않습니다. 키보드에서 예상되는 입력을 제공하면 파일에서 라인 #2와 #4의 출력을 찾을 수 있습니다 abc.txt.

실행하면 "댓글을 입력하세요"라는 질문이 표시되지만 파일에서는 #7행의 출력만 /bin/bash Script2.sh > abc.txt찾을 수 있습니다 .abc.txt

참고: 서브셸에서 Script2,sh를 실행하는 경우

(bash Script2.sh 2>&1)> abc.txt

tty에서는 어떤 출력도 볼 수 없으며 파일에서 모든 것을 찾을 수 있습니다 abc.txt.
당신이 그것을 실행하면

bash Script2.sh 2>ccc.txt 1>ddd.txt`

에서는 표준 출력(7번째 줄)을 찾을 수 ddd.txt있고 에서는 표준 오류(6번째 줄)를 찾을 수 있습니다 ccc.txt.


네가 원한다면명령 출력의 일부만 리디렉션하려면스크립트를 수정해야 합니다.
이를 수행하는 방법 중 하나는 흥미로운 출력을 생성하는 스크립트 부분을 이동하는 함수를 만드는 것입니다(아래 참조). 그런 다음 다음에서 이 함수를 호출할 수 있습니다.주요 부분스크립트(원래 함수로 이동한 코드)에서 해당 출력만 로그 파일로 리디렉션합니다.

 Part_To_Redirect(){
     : # all that you want
 }

 # ... Main part of the script
 # point where it was the part that generates the output
 Part_to_Redirect "$@" > abc.txt   # this to store only that part in the file
 # Part_to_Redirect "$@" >> abc.txt  # this to append that part in the file
 # ...

당신은 심지어 유용하다고 생각합니다tee저것

출력을 여러 파일로 리디렉션합니다.표준 입력을 표준 출력으로 복사합니다.또한 인수로 제공된 모든 파일에도 적용됩니다.

 the_command  | tee abc.txt       # To redirect Standard output
 or 
 the_command 2>&1 | tee abc.txt   # To redirect err in out and both in the file

이 경우 tty에 명령의 일반적인 출력이 표시되지만 동시에 로그 파일에 복사본이 저장됩니다 abc.txt. read -pscript2에서 호출을 사용하는 경우에는 편안해야 합니다 the_command | tee abc.txt.

참고 및 참고자료:

추가 "$@"하면 할 수 있습니다모든 주장을 통과하다스크립트를 함수에 추가하세요.

인터넷의 여러 소스에서 bashredirection에 대한 자세한 내용을 읽어보면 흥미로울 수 있습니다.

답변2

기본적으로 STDOUT리디렉션 및/또는 파이프만 가능합니다. 당신이 원하는 것은 내버려두고 리디렉션을 STDOUT통해 전달되는 모든 것입니다 STDIN.

편집이 the_command옵션인 경우 질문이 STDERR대신 출력되는지 확인한 다음(리디렉션에 관계없이 화면에 덤프해야 함) 사용자가 를 통해 입력하는 내용을 화면에 다시 표시하도록 할 수 있습니다 STDOUT.

답변3

STDOUT일반적 으로 (일반 출력용) 및 STDERR(오류 메시지용)이라는 두 가지 중요한 출력 파이프가 있습니다 .

여기서 문제는 명령의 "일반" 출력과 프롬프트 텍스트가 모두 에 기록되므로 STDOUT항상 같은 위치에 저장된다는 것입니다. 리디렉션을 사용하면 STDOUT프롬프트를 포함하여 전체가 필요합니다.

명령을 다시 작성할 수 없는 경우(Jarmund의 다른 답변에서 제안됨) 명령에 --output리디렉션을 사용하는 대신 일부 출력 파일을 지정할 수 있는 추가 옵션/플래그(예: )가 있을 수 있습니까?

관련 정보