입력이 매개변수, 파일 또는 터미널에서 오는지 감지하는 방법

입력이 매개변수, 파일 또는 터미널에서 오는지 감지하는 방법

Bash에서 특정 스크립트가 호출되었는지 알 수 있는 방법이 있습니까?

$ myscript.sh myfile

또는:

$ myscript.sh < myfile

myfile일부 스크립트에서는 항상 with 의 콘텐츠에 액세스 $1하지만 이제는 다양한 상황에 따라 동작을 변경하고 싶습니다.

편집: 리디렉션 없이 호출할 때 세 번째 사례도 원합니다.

$ myscript.sh

답변1

편집하다: 터미널이나 파일의 입력을 올바르게 감지하도록 -t변경 되었습니다.-t 0

여기서 핵심은 입력이 터미널에서 오는지 아니면 파일에서 오는지 아는 것입니다. 이에 대한 테스트가 있습니다( man test참조 -t).

bash 스크립트를 실행한다고 가정합니다.

if [ -t 0 ]; then
    echo "Input from terminal"
    if [ $# -eq 0 ]; then
        echo "No input files specified on command line.  Error." >&2
    else
        echo "Input file given on command line.  It is $1"
    fi
else
    echo "Input coming from stdin"
fi

위의 echo 문을 실제 코드로 바꾸면 다양한 시나리오를 처리할 수 있습니다.

업데이트, 빠른 테스트 스크립트:

#!/bin/bash
[ -t 0 ] && echo "t is true" || echo "t is false"

달리기:

$ test.sh testfile
t is true
$ test.sh < testfile
t is false
$

답변2

일반적으로 표현식 $1$2은 스크립트 명령줄에 제공된 첫 번째, 두 번째 등의 인수로 확장됩니다.

따라서 스크립트를 호출할 때:

myscript.sh myfile

그런 다음 $1스크립트에서 myfile(및 등 $2$3모두 빈 문자열임) 로 확장합니다.

스크립트를 호출할 때:

myscript < myfile

STDIN의 리디렉션은 myfile상위 쉘에 의해 수행되므로 스크립트는 실제로 다음을 사용합니다.아니요매개변수를 지정하고 $1빈 문자열로 확장됩니다.

관련 정보