printf와 함께 read -s를 사용하는 방법

printf와 함께 read -s를 사용하는 방법

"read -s"를 사용하면 기존 줄이 삭제되고 아래 설명된 것과 같은 줄에 다음 프롬프트가 표시됩니다. 이 오류에 대한 해결책을 알려주세요. 화면에 비밀번호를 표시하는 대신 "-s"를 사용하여 읽어야 합니다.

스크립트:


$ cat a.sh
printf "Enter the db name : "
read -r sourcedb
printf "Enter the source db username: "
read -r sourceuser
printf "Enter the source database password: "
read -s sourcepwd;
printf "Enter the target database username: "
read -r targetuser

현재 출력:


$ ./a.sh
Enter the db name : ora
Enter the db username: system
Enter the db password: Enter the target database username:

원하는 출력:


$ ./a.sh
Enter the db name : ora
Enter the db username: system
Enter the db password: 
Enter the target database username:

저는 리눅스를 사용하고 있습니다.

답변1

-sread이 유틸리티의 표준 옵션 이 아닙니다 . ksh에서는 쉘 히스토리에 입력을 저장하고, bash 및 zsh에서는 터미널 에코를 억제합니다. 대부분의 다른 쉘에서는 이는 잘못된 옵션이므로 사용하려면 -sshe-bang을 지정하고 오해의 소지가 있는 확장 이름을 변경해야 합니다 ..sh

터미널을 억제한다는 echo것은 눌렀을 때 에코되는 CR 및 NL Enter도 억제된다는 의미이므로 수동으로 전송해야 합니다. 다음 프롬프트 앞에 개행 문자를 인쇄하세요(터미널 드라이버는 이를 CR+NL로 변경합니다).

프롬프트는 또한 스크립트 생성 출력용으로 예약되어야 하는 stdout이 아닌 stderr로 이동해야 합니다.

#!/bin/bash -
printf>&2 "Enter the db name: "
read -r sourcedb
printf>&2 "Enter the source db username: "
read -r sourceuser
printf>&2 "Enter the source database password: "
IFS= read -rs sourcepwd
printf>&2 "\nEnter the target database username: "
read -r targetuser

내장 read기능(에코 억제를 지원하는 쉘)은 프롬프트 자체 방출을 지원합니다(stderr로 전송됨). 그리고:bashzsh-szsh

read 'var?prompt'

ksh 및 bash와 마찬가지로:

read -p prompt var

printf따라서 다음을 사용하는 대신:

#!/bin/bash -
read -rp 'Enter the db name: ' sourcedb
read -rp 'Enter the source db username: ' sourceuser
IFS= read -rsp 'Enter the source database password: ' sourcepwd
read -rp $'\nEnter the target database username: ' targetuser

관련 정보