~/.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

관련 정보