11

Bash スニペットをソースすることはできますが、実際には特定の条件が当てはまる場合にのみその内部から関数を提供できますか?

したがって、私が求めているのは、ディレクトリからすべてのファイルを無条件にソースできることですが、ソース ファイルにはソース シェルに機能を提供するかどうかのロジックが含まれているということです。

例:

  • .bashrcソース全体のサブフォルダー.bashrc.d
  • .bashrc.d/xyzを処理しないadduser2group古いシステムで機能する機能を提供しますusermod-a -G
  • .bashrc.d/xyzそのような古いシステムで実行されている場合、ソースシェルにのみその機能を提供する必要があります。

私の現在の方法は、条件付きで Debian プログラムにaliasちなんだ名前を作成することです ( )。したがって、セマンティクスのみを実装しますが、それでも役に立ちます。adduseralias adduser=adduser2groupadduser <user> <group>

この回避策を必要としない解決策はありますか? 結局、この方法は、私が避けたい名前の衝突の可能性を意味します。

4

3 に答える 3

11

標準のシェルロジックを使用して、関数が定義されているかどうかを制御できます。

lib.sh

if true; then
    foo() {
        echo foo
    }
else
    bar() {
        echo bar
    }
fi

test

#!/bin/bash

. ./lib.sh
foo
bar

それを実行するとき、foo定義されるのは次のとおりです。

$ bash test
foo
test: line 5: bar: command not found

アプリケーションif trueに適したロジックに置き換えてください…</p>

于 2013-01-22T17:02:57.910 に答える
6

必要な関数を定義できます。特定の条件が満たされるたびに、関数の設定を解除するだけです。

$ function alpha() { echo $1; }
$ alpha 10
10

あなたの状態を評価し、それが真実であることを考慮してください:

$ if [[ your condition ]]; then unset alpha; fi
$ alpha 10
alpha: command not found
于 2013-01-22T17:04:51.703 に答える
2

代わりに、それreturnも仕事をしているようです。したがって、次のように言えます。

[[ condition ]] || return
于 2013-01-27T23:40:43.307 に答える