![Atualizar/Responder](https://rvso.com/image/178465/Atualizar%2FResponder.png)
Ok, então estou meio perplexo aqui.
Estou me aprofundando no BASH, com o propósito de escrever alguns scripts de automação para meu empregador. Além disso, divulgação completa aqui: sou um cara da web; até agora eu conheci CLI APENAS o suficiente para operar o git.
Meu problema é,cerca de metade da equipe usa MacOS, a outra metade usa GitBash, e parece que existem diferentes sinalizadores suportados (ou, mais relevante,nãosuportado) nas duas instanciações BASH diferentes. Mais um enigma: com todo mundo trabalhando em casa e o mundo acabando e tudo mais, não posso exigir com segurança que cada um de nossos funcionários "mude para a distribuição X"/"atualize para a versão Y".
Agora, eu sei como testar se um determinado programa está instalado (embora eu confesse: não estou claro por que um é preferível ao outro, e por favor: corrija-me se algum deles for uma maneira terrível de lidar com isso), nas formas de:
type foo >/dev/null 2>&1 || { echo >&2 "COMMAND NOT FOUND"; }
...e...
[ -x "$(command -v foo)" ] || echo 'COMMAND NOT FOUND'
... mas no meu caso específico, AMBAS as plataformas ESTÃO foo
instaladas, mas, por exemplo, apenas o MacOS possui um sinalizador -b
/ --bar
modificador.Então, como faço para testar se um determinado recurso de um comando é compatível?Cada vez que tento passar um sinalizador para um dos testes, o programa que REALIZA o teste parece acreditar que é direcionado à TI, ignora-o completamente ou comete erros.
Como posso testar para ver se foo -b
/ foo --bar
é um comando válido/instalado/acessível?
Atualizar/Responder
Uma vez que o consenso geral apresentado nas respostas bem fundamentadas e honestamente excelentes recebidas abaixo parece ser um híbrido de "não, não se pode", pontuado com "há simplesmente demasiados factores para ser capaz de recolher de forma fiável qualquer coisa que se assemelhe a dados úteis e conclusivos" , estou encerrando a pergunta.
Minha intenção aqui era verificar qual era a abordagem correta a ser empregada para verificar a presença de um sinalizador potencialmente inexistente entre duas plataformas diferentes -conhecidoplataformas, felizmente, no meu caso - e a tática apropriada neste caso parece ser a que estou tomando atualmente:mantenha dois scripts separados, um para cada plataforma.
Obrigado a todos que dedicaram um tempo para responder! É muito apreciado.
Responder1
De uma forma útil e confiável, você provavelmente não conseguirá. Basicamente, você precisa testar cada comando individualmente para ver o que ele faz. (O comando "eco" é um caso particularmente grave disso. Existem muitas variações.)
O que você pode fazer é verificar os números de versão e o sistema operacional.
Para BASH, tente
bash --version | head -1
ou
bash_version="$( bash --version | head -1|sed -e 's/.* version //;s/ .*//' )"
ou apenas use o símbolo predefinido$BASH_VERSION
Para o sistema operacional, uname -s
é um bom começo e outras opções podem fornecer mais detalhes.
Depois de fazer isso, você pode começar a escrever código condicional conforme necessário.
Dito tudo isso... para o seu caso específico de um foo
comando que pode ou não ter uma --bar
opção: descubra o que as duas versões fazem com linhas de comando correspondentes que, de outra forma, são seguras para execução. Por exemplo, se ambas as versões foo
reportarem a primeira opção inválida, tente escrever algo como:
output="$( foo --bar --somethingtotallyinvalid 2>&1 )"
e então descobrir o que está na saída variável. É claro que, neste caso, é provável que seja a lista de opções válida. Se sim, você pode considerar:
output="$( foo --somethingtotallyinvalid 2>&1 | grep -e --bar )"