명령이 특정 옵션을 허용하는지 테스트

명령이 특정 옵션을 허용하는지 테스트

명령에 옵션이 있는지 테스트하는 데 선호되는 방법은 무엇입니까? 주의사항이 있나요?

동기를 부여하는 예로 내 쉘 별칭 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"

관련 정보