
~/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
(and zsh
etc) 명령 은 읽을 수는 있지만 보편적이지 않으며 내가 아는 가장 정확한 쉘인 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