명령에 옵션이 있는지 테스트하는 데 선호되는 방법은 무엇입니까? 주의사항이 있나요?
동기를 부여하는 예로 내 쉘 별칭 grep은 로그인할 때 몇 가지 --exclude-dir 옵션을 추가하지만 이 옵션은 내가 액세스하는 모든 시스템에서 사용할 수 없습니다.
답변1
다행히 잠재적인 옵션을 프로그램에 보고하는 비교적 표준화된 방법이 있습니다. 그러나 항상 사용되는 것은 아니므로 이는 완벽한 답변이 아니며 단지 고급 사용자가 확인한 답변입니다.
$prog --help | grep -e "\b$option\b"
(\b는 단어 경계를 나타냅니다. 즉, $option 뒤에 문자가 남지 않으므로 $option-f는 일치하지 않습니다.)
옵션이 있으면 반환하지만, 더 중요하게는 있으면 종료 상태 0을, 없으면 종료 상태 1을 반환합니다. 다음을 사용하여 이를 테스트할 수 있습니다.
$ # we pipe to /dev/null to hide the output, and show that it doesn't matter
$ grep --help | grep -e "\b--exclude-dir\b" > /dev/null
$ echo $?
0
$ grep --help | grep -e "\b--exclude-dirf\b" > /dev/null
$ echo $?
1
이는 많은 프로그램에서 작동하지만모두--help가 있습니다...도움이 되는. 당신도 운이 좋을 수도 있다
man $progr | grep -e "\b$option\b"
처음에 실패하면
답변2
옵션이 사용 가능하고 예상대로 작동하는 경우에만 성공하는 더미 데이터에 대한 테스트를 수행할 수 있습니다.
trap 'if [ -e "$tmp" ]; then rm -rf -- "$tmp"; fi' EXIT
tmp="$(mktemp -d)"
cd -- "$tmp"
mkdir exclude
mkdir include
echo foo > include/test.txt
echo foo > exclude/test.txt
[ "$(grep --exclude-dir exclude --recursive foo . | wc -l)" -eq 1 ]
답변3
대부분의 (모두?) 명령이 알 수 없는 옵션으로 호출될 때 0보다 큰 반환 코드로 종료된다는 점을 고려하면 다음을 시도해 볼 수 있습니다.
cmd --option-to-probe [other options and parameters] >/dev/null 2>/dev/null
그리고 $?
0인지 확인해보세요.
답변4
다음과 같이 명령의 매뉴얼 페이지를 grep하여 이 옵션이 존재하는지 확인할 수 있습니다.
CMD=grep
OPTIONS=""
for OPT in "--exclude-dir" "--text" "--not_an_option"; do
if man $CMD | col -bx | egrep --quiet \\$OPT; then
OPTIONS="$OPTIONS $OPT"
fi
done
alias $CMD="$CMD $OPTIONS"