대화식 쉘이 비대화식이 될 수 있습니까?


16

대화식 쉘이 비대화식이 될 수 있습니까?

참고 : "? 대화 형 및 비 대화 형의 차이점은 무엇입니까"나는 기본적인 질문에 대한 연구를 많이 해봤 내 연구의 결과는 물어 저를 이끌어 질문을.

이 질문은 대답하기 위해 "대화식"에 어떤 유형 의 정의를 사용 하는 것이 중요하기 때문에 부분적으로 긴 서문을 가지고 있습니다. 정의는 특정 세트에 대한 임의의 레이블 일 수 있습니다. 다양한 특성을 설명 할 수 있습니다. 또는 행동예측 하고 목적을 이해 하는 사용할 수있는 정보를 제공 할 수 있습니다 . 이 마지막 유형은 "액션 정의"또는 "동적 정의"라고하며 가장 유용합니다.


에는 man 1p sh다음과 같은 대화식 쉘 정의가 제공됩니다.

   If the -i option is present, or  if  there  are  no  operands  and  the
   shells  standard  input and standard error are attached to a terminal,
   the shell is considered to be interactive.

"-i option"에 대한 언급과 "operands"라는 단어의 사용에서, 이것은 실행중인 쉘에서 검사 할 수있는 속성이 아니라 쉘의 호출을 나타 냅니다.

Bash 매뉴얼 페이지는 약간 다르게 표현합니다.

   An interactive shell is one started without  non-option  arguments  and
   without the -c option whose standard input and error are both connected
   to terminals (as determined by isatty(3)), or one started with  the  -i
   option.   PS1 is set and $- includes i if bash is interactive, allowing
   a shell script or a startup file to test this state.

첫 번째 문장의 정의는 다시 쉘 의 시작 만을 나타냅니다 .

두 번째 문장 (내 필독서)은 쉘이 "대화식"으로 정의 된 특정 방식으로 쉘이 시작되었는지 여부를 설정하기 위해 프록시 로 사용되는 조건을 정의합니다 .

주의 내가 할 수 없습니다 로이 문장을 해석 : "A의 bash 쉘이 경우 대화 형 및 경우에만이 $-. '난'포함" 대화 형 $-정의 가 아니라 편리한 지표 인 것 같습니다 . 이것은 내 질문과 매우 관련이 있습니다.


이 두 가지 (POSIX sh정의 및 Bash)는 "interactive"레이블이 어떤 환경에서 시작한 쉘에 적용되는지를 알려주는 기계적 정의입니다. 그들은없는 활동 정의 그들이 어떤 포기하지 않는 한 영향 이 라벨을.

그러나 Bash 매뉴얼 페이지의 나머지 부분에는 "대화식 쉘이 아닌 경우"또는 "대화식 쉘에서만 또는 _____ 옵션이 설정된 경우"와 같은 특정 방식으로 동작하는 쉘에 대한 참조가 뿌려져 있습니다. (많은 예가 있으며이 질문의 핵심은 아닙니다.)

따라서 "인터랙티브"는 맨 페이지의 나머지 부분에서 설명하는 기본 "인터랙티브"동작 (옵션 설정) 모음에 대한 편리한 레이블이라는 점에 동의합니다. 본질적인 용어 나 대상이 아닙니다. 쉘의 소스 코드 외에는 권위있는 정의가 없습니다. (예를 들어, "오픈 파일 디스크립터"또는 "중지 된 프로세스"라는 용어는 커널 자체 디자인에 내장 된 추상화를 나타냅니다.)

(POSIX 정의에 정의되어 있지만 sh매뉴얼 페이지 [ man 1p sh]는 "쉘이 대화식이 아닌 한"과 비슷한 문장의 사용이 훨씬 적 man bash으며 호출 시간 차이에 거의 독점적으로 초점을 맞추므로 Bash에 중점을 둘 것입니다 이 시점부터.)


쉘이 "대화식"이라는 의미는 어쨌든 다른 명령을 읽기 전에 쉘에 의해 어떤 파일이 소스 화되는지와 같이 호출시 에만 관련 이 있습니다. 그러나이 있다 언제든지 관련이있는 (적어도 배쉬에서) 의미는. 따라서 주어진 실행중인 쉘에 대해 대화식인지 아닌지 를 알려주는 방법이 있어야합니다 .

set +i대화 형 Bash 셸에서 실행 하면의 내용에서 'i'가 제거됩니다 $-.

문제는 이것이 실제로 쉘이 더 이상 대화식이 아님을 의미합니까?

Bash의 정확한 정의 에 따르면 정의 에 'i'가 있어야 하는 곳 이 없기 때문에 다음 과 같이 해서는 안됩니다 .$-

   An interactive shell is one started without  non-option  arguments  and
   without the -c option whose standard input and error are both connected
   to terminals (as determined by isatty(3)), or one started with  the  -i
   option.

정확한 정의를 엄격하게 읽으면 다음과 같은 의문이 제기됩니다. 대화식 터미널의 표준 입력 또는 표준 연결이 더 이상 터미널에 연결되지 않도록 리디렉션되면 쉘이 비대화식이됩니까?

(이 나타납니다 "그 표준 입력 및 오류 모두 ... 단자에 연결되어있는이 일에 대한 대답은"아니오 "와 맨 페이지가 수정 포함되지 수도 있음을 , 호출시를 "하지만 난 몰라 확실하게.)


