~/Shell
Bash가 일반 사용자 계정으로 시작될 때마다 실행하려는 디렉토리에 쉘 스크립트가 있습니다 . 그래서 내가 한 일은 다음을 추가하는 것이었습니다 ~/.bashrc
.
for i in `find ~/Shell/ -name "*.sh"`
do
sh $i
done
.sh
그러나 어떤 이유로든 내 디렉터리에 있는 파일 확장자를 가진 파일에 포함된 함수는 ~/Shell
자동으로 로드되지 않습니다. 예를 들어, 파일의 함수를 호출했는데 새 사용자 터미널에서 함수를 실행했을 abash
때 명령을 찾을 수 없다는 오류가 발생했습니다.~/Shell/bash.sh
abash
나는 디렉터리의 모든 파일을 수동으로 나열 ~/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