두 개 이상의 읽기 명령을 한 번에 실행할 수 없는 이유는 무엇입니까(일부 구분 구문 없이)?

두 개 이상의 읽기 명령을 한 번에 실행할 수 없는 이유는 무엇입니까(일부 구분 구문 없이)?

다음 두 명령을 터미널에 복사하여 붙여넣어 보았습니다.곧장그런 다음 실행하십시오.

read -s x
read -s y

현재 출력은 빈 프롬프트이지만 원하는 출력은 첫 번째 read실행과 두 번째 read실행에 대한 것입니다.

나는 다음과 같은 방법으로 이 문제를 극복할 수 있었습니다.

read -s x &&
read -s y

하지만;

두 개 이상의 읽기 명령을 한 번에 실행할 수 없는 이유는 무엇입니까(일부 구분 구문 없이)?

답변1

<newline>기본적으로 문자가 붙여넣은 텍스트의 일부인지 사용자가 입력했는지 여부는 터미널에 아무런 차이가 없습니다. 붙여넣을 때

read -s x
read -s y

after는 터미널이 해당 행을 쉘로 보내도록 <newline>합니다 . read -s x쉘은 그것을 구문 분석하고 그것이 전체 명령 터미널임을 찾아 실행합니다. read그런 다음 표준 입력에서 무언가를 기다리고 터미널은 라인을 공급 read -s y하고 마지막으로 값을 설정합니다 x.

read -s x대략적으로 을 입력 하고, 를 누르고 Enter, 를 입력하고 read -s y, 다시 누르는 것처럼 작동합니다 Enter.

추가 작업이 필요한지 여부 Enter, x값이 정확히 무엇인지, 실제로 인쇄되는 내용 및 후속 행에서 발생하는 작업은 셸과 터미널을 설정하는 모드에 따라 다릅니다. 예를 들어, Bash 5.0을 사용하고 클립보드의 두 줄이 모두 로 시작한다고 가정하면 <newline>,

                        # Pasting with Ctrl + Shift + v, Enter
$ read -s x
$                       # The prompt comes back after pressing Enter again
$ declare -p x y
"eclare -- x="read -s y
bash: declare: y: not found

( 의 출력은 declare혼란스러워 보입니다.) 줄 편집이 활성화된 경우(기본값) Bash가 터미널을 \r(캐리지 리턴)을 (줄 바꿈)으로 변환하지 않도록 구성했기 때문입니다. 먼저 터미널에 → 변환을 활성화하도록 지시할 때 터미널은\nread\r\n이미두 번째 붙여넣은 줄 다음에 a(줄바꿈을 누르거나 붙여넣을 때 전송되는 문자 \r)를 버퍼에 넣으면 해당 줄이 문자 그대로 값에 추가되고 입력의 끝을 알리려면 키를 눌러야 합니다.EnterreadxEnter

붙여 넣으면 이런 일이 발생하지 않습니다

read -s x &&
read -s y

쉘이 read -s x &&불완전한 "AND"로 해석되기 때문에목록전체 명령이 실행될 때까지 추가 입력을 기다립니다.

너의 길할 수 있는한 번에 여러 명령을 붙여넣는 작업은 "대괄호 붙여넣기"를 사용하여 수행됩니다. 이 모드에서는 붙여넣은 텍스트가 수동으로 입력한 것으로 처리되지 않고 단일 문자열로 버퍼에 삽입됩니다.

불다그것을 지지하다버전 4.4부터. 추가하여 활성화할 수 있습니다.

set enable-bracketed-paste on

Readline 초기화 파일에 (기본적으로 ~/.inputrc).

지쉬그것을 지지하다버전 5.1부터 ZLE(Zsh Line Editor)가 활성화되면 기본적으로 활성화됩니다.

작동 방식과 활성화 방법에 대한 자세한 내용은 다음을 참조하세요.

답변2

일종의 구분 구문이 필요합니다. 그렇지 않으면 read한 명령이 끝나고 다음 명령이 시작되는 위치를 어떻게 알 수 있습니까?

을 사용하면 첫 번째 항목이 오류를 반환하지 않는 경우 &&에만 두 번째 항목이 실행됩니다 . read두 번째 항목이 항상 실행되도록 하려면 ;다음과 같이 사용할 수 있습니다.

read -s x ; read -s y

하지만 하나를 수행하여 read변수에 저장 x하고 두 번째 작업을 수행하여 read변수에 저장하려는지 는 확실하지 않습니다.y 또는하나를 실행 read하고 동일한 결과를 x및 에 저장하려는 경우 y. 내 제안은 전자입니다.

관련 정보