lib / *가 작동하지 않는 이유는 무엇입니까?


11

다음 폴더 구조를 포함하는 작은 프로그램이 있습니다.

- main.sh
- lib/
  - clean.sh
  - get.sh
  - index.sh
  - test.sh

각 파일에는에서 사용하는 단일 기능이 포함되어 있습니다 main.sh.

main.sh:

source lib/*

get_products
clean_products
make_index
test_index

위의 첫 두 기능은 작동하지만 두 번째 기능은 작동하지 않습니다.

그러나 내가 다음 source lib/*과 같이 바꾸면 :

source lib/get.sh
source lib/clean.sh
source lib/index.sh
source lib/test.sh

모든 것이 예상대로 작동합니다.

source lib/*예상대로 작동하지 않는지 아는 사람이 있습니까?


2
질문에 대답하지 않고 한 줄로 질문 을 처리하려면 루프를 /etc/bashrc사용 for하여 처리 하는 방법을 살펴보십시오 /etc/profile.d/*.sh. 내용을 신뢰하면 내용을 lib/한 줄짜리로 줄일 수 있습니다.for i in lib/*.sh; do . "$i"; done
Rich

답변:


21

Bash의 source내장은 단일 파일 이름 만 사용합니다.

source filename [arguments]

첫 번째 매개 변수를 넘어서는 것은 위치 매개 변수가됩니다 filename.

간단한 삽화 :

$ cat myfile
echo "param1: $1"
$ source myfile foo
param1: foo

전체 출력 help source

source: source filename [arguments]

Execute commands from a file in the current shell.

Read and execute commands from FILENAME in the current shell.  The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.

Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.

(이것은 .POSIX 방식이므로 이식성이 뛰어난 동등한 "도트 소스"내장에도 적용됩니다 .)

모순되는 것처럼 보이는 동작에 대해서는 main.sh 실행 후 시도해 볼 수 있습니다 set -x. 어떤 명령문이 실행되고 언제 단서가 될 수 있는지 확인합니다.


7

Bash 문서source단일 파일 이름 에서 작동 한다고 표시합니다 .

. (기간)

. 파일 이름 [인수]

현재 쉘 컨텍스트 의 파일 이름 인수에서 명령을 읽고 실행하십시오 . 만약 파일 이름 ...

그리고 소스 코드 ...에 대한 소스 ...이 백업 :

result = source_file (filename, (list && list->next));

어디 source_file에서 정의 된 evalfile.c호출 _evalfile:

rval = _evalfile (filename, flags);

그리고 _evalfile단 하나의 파일을 엽니 다 :

fd = open (filename, O_RDONLY);

5

b-layer의 유용한 답변을 보완 하기 위해 확장하려고하는 유형의 파일이 있는지 확실하지 않으면 욕심 많은 glob 확장을 사용하지 않는 것이 좋습니다.

아래에서 파일을 .sh확장 할 수 없는 경우 ( 확장자가없는) 파일에 유해한 명령 (예 : rm -rf *실행 권한이 있다고 가정)이 포함 된 임시 파일 만 있을 수 있습니다

source lib/*

따라서 항상 적절한 바운드 세트로 glob 확장을 수행하십시오. 귀하의 경우 *.sh파일 만 반복 할 수는 있습니다.

for globFile in lib/*.sh; do
    [ -f "$globFile" ] || continue
    source "$globFile"
done

여기가 [ -f "$globFile" ] || continue더 글로브 패턴이 확장 쉘 옵션의 상당 즉, 폴더 현재에 일치하지 않는 경우 반환 밖으로 루프의 돌볼 것 nullglobbash쉘.


함께 프로세스 대체를 사용하면 다음과 같이 cat작동합니다.source <(cat lib/*.sh)
Xophmeister

@Xophmeister, "작업"에 대한보다 제한된 가치. 당신과 디버깅 시도하는 경우 set -xPS4박았 BASH_SOURCELINENO당신의 로그에, 당신은 더 이상 어떤 파일을 볼 주어진 명령에서 오는 줄 수 있습니다.
Charles Duffy

2
@Xophmeister, ... 또한 스크립트는로 실행을 단락시킬 수 있습니다 return. 그 관행에 따라, 그 일을 어떤 스크립트를 방해하는 모든 실행에서 다음과 같은 것들.
Charles Duffy

1
이것은 /etc/bashrc처리 할 때 수행되는 방식과 매우 가깝습니다 /etc/profile.d/*.sh.
Rich

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.