Bash 옵션 및 대화형 셸

Bash 옵션 및 대화형 셸

bash의 -s 옵션은 실제로 아무것도 하지 않는 것 같습니다.

명령을 실행해도 아무런 변화가 없습니다. 정말 혼란스러운 점은 쉘 스크립트를 실행할 때 항상 대화형 쉘이 나타나는 것 같다는 것입니다. 스크립트에서 읽기 내장 함수를 사용할 때 항상 입력하라는 메시지가 표시되기 때문에 대화형이라고 가정합니다. 이렇게 하면 대화형이 되나요?

쉘 스크립트가 페도라에서 대화식으로 실행됩니까? -s가 차이를 만들 수 있는 예가 있습니까? 매뉴얼 페이지를 읽었지만 효과가 있는 예제를 직접 생성할 수 없는 것 같습니다. s를 사용하여 스크립트가 입력을 받는 방식을 변경하려고 하기 때문에 두 질문을 모두 병합했으며 일부 튜토리얼에서는 효과가 있다고 말합니다. 나는 그것이 매개 변수를 설정할 수 있다는 것을 알고 있습니다. 내가 이해하지 못하는 것은 항상하는 것처럼 보이는 stdin에서 읽도록 변경하는 방법입니다.

제가 테스트했던 내용이에요

if [ -v $PS1 ]
then
  echo non-interactive
else
  echo interactive
fi
read ; echo $REPLY

읽기는 항상 비대화형 쉘에서 작동합니다.

비대화형 쉘에서 fd/0 및 fd/1의 존재를 테스트할 때에도 여전히 존재합니다.

미리 감사드립니다

답변1

Bash는 입력/출력이 터미널에 연결되어 있는지 확인하여 대화형인지도 결정합니다.

비대화 -s형 스위치를 사용하면 bash 스크립트가 파일에서 명령을 읽을 때 위치 인수를 처리할 수 있습니다. 예를 들어:

$ cat demo.sh
echo '$0 = ' $0
echo '$1 = ' $1
echo '$2 = ' $2

$ bash < demo.sh foo bar
bash: foo: No such file or directory

$ bash -s < demo.sh foo bar
$0 =  bash
$1 =  foo
$2 =  bar

답변2

-s옵션을 사용하면 bash가 표준 입력에서 명령을 읽습니다. 이 옵션이 없으면 bash는 첫 번째 인수를 실행할 스크립트의 이름으로 처리합니다. 이 옵션을 사용하면 bash는 모든 인수를 표준 입력에서 읽는 스크립트에 대한 인수로 처리합니다. 이 -s옵션은 쉘 인스턴스가 대화형인지 여부가 아니라 bash가 명령줄 인수를 해석하는 방법만 결정합니다.

이 옵션을 사용하여 bash 인스턴스를 -i시작하면 항상 대화형입니다. 그렇지 않은 경우 -i스크립트 이름이 전달되지 않고( 이에 영향을 줌) 표준 입력과 표준 오류가 모두 터미널에 연결된 경우 -s에만 대화형이 됩니다 .

테스트에서는 PS1셸 인스턴스가 대화형인지 여부를 알려주지 않습니다. PS1대화형 셸에서 설정을 해제 할 수 있습니다 . 대조적으로, 비대화형 쉘은 일반적으로 PS1환경을 상속합니다. 쉘이 대화형으로 실행 중인지 테스트하는 안정적인 방법은 $-포함되어 있는지 테스트하는 것입니다 i.

read내장 함수는 대화식이든 아니든 모든 쉘에서 실행될 수 있습니다. (리디렉션되지 않는 한) 쉘의 표준 입력에 연결된 모든 것에서 읽습니다. bash가 실행 중인 스크립트에서 읽고 있는 동일한 파일 설명자에서 읽으려고 하면 결국 스크립트에서 한 줄을 건너뛰게 됩니다(반드시 원하는 위치는 아님). 예를 들어 bash에 있는 경우 스크립트를 전달하세요. 표준 입력에 대해 터미널에서 한 줄을 읽으려면 호출을 리디렉션해야 합니다 read.read line </dev/tty

파일 설명자 0, 1, 2는 항상 존재합니다(닫혀 있지 않은 경우). 이들은 각각 표준 입력, 표준 출력 및 표준 오류입니다. 쉘이 대화형인지 여부는 fd 0과 2가 터미널인지 여부가 쉘의 대화형 상태에 영향을 미친다는 점을 제외하면 표준 설명자가 가리키는 것과 아무 관련이 없습니다.

1 예, 이에 대해 설명하는 웹페이지가 있다는 것을 알고 있습니다. 그들은 틀렸다.

답변3

대화형 셸에 대한 추가 정보:

쉘이 대화형인지 확인할 수 있습니다 $-. $-포함된 경우 i쉘은 대화형입니다.

쉘이 사용자의 입력을 직접 읽는 경우 대화형입니다. 비대화형 쉘은 파일에서 한 줄씩 명령을 읽고 실행합니다. 스크립트 내부의 stdin에서 무엇이든 읽을 때 "스크립트는 쉘이 아닌 입력을 읽으므로" 쉘을 대화형으로 만들지 않습니다(이것을 더 잘 설명하는 방법을 잘 모르겠습니다).

    labdebian# cat ./test
    #!/bin/bash
    echo Hello World
    echo $-
    read; echo $REPLY
    echo $-

    labdebian# bash test
    Hello World
    hB
    I'm typing this
    I'm typing this
    hB

    labdebian# bash -i test
    Hello World
    himB
    I'm typing this
    I'm typing this
    himB

답변4

-s쉘을 대화형으로 만들지 않습니다. 대신 사용하십시오 -i.

관련 정보