업데이트/답변

업데이트/답변

좋아, 그래서 나는 여기서 좀 당황했다.

저는 고용주를 위한 자동화 스크립트를 작성하기 위해 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수정자 플래그가 있습니다.그렇다면 명령의 특정 FEATURE가 지원되는지 확인하려면 어떻게 테스트해야 합니까?테스트 중 하나에 플래그를 전달하려고 할 때마다 테스트를 수행하는 프로그램은 그것이 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 )"

관련 정보