bash에 대한 -s 옵션은 실제로 아무 작업도 수행하지 않는 것 같습니다.
또는 명령을 실행할 때 아무것도 변하지 않습니다. 정말 혼란스러운 것은 쉘 스크립트를 실행할 때 항상 대화 형 쉘을 얻는 것 같습니다. 스크립트에 내장 된 읽기 기능을 사용할 때 항상 메시지가 표시되기 때문에 대화 형이라고 가정합니다. 입력. 이렇게하면 대화식으로 만들 수 있습니까?
쉘 스크립트는 fedora에서 대화식으로 실행되며 -s가 만들 수있는 차이점의 예가 있습니까? 매뉴얼 페이지를 읽었지만 할 수 없습니다. 어떤 영향을 미칠 수있는 내 스스로 예제를 생성하는 것 같습니다. s를 사용하여 스크립트가 입력을받는 방식을 변경하려고했기 때문에 두 질문을 결합했으며 일부 자습서에서는 효과가 있다고 말합니다. 나는 그것이 인수를 설정할 수 있다는 것을 알고 있지만, 표준 입력에서 읽도록 변경하는 방법은 항상 그렇게하는 것처럼 보입니다.
다음은 테스트에 사용한 것입니다.
if [ -v $PS1 ] then echo non-interactive else echo interactive fi read ; echo $REPLY
읽기는 항상 비 및 대화 형 셸 모두에서 작동 할 수있었습니다.
내가 fd / 0 및 fd / 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
답변
-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가 터미널인지 여부는 셸의 대화 형 상태에 영향을 미칩니다.
¹ 예, 나는 “m 이를 주장하는 웹 페이지가 있음을 인식하십시오. 틀 렸습니다.
답변
대화 형 셸에 대한 추가 정보 :
$-
를 확인하여 셸이 대화 형인지 여부를 확인할 수 있습니다. $-
에 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
코멘트
- 혼란스러운 점은 bash에 대한 문서에서 비-에서 읽기를 사용하면 중단 될 것이라고 말합니다. 대화 형 쉘
Answer
-s
는 쉘 대화 형. 대신 -i
를 사용하세요.