> Bash에서 대화형으로 함수를 정의할 때 나타나는 기호

> Bash에서 대화형으로 함수를 정의할 때 나타나는 기호

내 쉘 환경의 동작이 변경되었습니다.

이전에는 다음과 같은 함수 정의를 붙여 넣을 때

function exampleFunc {
    echo hello
}

쉘에는 형식화된 것으로 나타나며 새 함수 정의를 등록합니다.

>이제 어떤 이유로 첫 번째 줄을 제외한 모든 줄 앞에 표시됩니다.

function exampleFunc {
>echo hello
>}

for 루프가 포함된 함수를 지금은 등록할 수 없는 것으로 나타났습니다.

이에 대한 설명은 무엇입니까? 이전 모드로 어떻게 되돌릴 수 있나요?


우분투 20.04

이 변경 사항은 설치 후에 발생했습니다.누셔, 하지만 관련이 없을 수도 있습니다.

답변1

이는 설치와 관련이 없습니다 nushell. 또한 쉘이 제대로 작동하는 것을 방해하지 않습니다.

이것은 >쉘의 기본값입니다두 번째 알림( PS2). 사용자가 Enter현재 명령을 완료하지 않고 키를 누른 후 셸에서 추가 입력이 필요할 때마다 보조 프롬프트가 표시됩니다. 이는 쉘이 대화형 모드일 때만 발생합니다.

POSIX 표준이것에 대해 말해봐PS2:

사용자가 <newline>대화형 셸에서 before를 입력하여 명령줄을 완료할 때마다 이 변수의 값은 매개변수 확장되어 표준 오류에 기록되어야 합니다. 기본값은 입니다 >.

특정 예에서 함수 정의는 여전히 완료해야 하는 명령입니다. 쉘은 사용자가 }정의 끝에 닫는 중괄호를 입력할 때까지 명령을 실행할 수 없습니다.

다음과 같은 경우 두 번째 메시지도 받게 됩니다.반죽bashReadline 라이브러리에 대해 "대괄호 붙여넣기"가 비활성화된 경우 쉘 명령에서. 기본적으로 대괄호 붙여넣기 모드가 활성화되어 있습니다. 이는 셸이 개별 줄이 아닌 붙여넣은 텍스트 블록을 모두 한 번에 처리한다는 의미입니다. 파일 에 다음 줄을 추가하면 ~/.inpturc이 동작을 비활성화할 수 있습니다(향후 셸 세션에서) .

set enable-bracketed-paste off

터미널이 "멍청"하거나 5.0 이전의 bash 쉘 버전을 사용하는 경우 대괄호 붙여넣기 모드도 기본적으로 비활성화됩니다.

쉘마다 다른 기본값이 있을 수 있습니다 $PS2. 예를 들어, 셸은 zsh프롬프트를 동적으로 업데이트하여 현재 처리되지 않은 명령을 알려줍니다.

$ function foo {
function> for arg do
function for>   print -r $arg
function for> done
function> }
$ foo 1 2 3
1
2
3

... bash쉘이 정적 >문자열을 사용하는 동안:

$ function foo {
> for arg do
>   printf '%s\n' "$arg"
> done
> }
$ foo a b c
a
b
c

이 셸은 POSIX 계열 셸의 보조 프롬프트와 동일한 nushell것으로 보입니다 . :::그러나 이 nushell쉘은 POSIX 쉘이 되려고 시도조차 하지 않습니다.

PS2변수를 설정하지 않으면 bash혼란이 발생할 수 있습니다. 예를 들어 방금 장기 실행 명령을 호출했다고 생각했지만 실제로는 닫는 따옴표를 잊어버린 경우 셸이 명령이 완료되기를 기다리고 있다는 표시가 없습니다.

답변2

이것은>본 쉘 변수라고보조 프롬프트 문자열.

gnu.org에서:

본 쉘 변수

Bash는 Bourne 쉘과 동일한 방식으로 특정 쉘 변수를 사용합니다. 어떤 경우에는 Bash가 변수에 기본값을 할당합니다.

보조 프롬프트 문자열,PS2

보조 프롬프트 문자열. 기본값은 ">"입니다. PS2표시하기 전에는 PS1과 같은 방식으로 확장됩니다.

다음을 사용하여 억제할 수 있습니다.

unset PS2

에서 영감을 받다https://superuser.com/a/1499801/217142


>내 쉘이 보조 프롬프트 문자열을 도입하는 이유를 이해할 수 없습니다 . 그러나 Kusalananda가 말했듯이 내가 겪고 있는 문제는 이것(또는 nushell 설치)과 관련이 없습니다. 대신, 제가 언급한 작동하지 않는 for 루프는 제가 복사했던 편집기에 실수로 탭을 가져왔기 때문에 발생했습니다. 이로 인해 bash가 발생합니다.인터럽트 기능 정의메시지 가 있습니다 display all X possibilities.

오류를 재현하려면 다음을 게시해야 합니다.

function exampleFunc { 
        echo hello; 
}

참고하세요 \s\t\t(스페이스 탭 탭) 앞으로 echo. 문제를 단순화했을 때 그 이유를 알 수 없었습니다. 고통스러운 교훈!

관련 정보