대화식 쉘이 비대화식이 될 수 있습니까?
참고 : "? 대화 형 및 비 대화 형의 차이점은 무엇입니까"나는 기본적인 질문에 대한 연구를 많이 해봤 내 연구의 결과는 물어 저를 이끌어 이 질문을.
이 질문은 대답하기 위해 "대화식"에 어떤 유형 의 정의를 사용 하는 것이 중요하기 때문에 부분적으로 긴 서문을 가지고 있습니다. 정의는 특정 세트에 대한 임의의 레이블 일 수 있습니다. 다양한 특성을 설명 할 수 있습니다. 또는 행동 을 예측 하고 목적을 이해 하는 데 사용할 수있는 정보를 제공 할 수 있습니다 . 이 마지막 유형은 "액션 정의"또는 "동적 정의"라고하며 가장 유용합니다.
에는 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 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}
설정되지 않은 매개 변수와 함께 사용하는 유사한 테스트 는 비슷한 결과를 생성 $-
하며 셸 대화 형 작업의 "진리 소스"가 아님을 다시 확인합니다 .
마지막으로 쉘의 결정적인 '상호 작용 성'특성은 어디에 저장됩니까?
그리고 대화식 쉘이 비대화식이 될 수 있습니까? (...이 특성을 바꾸어?)