내 bash에 이 스크립트에 대한 대화형 플래그가 포함되어 있지 않은 이유는 무엇입니까?

내 bash에 이 스크립트에 대한 대화형 플래그가 포함되어 있지 않은 이유는 무엇입니까?

작업이 답변cron스크립트가 실행 중인지 또는 대화형으로 실행 중인지 확인하기 위해 이 스크립트를 사용해 보았습니다 .

#!/bin/bash

# "reliable" interactive check
case "$-" in
        *i*)
                interactive=1
                ;;
        *)
                interactive=0
                ;;
esac

echo \$-=$- interactive=$interactive 

# "maybe" interactive check
if [[ -t 0 ]]; then
        interactive=1
else
        interactive=0
fi

echo interactive=$interactive 

놀랍게도 대화형인지 아닌지에 대해 상충되는 답변을 받았습니다. bash 프롬프트에서 실행할 때의 출력은 다음과 같습니다.

$-=hB interactive=0
interactive=1

참고로 Mint 18에는 다음이 있습니다.

$ bash --version
GNU bash, version 4.3.42(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redist

그래서 내 핵심 질문은 "신뢰할 수 있는" 방법이 잘못된 답을 생성하는 이유는 무엇입니까? Bash가 옵션에 예상 플래그를 포함하지 않는 이유는 무엇입니까? 문서이 작업을 수행해야 함을 나타내는 것 같습니다. "어쩌면" 버전이 실제로 더 안정적인가요?

답변1

"신뢰할 수 있는" 접근 방식은 "이 쉘"이 ​​스크립트를 시작한 쉘이 아니라 대화형이 아닌 스크립트를 실행하는 쉘이기 때문에 실패합니다.

표준 입력이 터미널( [[ -t 0 ]])인지 확인하는 것이 약간 더 안정적이지만 스크립트가 실행되는 위치인지 여부는 여전히 확인하지 않습니다 . 터미널에서 실행되지 않는 경우에도 스크립트를 성공적으로 실행할 수 cron있는 방법이 있습니다 .[[ -t 0 ]]

수락된 답변스크립트를 수동으로 호출하는 대신 cron으로 시작하는지 확인하세요.제가 보기에는 더 믿음직스러워요.

답변2

[[ -t 0 ]](의사) 터미널에서 fd0이 열려 있는지 확인하십시오. fd0은 표준 입력이므로 일반적으로 그렇습니다.

관련 정보