두 개의 스크립트가 있습니다.
test_input.sh
SSH를 통해 실행되는 스크립트입니다. 이 스크립트에서는 사용자에게 무언가를 입력하도록 요청합니다.test_ssh_connection.sh
localhost
스크립트를 연결하고 실행하는 스크립트입니다.test_input.sh
test_ssh_connection.sh
출력을 test_input.sh
파일로 리디렉션하고 싶지만 test_input.sh
프롬프트를 볼 수 있기 때문에 화면에 입력 프롬프트를 표시하고 싶습니다.
이 내 꺼야 test_ssh_connection.sh
:
echo "Connecting to localhost and executing an input script."
ssh "localhost" "sh test_input.sh" >> "test.txt"
이것은 test_input.sh
:
echo -n "Give me a value: "
read value
echo "You gave me [${value}]."
test.txt
실제로 실행 후의 내용은 다음과 같습니다 test_ssh_connection.sh
.
Give me a value: You gave me [asd].
현재 프롬프트 Give me a value:
는 터미널에만 있고 test.txt
터미널에는 없습니다. 대신 내가 원하는 것은 그것을 터미널에 표시하고 가능하다면 test.txt
.
찾았어요이것>/dev/tty
질문이 있는데 ssh/ 를 통해 호출하면 첨자가 작동하지 않는 것 같습니다 >$(tty)
.
답변1
이러한 이유로 응용 프로그램의 일반 출력에 속하지 않는 프롬프트와 기타 대화형 메시지는 일반적으로 표준 오류 스트림에 기록됩니다. 예를 들어 기본 프롬프트는 셸의 표준 오류 스트림에 기록됩니다.
다음 명령이 주어지면 read
유틸리티는 bash
표준 오류 메시지를 표시합니다 -p
.
#!/bin/bash
read -r -p 'Give me a value: ' value
printf 'You gave me [%s].\n' "$value"
당신 과 /bin/sh
비슷한 일을 해보세요
#!/bin/sh
printf 'Give me a value: ' >&2
read -r value
printf 'You gave me [%s].\n' "$value"
리디렉션은 >&2
출력을 printf
표준 오류로 리디렉션합니다.
관련된:
당신은 글을 쓰고 싶나요?TTY로 직접 연결그런 다음 이 두 가지 변형 중 두 번째 변형을 사용하고 리디렉션을 통해 메시지를 표시합니다 >/dev/tty
. ssh -t
이 작업을 수행하려면 의사 TTY 할당을 사용해야 합니다 . 또한 이렇게 하면 프롬프트에 표준 오류를 사용하지 않으므로 상당히 일반적인 습관이 깨집니다.