나는 현재 Bash 세션에서 Bash 스크립트 파일 모음을 실행하기 위해 다음 방법을 사용합니다.
source ~/myScripts/{assignments.sh,nginx_conf.sh,php_conf.sh,drush_install.sh}
유지관리가 너무 불편할 것 같아요. 일부 수직 컬렉션이 더 좋습니다. 의사코드:
assignments.sh
nginx_conf.sh
php_conf.sh
drush_install.sh
이것을 수직으로 어떻게 하시겠습니까?
그런데, 여기에 있는 소스 문서가 다음과 같은 것인지 잘 모르겠습니다.이것가장 좋은 방법입니다.
고쳐 쓰다
source
Bash 4.3.48(1)부터 Bash 인터프리터는 source
하나의 파일만 처리할 수 있는 방식으로 평가하고 그 이상의 다른 모든 작업은 인수로 평가되기 때문에 한 줄 작업이 실패할 운명이라는 것을 이제 이해합니다. 첫 번째 파일(중괄호 세트는 {}
도움이 되지 않습니다).
bash
내 감상은 그 반대 와 같다는 것이다 source
.
답변1
Heredoc은 다른 어떤 것도 없이 각 파일 이름을 자체 줄에 배치하고(파일 이름에 개행 문자와 같은 미친 내용이 포함되어 있지 않다고 가정) 파일 이름의 특정 순서를 허용합니다.
while read f; do
source ~/myScripts/"$f"
done <<SRC_LIST
assignments.sh
nginx_conf.sh
php_conf.sh
drush_install.sh
so_forth.sh
SRC_LIST
source file [arguments]
이는 또한 후속 파일 이름이 인수로 처리되는 문제를 방지합니다 assignments.sh
(실제로 후속 파일 이름을 인수로 의미하지 않는 한??). 이 목록은 파일 시스템에 있는 항목과 수동으로 동기화되어야 합니다.
또 다른 옵션은 파일을 나열하는 지루함을 건너뛰고 이를 glob에 넣는 것입니다. 이는 디렉터리에서 일치하는 모든 파일이 소스가 될 수 있고 소스가 되어야 한다고 가정합니다(그래서 *.sh
소스를 가져서는 안 되는 다른 임의의 파일이 혼합되지 않습니다). 그러나 glob과 일치하는 파일이 없으면 이 상황이 복잡해지며, 이 경우 소스를 가져오기 위해 bash
기본적으로 리터럴 파일 이름이 전달되므로 ~/myScripts/*.sh
이 문제를 해결해야 합니다(필요한 경우 일시적으로). 소스가 없으면 일치하지 않는 소스는 얻을 수 없습니다.
REVERT=$(shopt -p nullglob)
shopt -s nullglob
for f in ~/myScripts/*.sh; do
source "$f"
done
$REVERT
이 방법을 사용하면 파일의 순서를 가져와야 하는 경우 glob이 올바른 순서로 파일 이름과 일치하는 방식으로 파일 이름을 지정해야 합니다. (ZSH에서는 빈 glob shopt
만 실행되기 때문에 호출이 필요하지 않습니다 for f in ~/myScripts/*.sh(N); do
. 다른 쉘은 glob을 처리하는 방법과 일치하는 항목이 없을 때 수행하는 작업이 다릅니다.)