web-dev-qa-db-ja.com

.bash_profileからディレクトリ内のすべてのファイルを入手する

複数のアプリケーションがシステム変数(この場合は$ PYTHONPATH)に追加できるようにする必要があります。各アプリがモジュールを追加できるディレクトリを指定することを考えています(例:.bash_profile_modulename)。 〜/ .bash_profileで次のようなものを試しました:

find /home/mike/ -name ".bash_profile_*" | while read FILE; do
source "$FILE"
done;

しかし、機能していないようです。

42
Mike Bannister

しない

 for f in ~/.bash_profile_*; do source $f; done

十分ですか?

編集ls ~/.bash_*の追加レイヤーは、bashグロビングを指示するために簡略化されました。

69

上記のデニスに同意します。あなたのソリューションはうまくいくはずです(「完了」の後のセミコロンは必要ないはずです)。ただし、forループを使用することもできます

for f in /path/to/dir*; do
   . $f
done

Dirkの回答のように、lsのコマンド置換は必要ありません。これは、たとえば/etc/bash_completionで他のbash補完スクリプトを/etc/bash_completion.dで調達するために使用されるメカニズムです。

17
Cascabel

Oneliner(bash/zshのみ):

source <(cat *)
16
gaRex

aus man bash:

ソースファイル名[引数]

ein source config/*

最初の引数が取得され、config /内の他のすべてのファイルは、それが取得するスクリプトへの引数になります。

3
Faronitates
for file in "$(find . -maxdepth 1 -name '*.sh' -print -quit)"; do source $file; done

この解決策は、私がこれまでに見つけた最も投稿可能なものです。

  • 一致するファイルがない場合でもエラーにはなりません
  • bash、zshを含む複数のシェルで動作します
  • クロスプラットフォーム(Linux、MacOSなど)
2
sorin
str="$(find . -type f -name '*.sh' -print)"
arr=( $str )
for f in "${arr[@]}"; do
   [[ -f $f ]] && . $f --source-only || echo "$f not found"
done 

私はテストし、それを使用しています。を変更するだけです。スクリプトが入っているフォルダを指定すると、それが機能します。

0

この関数を使用して、ディレクトリ内のすべてのファイル(存在する場合)を調達できます。

source_files_in() {
    local dir="$1"

    if [[ -d "$dir" && -r "$dir" && -x "$dir" ]]; then
        for file in "$dir"/*; do
           [[ -f "$file" && -r "$file" ]] && . "$file"
        done
    fi
}

追加のファイルチェックは、ディレクトリが空であるためにパターンが一致しないコーナーケースを処理します(ループ変数がパターン文字列自体に展開されます)。

0
Eugene Yarmash