
さて、それでちょっと恥ずかしいです。
私は雇用者のための自動化スクリプトを書くためにBASHを研究しています。また、ここに完全な開示があります。私はこれまでgitを動作させることができるCLIについて十分に学びました。
私の質問は、従業員の約半分はMacOSを使用し、残りの半分はGitBashを使用します。、他のフラグをサポートしているようです(またはより適切にいいえサポート)2つの異なるBASHインスタンスから。大きな謎:誰もが在宅勤務をしていて、世界が終わりを迎える状況で、すべての従業員に「リリースXに切り替える」/「バージョンYにアップグレード」を要求することはできません。
今、私は与えられたプログラムがインストールされているかどうかをテストする方法を知っています(しかし私は認めます:あるプログラムが他のプログラムより良い理由がわかりません。そのうちの1つがこの問題を処理する悪い方法であれば修正してください)。形式は次のとおりです。
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
:両方のバージョンが一致するコマンドラインをどのように処理するかを理解してください。それ以外の場合は実行しても安全です。たとえば、両方のバージョンがfoo
最初の無効なオプションを報告している場合は、次のように書きます。
output="$( foo --bar --somethingtotallyinvalid 2>&1 )"
次に、変数の出力に何があるかを調べます。もちろん、この場合は有効なオプションのリストかもしれません。その場合は、次の点を考慮してください。
output="$( foo --somethingtotallyinvalid 2>&1 | grep -e --bar )"