~/.bashrc にループを使用して ~/Shell ディレクトリ内のすべてのスクリプトを実行させるにはどうすればよいですか?

~/.bashrc にループを使用して ~/Shell ディレクトリ内のすべてのスクリプトを実行させるにはどうすればよいですか?

~/ShellBashが通常のユーザーアカウントで起動されるたびに、実行したいディレクトリにシェルスクリプトがあります。だから私がしたことは以下を追加することでした~/.bashrc

for i in `find ~/Shell/ -name "*.sh"`
do
    sh $i
done

.shただし、何らかの理由で、私のディレクトリにあるファイル拡張子を持つファイルに含まれる関数は~/Shell自動的にロードされません。たとえば、ファイルの関数を呼び出したときに新しいユーザー端末で関数を実行したabashときにコマンドが見つからないというエラーが発生しました。~/Shell/bash.shabash

私はディレクトリ内のすべてのファイルを手動でリストし~/Shell、Bashが起動したときに実行されるようにドットを前に追加できることを知っています。たとえば、私のファイルに次の内容があったことがあります~/.bashrc

. ~/Shell/bash.sh
. ~/Shell/cd.sh
. ~/Shell/emerge.sh
...

うまく動作しますが、新しいシェルスクリプトをfor追加すると。~/Shell~/.bashrc

私も今試してみました:

for i in `find -name "~/Shell/*.sh"`
do
        sh $i
done

そして:

for i in "~/Shell/*.sh"
do
        sh $i
done

そして:

for i in `find -name '~/Shell/*.sh'`
do
        sh $i
done

成功しませんでした。

答え1

これをあなたの.bashrc

for rc in ~/Shell/*.sh
do
    . "$rc"
done

それからレースに出発してください!

いくつかの注意:

bash(およびzshその他)コマンドは読み取ることができますが、普遍的ではなく、私が知っている最も正確なシェルsourceには存在しません。dash現時点では、同じコードを使用してほぼすべてのBourne-Shell派生プログラムにコードをロードできます。

シェルから直接生成されたファイルの伝統的な命名規則は、サフィックスまたはrc.rcたとえば.bashrc)を使用することです。 rc「実行コマンド」を示します。この.sh拡張は通常、実行可能なスクリプトプログラムで使用されます。 (これらはすべてただルールではなくルールです。 )

答え2

いくつかの問題:

  • 機能するには、チルダを逆参照する必要があります。代わりに$ HOMEを使用してください。
  • 機能するには*も逆参照する必要があります。検索する必要はありません。
  • /検索に使用されるファイル名("〜/ Shell /")には何も含めないでください。
  • ファイルを実行せずにロードする必要があるため、shをsourceに変更する必要があります。

この試み:

for i in $(find "$HOME/Shell/" -iname "*.sh")
do 
    source "$i"
done

編集する:

上記のオプションは、スペース、改行、または問題のある文字を含むファイル名を処理できません。この問題を解決するには、次のようにfindのすべての機能を使用できます。

while IFS= read -r -d $'\0' file; do
    source "$file"
done < <(find "$HOME/Shell/" -name "*.sh" -type f -print0)

メモ:

単純なアスタリスクを持つソリューションには*サブディレクトリは含まれません。

findと同じようにサブディレクトリを含むアスタリスクを使用するソリューション全体は複雑すぎるようです。

resetextglob=$(shopt -p extglob)     # store value of extglob
resetnullglob=$(shopt -p nullglob)   # store value of nullglob

shopt +s extglob nullglob
for i in $HOME/Shell/*.sh $HOME/Shell/**/*.sh
do
    source "$i"
done

$resetextglob                        # reset extglob to original value
$resetnullglob                       # reset nullglob to original value

関連情報