대답이 "아니오, 쉘이 비대화식이 될 수없고, 그 반대도 될 수 없습니다" 라면, 쉘이 대화식인지 여부를 결정 하는 확실한 방법 은 무엇 입니까?

또 다른 방법을 넣어 : 후 지속에 "대화 형 쉘"의 행위가있는 경우 set +i, 사용되는지 그 행동이 계속 적용해야하는지 결정하기가?


않을까 사람의 의심을 :이 있습니다 쉘의 행동 후 지속되는 대화 형을 연상시켰다 set +i및 쉘의 행동이 아닌 대화 후 지속되는 호출 set -i. 예를 들어, 다음에서 발췌 한 내용을 고려하십시오 man bash.

COMMENTS
   In a non-interactive shell, or an interactive shell in which the inter-
   active_comments  option  to  the  shopt  builtin  is enabled (see SHELL
   BUILTIN COMMANDS below), a word beginning with # causes that  word  and
   all  remaining  characters  on that line to be ignored.  An interactive
   shell without the interactive_comments option enabled  does  not  allow
   comments.  The interactive_comments option is on by default in interac-
   tive shells.

따라서 interactive_comments옵션 을 설정 해제하면 대화식 쉘과 비 대화식 쉘의 차이점을 알 수 있습니다. 이 차이의 지속성은 다음 스크립트에 의해 설명됩니다.

#!/bin/bash

# When the testfile is run interactively,
# all three comments will produce an error
# (even the third where 'i' is not in '$-').
# When run noninteractively, NO comment will
# produce an error, though the second comment
# is run while 'i' IS in '$-'.

cat >testfile <<'EOF'
shopt interactive_comments
shopt -u interactive_comments
shopt interactive_comments
echo $-
#first test comment
set -i
echo $-
#second test comment
set +i
echo $-
#third test comment
EOF

echo 'running bash -i <testfile'
bash -i <testfile
echo 'running bash <testfile'
bash <testfile

이는 "interactive"와 " i값이 $-"과 동일 하지 않음을 확인 합니다.

${parameter:?word}설정되지 않은 매개 변수와 함께 사용하는 유사한 테스트 는 비슷한 결과를 생성 $-하며 셸 대화 형 작업의 "진리 소스"가 아님을 다시 확인합니다 .


마지막으로 쉘의 결정적인 '상호 작용 성'특성은 어디에 저장됩니까?

그리고 대화식 쉘이 비대화식이 될 수 있습니까? (...이 특성을 바꾸어?)


답변:


9

내가 묻는 질문은 왜 누군가가 그것을 원할까요?

다음과 같은 대화식 쉘의 일부 측면을 비활성화 할 수 있습니다.

  • PS1= PS2= 프롬프트를 비활성화하려면
  • set +m 작업 제어를 비활성화하려면
  • 일부 쉘에서 히스토리 비활성화
  • 에서 zle및 모든 완료 모듈 을 언로드 할 수 있습니다 zsh.

그러나 쉘이 대화식으로 작동하지 않게하려면 대신 다음을 수행하십시오.

. /some/file; exit

에서 나머지 명령 얻을 그것을 말해 /some/file(교체 /dev/tty아직도의 행동처럼 (non-interactive) 형 모드 쉘에서 약간의 차이가있을 것이지만, 여전히 명령은 TTY 장치에서 읽을하려는 경우)를 return하거나 사실 여전히 작업 제어를 수행하거나

exec myshell /dev/tty

현재 대화식 쉘을 비 대화식 쉘로 바꾸어 여전히 tty 장치에서 명령을 읽는다.

bash 4.4에서는 대부분의 다른 쉘에서 set +ibash: set: +i: invalid option같이 리턴됩니다 .


그것은 우스운 일이 될 것이라고 절대적으로 동의했다 . 앞서 언급 한 "대화 형"이라는 개념은 쉘과 상호 작용할 때 유용한 기본 동작의 모음 일뿐 입니다. 각 동작을 개별적으로 변경할 수 있고 각 동작을 변경하면 "대화식 쉘입니까?"라는 질문이 있습니다. 그냥 어리석은 의미입니다. 중요한 질문조차 아닙니다. 그러나 ..
와일드 카드

1
@Wildcard, exec < <(sleep infinity)대화식 쉘을 사용한다면 대화식 쉘이 아닙니다. 쉘은 여전히을 $-포함 하는 대화식으로 간주 i하지만 그렇지 않을 수도 있습니다. 그것에 대해 더 많은 논의가 있는지 잘 모르겠습니다.
Stéphane Chazelas

2
@Wildcard, 쉘이로 시작 interactive되면 그대로 유지됩니다. set +i이전 bash 버전에서 할 수 있다는 사실 은 버그였습니다.
Stéphane Chazelas

1
@Wildcard,의 소스 코드를 보면 의 플래그에 매핑 bash되는 interactive전역 부울 변수 가있을 것 i입니다 $-. 부울을 변경해도 대화식 쉘의 모든 동작이 자동으로 변경되는 것은 아닙니다. 대화식에서 비 대화식으로의 변경은 지원되지 않습니다.
Stéphane Chazelas

4
@Wildcard Dash는 set +i프롬프트 표시를 허용 하고 중지합니다. 이것은 사용자가해서는 안되는 일이므로, 동작이 쉘에 의존하고 쉘 구현자가 의도적으로 결정한 결과가 아니라 우연히 발생하는 것은 놀라운 일이 아닙니다.
Gilles 'SO- 악마 그만'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.