サポートされていない "shopt"オプションが.bashrcでエラーを引き起こすのを防ぐにはどうすればよいですか?

サポートされていない

私は、異なるHPCノード、仮想マシン、またはプライベートワークステーションで異なるバージョンのBashを実行できる比較的異質な環境で働いています。ログインスクリプトをGitリポジトリに入れたので、.bashrc「このホストなら...」と同じタイプの混乱なしに、全体的に同じスクリプトを使用したかったのです。

良いBash 4.1 以下の基本動作は、キーを押したときの動作cd $SOMEPATHに拡張されました。 Bash 4.2以降では、この動作を再度有効にする必要があります。cd /the/actual/pathTabshopt -s direxpandそれない2029年2月4日まで。ただし、これは単なる例であり、関連性がある可能性がある別のshoptオプションcomplete_fullquoteです。正確にその効果)はv4.2のデフォルト動作を変更することもできます。

ただし、direxpand以前のバージョンのBashは認識されず、私がshopt -s direxpandこれを試みると、.bashrc以前のバージョンのBashを使用してノードにログインするたびにコンソールにエラーメッセージが表示されます。

-bash: shopt: direxpand: invalid shell option name

私がしたいのは、shop -s direxpand以前のバージョンのBashに影響を与えずに、強力な方法でBash> 4.1でオプションを有効にする条件をラップすることです(つまり、エラー出力を)にリダイレクトするわけではありません/dev/null

ベストアンサー1

エラーにリダイレクトするのは理解できません/dev/null。コードを強力にするには、set -e次の一般的なイディオムを使用してください… || true

shopt -s direxpand 2>/dev/null || true

オプションがない場合にいくつかの代替コードを実行するには、次の戻り状態を使用してくださいshopt

if shopt -s direxpand 2>/dev/null; then
  … # the direxpand option exists
else
  … # the direxpand option does not exist
fi

ただし、リダイレクトエラーが本当に気に入らない場合は、完了メカニズムを使用してセルフチェックを実行できます。これはbash 2.03以下で、プログラム可能な完了機能を持たない古いシステムがないと仮定します。

shopt_exists () {
  compgen -A shopt -X \!"$1" "$1" >/dev/null
}
if shopt_exists direxpand; then
  shopt -s direxpand
fi

この方法は、一部の環境(Cygwinなど)で遅い分岐を防ぎます。シンプルなので2>/dev/null性能面では勝てないと思います。

おすすめ記事