~/.bashrc가 루프를 사용하여 ~/Shell 디렉토리에 있는 모든 스크립트를 실행하도록 하려면 어떻게 해야 합니까?

~/.bashrc가 루프를 사용하여 ~/Shell 디렉토리에 있는 모든 스크립트를 실행하도록 하려면 어떻게 해야 합니까?

~/ShellBash가 일반 사용자 계정으로 시작될 때마다 실행하려는 쉘 스크립트가 내 디렉토리에 있습니다 . 그래서 내가 한 일은 다음과 같습니다 ~/.bashrc.

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

그러나 어떤 이유로든 .sh~/Shell디렉토리에 있는 파일 확장자를 가진 파일에 포함된 함수는 자동으로 로드되지 않습니다. 예를 들어, abash~/Shell/bash.sh파일 에 호출된 함수가 있는데 abash새 사용자 터미널에서 실행하면 명령을 찾을 수 없다는 오류가 발생했습니다.

나는 내 디렉터리에 있는 모든 파일을 ~/ShellBash 시작 시 실행되도록 하기 위해 파일 앞에 점을 붙여 수동으로 나열할 수 있다는 것을 알고 있습니다. 예를 들어, 내 ~/.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(and zshetc) 명령 은 읽을 수는 있지만 보편적이지 않으며 내가 아는 가장 정확한 쉘인 source에는 존재하지 않습니다 . dash현재로서는 이 동일한 코드를 사용하여 거의 모든 Bourne-Shell 파생 프로그램에 코드를 로드할 수 있습니다.

셸에 직접 소스가 되는 파일에 대한 전통적인 명명 규칙은 rc또는 접미사를 사용하는 것입니다 .rc( 에서와 같이 .bashrc). rc"실행 명령"을 의미합니다. 확장은 .sh일반적으로 실행 가능한 스크립트 프로그램에 사용됩니다. (이것들은오직규칙이 아닌 관례입니다.)

답변2

몇 가지 문제:

  • 작동하려면 물결표를 인용 해제해야 합니다. 대신 $HOME을 사용하세요.
  • 작동하려면 *도 인용 해제해야 합니다. 찾기에는 필요하지 않습니다.
  • /찾기에는 파일 이름("~/Shell/")이 있어서는 안 됩니다 .
  • 파일을 로드하고 실행하지 않아야 하므로 sh를 소스로 변경해야 합니다.

이 시도:

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

관련 정보