업데이트/답장

업데이트/답장

좋아요, 그래서 좀 당황스럽네요.

저는 고용주를 위한 자동화 스크립트를 작성하기 위해 BASH를 연구하고 있습니다. 또한 여기에 전체 공개가 있습니다. 저는 지금까지 git을 작동할 수 있는 CLI에 대해 충분히 배웠습니다.

내 질문은,직원의 약 절반은 MacOS를 사용하고 나머지 절반은 GitBash를 사용합니다., 다른 플래그를 지원하는 것 같습니다(또는 더 적절하게는아니요지원) 두 개의 서로 다른 BASH 인스턴스에서. 더 큰 수수께끼: 모든 사람이 재택근무를 하고 세상이 종말을 맞이하는 상황에서 모든 직원에게 "릴리스 X로 전환"/"버전 Y로 업그레이드"를 요청할 수는 없습니다.

이제 나는 주어진 프로그램이 설치되었는지 테스트하는 방법을 알고 있습니다(그러나 나는 인정합니다: 한 프로그램이 다른 프로그램보다 나은 이유를 잘 모르겠습니다. 그 중 하나가 이 문제를 처리하는 나쁜 방법이라면 수정해 주십시오). 형태는 다음과 같습니다.

type foo >/dev/null 2>&1 || { echo >&2 "COMMAND NOT FOUND"; }

...그리고...

[ -x "$(command -v foo)" ] || echo 'COMMAND NOT FOUND'

...하지만 제 특별한 경우에는 두 플랫폼이 모두 foo설치되어 있지만 예를 들어 MacOS에만 -b/ --bar수정자 플래그가 있습니다.그렇다면 명령의 특정 기능이 지원되는지 여부를 어떻게 테스트합니까?테스트 중 하나에 플래그를 전달하려고 할 때마다 테스트를 실행하는 프로그램이 이를 IT용이라고 생각하거나 완전히 무시하거나 오류가 발생하는 것 같습니다.

foo -b/ foo --bar가 유효한/설치된/접근 가능한 명령 인지 테스트하는 방법은 무엇입니까 ?

업데이트/답장

아래에 받은 합리적이고 정직하게 우수한 답변들 사이에 제시된 일반적인 합의는 "아니요, 할 수 없습니다"와 "결정적으로 유용한 데이터와 유사한 것을 안정적으로 수집하기에는 요소가 너무 많습니다"가 혼합된 것처럼 보이므로 "뭔가"가 중단되었습니다. , 이것으로 질문을 마치겠습니다.

여기서 나의 목적은 존재하지 않을 수도 있는 서로 다른 두 플랫폼 사이에 플래그가 있는지 확인하는 것이 올바른 접근 방식임을 확립하는 것입니다.모두 다 아는다행스럽게도 제 경우에는 플랫폼, 즉 이 경우 적절한 전략이 제가 현재 따르고 있는 전략인 것 같습니다.각 플랫폼마다 하나씩 두 개의 별도 스크립트를 유지 관리합니다..

시간을 내어 답변해주신 모든 분들께 감사드립니다! 매우 감사합니다.

답변1

유용하고 신뢰할 수 있는 방법으로는 아마도 그렇게 할 수 없을 것입니다. 기본적으로 각 명령을 개별적으로 테스트하여 해당 명령이 수행하는 작업을 확인해야 합니다. ("echo" 명령은 특히 나쁜 예입니다. 다양한 변형이 있습니다.)

당신이 할 수 있는 일은 버전 번호와 운영 체제를 확인하는 것입니다.

BASH의 경우 다음을 시도하십시오.

bash --version | head -1

또는

bash_version="$( bash --version | head -1|sed -e 's/.* version //;s/ .*//' )"

아니면 미리 정의된 기호를 사용하세요.$BASH_VERSION

이는 운영 체제에 대한 좋은 시작이며 uname -s, 다른 옵션을 통해 자세한 내용을 얻을 수 있습니다.

이것을 다운받은 후에는 필요에 따라 조건부 코드 작성을 시작할 수 있습니다.

그렇긴 하지만...옵션을 선택할 foo수도 있고 선택하지 않을 수도 있는 특정 명령의 경우 --bar : 두 버전이 일치하는 명령줄을 어떻게 처리하는지 파악하세요. 그렇지 않으면 실행해도 안전합니다. 예를 들어 두 버전 모두 foo첫 번째 유효하지 않은 옵션을 보고하는 경우 다음과 같이 작성해 보세요.

output="$( foo --bar --somethingtotallyinvalid 2>&1 )"

그런 다음 변수 출력에 무엇이 있는지 알아보세요. 물론 이 경우에는 유효한 옵션 목록일 수 있습니다. 그렇다면 다음을 고려해 볼 수 있습니다.

output="$( foo --somethingtotallyinvalid 2>&1 | grep -e --bar )"

관련 정보