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
빈 문자열로 확장됩니다.