대화형 쉘이 비대화형 쉘이 될 수 있고 그 반대도 가능합니까?

대화형 쉘이 비대화형 쉘이 될 수 있고 그 반대도 가능합니까?

대화형 쉘이 비대화형 쉘이 될 수 있고 그 반대도 가능합니까?

노트:"인터랙티브와 비인터랙티브의 차이점은 무엇인가?"라는 기본적인 질문에 대해 많은 연구를 했고, 연구 결과에 따라 다음과 같은 질문을 하게 되었습니다.이것질문.

이 질문은 부분적으로 중요하기 때문에 서문이 깁니다.유형이 질문에 대답하기 위해 우리는 "상호작용"의 정의를 사용합니다. 정의는 컬렉션에 대한 모든 레이블이 될 수 있으며 다양한 속성을 설명할 수도 있습니다.행동을 예측하다그리고 이해하다목적. "액션 정의" 또는 "동적 정의"라고 부르는 마지막 유형이 가장 유용합니다.


에서는 man 1p sh대화형 셸에 대해 다음과 같은 정의가 제공됩니다.

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

"-i 옵션"에 대한 언급과 "피연산자"라는 단어의 사용으로 판단하면 이는 쉘의옮기다,실행중인 쉘에서 확인할 수 있는 속성이 아닙니다.

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.

첫 번째 문장의 정의는 다시 다음을 나타냅니다.시작껍질.

(내 독서에서) 두 번째 문장은 다음과 같이 사용되는 조건을 정의합니다.연기"대화형"으로 정의된 특정 모드에서 쉘이 시작되는지 여부를 결정합니다.

알아채다그래요아니요이 문장을 다음과 같이 해석하십시오. " $-bash 쉘은 'i'가 포함된 경우에만 대화형입니다." $-대신에 편리한 지표인 것 같습니다.정의상호 작용의. 이것은 내 질문에 매우 중요합니다.


둘 다(POSIX sh정의 및 Bash 정의)는 "대화형" 레이블이 실행하는 셸에 적용되는 상황을 알려주는 기계적 정의입니다. 그들은 그렇지 않다액션 정의아무것도 안주기 때문에영향이 라벨의.

그러나 나는 Bash 매뉴얼 페이지의 나머지 부분이 "대화형 쉘이 아닌 한" 또는 "대화형 쉘에서만 또는 _____ 옵션이 설정되지 않은 경우" 특정 방식으로 작동하는 쉘에 대한 참조로 가득 차 있다는 것을 발견했습니다. (예시가 너무 많아서 이 질문의 요점은 아닙니다.)

따라서 나는 "대화형"이 매뉴얼 페이지의 나머지 부분에 설명된 기본 "대화형" 동작(옵션 설정) 모음에 대한 편의 레이블일 뿐이라는 점을 인정합니다. 그것은 그 자체로 근본적인 용어나 대상이 아니며, 근본적인 개념입니다. 쉘의 소스 코드 외에는 권위 있는 정의가 없습니다. (커널 자체 설계에 내장된 추상화를 나타내는 "파일 설명자 열기" 또는 "프로세스 중지"와 같은 용어와는 다릅니다.)

(POSIX 정의에도 정의되어 있지만 "셸이 대화형이 아닌 경우"와 유사한 설명은 sh매뉴얼 페이지 [ ]에서 훨씬 덜 자주 사용되며 거의 전적으로 호출 시간 차이에 중점을 둡니다. 지금).man 1p shman bash


쉘 "대화형"의 일부 의미는 관련이 있습니다.전화할 때어쨌든, 예를 들어 다른 명령을 읽기 전에 쉘이 얻는 파일. 그러나(적어도 Bash에서는) 항상 관련이 있다는 의미입니다. 그러므로 주어진 상황에 따라 결정하는 방법이 있어야 합니다.달리기대화식이든 아니든 쉘입니다.

대화형 Bash 셸에서 실행하면 set +i'i'가 에서 종료됩니다 $-.

문제는 다음과 같습니다이것은 실제로 쉘이 더 이상 대화형이 아니라는 것을 의미합니까?

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.

정확한 정의를 엄격히 읽어보면 다음과 같은 질문이 제기됩니다.대화형 터미널의 stdin 또는 stderr이 리디렉션되어 더 이상 터미널에 연결되지 않으면 쉘이 비대화형이 됩니까?

(그것나타나다이 질문에 대한 대답은 "아니요"입니다. 매뉴얼 페이지에는 "표준 입력과 오류가 모두 터미널에 연결되어 있습니다..."라는 수정자가 포함될 수 있습니다.전화할 때,"하지만 잘 모르겠어요.)


대답이 "아니요, 쉘은 비대화형이 될 수 없으며 그 반대도 마찬가지입니다"인 경우무엇인가요명확한쉘이 대화형인지 확인하는 방법은 무엇입니까?

다시 말해서:이후에도 "대화형 셸" 동작이 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"와 "has" i의 값을 확인합니다.$-아니요동일한.

${parameter:?word}매개변수 세트를 사용하지 않은 유사한 테스트는 유사한 결과를 생성하며 이것이 $-쉘 상호작용에 대한 "진실의 소스"가 아님을 다시 확인합니다.


그래서 마침내,쉘의 명시적인 "상호작용" 기능은 어디에 저장됩니까?

그리고,대화형 쉘이 비대화형 쉘이 될 수 있고 그 반대도 가능합니까? (...이 기능을 변경하면?)

답변1

제가 드리고 싶은 질문은왜 누군가가 이것을하고 싶어할까요?

다음과 같은 대화형 셸의 특정 측면을 비활성화할 수 있습니다.

  • PS1= PS2=프롬프트 비활성화
  • set +m작업 제어 비활성화
  • 일부 쉘에서 기록 비활성화
  • zle에서 및 모든 완성 모듈을 제거할 수도 있습니다 zsh.

그러나 셸의 상호 작용을 중지하려면 다음을 수행할 수 있습니다.

. /some/file; exit

나머지 명령을 가져오도록 지시합니다( /some/filetty 장치에서 명령을 계속 읽으려면 로 바꾸십시오). 그러나 동작이나 여전히 수행한다는 사실과 같이 비대화형 셸과 여전히 약간의 차이점이 있습니다. 작업 제어 또는:/dev/ttyreturn

exec myshell /dev/tty

현재 대화형 쉘을 tty 장치에서 명령을 계속 읽는 비대화형 쉘로 바꾸십시오.

bash 4.4에서는 set +i반환된 결과가 bash: set: +i: invalid option대부분의 다른 셸의 결과와 유사합니다.

관련 정보