다음 두 명령을 터미널에 복사하여 붙여넣어 보았습니다.곧장그런 다음 실행하십시오.
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
(캐리지 리턴)을 (줄 바꿈)으로 변환하지 않도록 구성했기 때문입니다. 먼저 터미널에 → 변환을 활성화하도록 지시할 때 터미널은\n
read
\r
\n
이미두 번째 붙여넣은 줄 다음에 a(줄바꿈을 누르거나 붙여넣을 때 전송되는 문자 \r
)를 버퍼에 넣으면 해당 줄이 문자 그대로 값에 추가되고 입력의 끝을 알리려면 키를 눌러야 합니다.Enterread
x
Enter
붙여 넣으면 이런 일이 발생하지 않습니다
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)가 활성화되면 기본적으로 활성화됩니다.
작동 방식과 활성화 방법에 대한 자세한 내용은 다음을 참조하세요.
- 텍스트를 붙여넣은 후 터미널이 자동으로 명령을 입력하는 이유는 무엇입니까?
- Bash에서 여러 줄 붙여넣기 방지(Bash에서 괄호 붙여넣기를 활성화하는 방법도 설명했습니다)
답변2
일종의 구분 구문이 필요합니다. 그렇지 않으면 read
한 명령이 끝나고 다음 명령이 시작되는 위치를 어떻게 알 수 있습니까?
을 사용하면 첫 번째 항목이 오류를 반환하지 않는 경우 &&
에만 두 번째 항목이 실행됩니다 . read
두 번째 항목이 항상 실행되도록 하려면 ;
다음과 같이 사용할 수 있습니다.
read -s x ; read -s y
하지만 하나를 수행하여 read
변수에 저장 x
하고 두 번째 작업을 수행하여 read
변수에 저장하려는지 는 확실하지 않습니다.y
또는하나를 실행 read
하고 동일한 결과를 x
및 에 저장하려는 경우 y
. 내 제안은 전자입니다.