“.”를 사용해도 괜찮습니까? Ubuntu 및 OS X의 .bashrc에서 소스 대신 파일을 실행하려면?


11

좋아, 그럼 source현재 쉘에서 스크립트를 실행하고 .별도에 설명 된대로 "."로하고 "소스"로 스크립트를 실행 내에서, 구체적으로는, 예를 들어,하지만 .bashrc파일, 내가 가진 :

[ -f ~/.bash_aliases ] && source ~/.bash_aliases
[ -f ~/.git-completion.bash ] && source ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && source ~/.autojump/etc/profile.d/autojump.sh

이것을 다음으로 바꿀 수 있습니까?

[ -f ~/.bash_aliases ] && . ~/.bash_aliases
[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && . ~/.autojump/etc/profile.d/autojump.sh

OS X에서도 작동합니까? "POSIX"문제입니까?

나는 그것을 시도했지만 위의 내용은 여전히 ​​우분투에서 작동하는 것처럼 보입니다 (따라서 실제로 두 가지 모두 source와 함께 작동 .합니다. 즉, 쉘에서 원하는 기능을 제공합니다). 다른 것을 선택해야합니까, 아니면 뭔가 빠졌습니까?

FWIW, OS X에서는 내 .bashrc에서 내 소스를 제공 .bash_profile합니다.


1
'sh'기반 쉘이면 '.'을 사용합니다. 글로벌 호환성을 위해 그리고 'csh'기반 쉘을 사용하는 경우 소스를 사용합니다.
mdpc

2
링크 된 게시물에서 " source현재 셸에서 스크립트를 .개별적으로 실행합니다 "라는 메시지가 어디에 있습니까 ? 둘 다 현재 쉘에서 실행합니다. 그렇지 않으면 아무 의미가 없습니다
Michael Mrozek

답변:


11

이것은 POSIX의 정의 입니다 .dot.

쉘은 현재 환경에서 파일의 명령을 실행해야합니다.

파일에을 포함하지 않으면 /<slash>, 쉘 $PATH은 파일을 포함하는 디렉토리를 찾기 위해 지정된 검색 경로를 사용해야 합니다. 그러나 일반 명령 검색과 달리 .dot 유틸리티가 검색 한 파일은 실행 가능 하지 않아도 됩니다. 읽을 수있는 파일이 없으면 비 대화식 쉘이 중단됩니다. 대화식 쉘은 표준 오류에 진단 메시지를 작성하지만이 조건은 구문 오류로 간주되지 않습니다.

위의 내용을 고려할 때, 당신은뿐만 아니라 당신의 교체 수 [ -f ./file ] && source ./file. ./file전부. 파일에 최악의 파일이 없으면 로그인 할 때 알림을 받게됩니다. 아마도 원하는 정보 일 것입니다.

물론 테스트를 계속하고 싶다면 다음을 수행하십시오.

test -f ./file && . $_

2
아, 사람들은 알고 $_있습니다. :)
Andreas Wiese

@AndreasWiese-모든 사람이해야합니다. POSIX에서 정의한 7 개의 특수 매개 변수 중 하나 일뿐입니다.
mikeserv 2016 년

+1 나는 test -f /.file && . $_여기에 표시된 접근법 을 사용하여 끝났다
Michael Durrant

6
@mikeserv 아니오 $_는 POSIX에 의해 표준화되지 않았습니다. 8 개 특별한 매개 변수가 있다 $@, $*, $#, $$, $!, $?, $-$0. $_되고 명시 생략한다 . 귀하의 잘못된 의견이 질문을 촉발했습니다 .
Gilles 'SO- 악마 그만해'

19

이어 bash, .source동의어입니다. 로 보면 bash소스 코드, 파일 builtin/source.def, 당신은 볼 수 .source동일한 내부 기능을 사용 source_builtin:

$BUILTIN source
$FUNCTION source_builtin
$SHORT_DOC 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.
$END

$BUILTIN .
$DOCNAME dot
$FUNCTION source_builtin
$SHORT_DOC . filename [arguments]
Execute commands from a file in the current shell.

그러나 sourcePOSIX와 호환되지 않으므로 스크립트가 POSIX로 호출되는 경우 대신를 /bin/sh사용해야 .합니다 source. POSIX는 쉘을 제한하지 않기 때문에 위의 모든 스크립트가 작동합니다.

개인적으로 나는 항상 .대신에 사용 합니다 source. (내가 쓴 많은 스크립트는에서 실행됩니다 cron).


모든 것이 동일하면 "."대신 "source"를 사용하십시오. 한 가지 이유 : "."을 검색 / 그리프하십시오. 큰 스크립트의 표현. 악몽이다.
abonet

이 답변 은 @abonet이 말한 것처럼 사용 .이 일반적으로 사용하는 것보다 "더 나은" 이유를 설명하지만 검색하기가 훨씬 쉽습니다. 마침표는 여러 언어로 구두점이므로 눈을 건너 뛰기 쉽습니다. 그래서 내가 사용하는 것을 선호합니다 . sourcesourcesource
Joe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.