![更新/回答](https://rvso.com/image/178465/%E6%9B%B4%E6%96%B0%2F%E5%9B%9E%E7%AD%94.png)
さて、ちょっと困惑しています。
私は現在、勤務先用の自動化スクリプトを作成する目的で、BASH を徹底的に研究中です。また、ここで完全な開示をします。私は Web 担当者であり、これまでは git を操作するのに十分な CLI しか知りませんでした。
私の問題は、スタッフの約半数がMacOSを使用しており、残りの半数がGitBashを使用しています。、そして、異なるフラグがサポートされているようです(または、より関連性の高い、ない2 つの異なる BASH インスタンスで、(サポートされる) 2 つのバージョンがリリースされました。さらに問題なのは、全員が在宅勤務で世界が終焉を迎えようとしている状況で、スタッフ全員に「ディストリビューション 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
修飾子フラグがあります。では、コマンドの特定の機能がサポートされているかどうかを確認するにはどうすればよいでしょうか?フラグをテストの 1 つに渡そうとするたびに、テストを実行するプログラムは、それが IT に向けられていると認識し、完全に無視するか、エラーを出力します。
foo -b
/foo --bar
が有効/インストール済み/アクセス可能なコマンドであるかどうかをテストするにはどうすればよいですか?
更新/回答
以下で受け取った、よく考えられた、正直に言って素晴らしい回答で示された一般的なコンセンサスは、「いいえ、できません」という混合であり、「決定的で有用なデータに似たものを確実に収集するには、要因が多すぎる」という強調が加えられているように思われるため、私は質問を締めくくります。
ここでの私の意図は、2つの異なるプラットフォーム間で存在しない可能性のあるフラグの存在を確認するために採用する正しいアプローチが何であるかを確かめることです。知られている幸いなことに、私の場合は、プラットフォームが 1 つしかありません。この場合の適切な戦術は、私が現在取っている戦術のようです。各プラットフォームごとに2つのスクリプトを別々に管理する。
ご回答くださった皆様、ありがとうございました。本当に感謝しています。
答え1
便利で信頼できる方法では、おそらく不可能です。基本的に、各コマンドを個別にテストして、それが何を行うかを確認する必要があります。(コマンド「echo」は、特に悪い例です。バリエーションはたくさんあります。)
できることは、バージョン番号とオペレーティング システムを確認することです。
BASHの場合は、
bash --version | head -1
または
bash_version="$( bash --version | head -1|sed -e 's/.* version //;s/ .*//' )"
または定義済みのシンボルを使用する$BASH_VERSION
オペレーティング システムの場合、uname -s
これは良いスタートであり、他のオプションを選択すると、より詳しい情報が得られる可能性があります。
これらが揃ったら、必要に応じて条件付きコードの記述を開始できます。
以上のことを踏まえて、オプションfoo
を取るか取らないかの特定のコマンドの場合--bar
、2 つのバージョンが、それ以外は安全に実行できる一致するコマンド ラインに対して何を行うかを調べます。たとえば、両方のバージョンがfoo
最初の無効なオプションを報告する場合は、次のように記述してみてください。
output="$( foo --bar --somethingtotallyinvalid 2>&1 )"
そして、変数出力に何が含まれているかを調べます。もちろん、この場合、有効なオプション リストである可能性があります。その場合は、次のことを検討してください。
output="$( foo --somethingtotallyinvalid 2>&1 | grep -e --bar )"