私は、異なるHPCノード、仮想マシン、またはプライベートワークステーションで異なるバージョンのBashを実行できる比較的異質な環境で働いています。ログインスクリプトをGitリポジトリに入れたので、.bashrc
「このホストなら...」と同じタイプの混乱なしに、全体的に同じスクリプトを使用したかったのです。
私良いBash 4.1 以下の基本動作は、キーを押したときの動作cd $SOMEPATH
に拡張されました。 Bash 4.2以降では、この動作を再度有効にする必要があります。cd /the/actual/path
Tabshopt -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
性能面では勝てないと思います。