터미널 세션을 열면 다음과 같은 결과가 나타납니다.
sh: 'read.json'에 대한 함수 정의를 가져오는 중 오류가 발생했습니다.
sh: 'ts-project'에 대한 함수 정의를 가져오는 중 오류가 발생했습니다.
sh는 다음과 같은 기능을 좋아하지 않습니다:
read.json(){
::
}
그리고
ts-project(){
::
}
실제 질문은 - 왜 sh
이러한 파일을 만지거나 해석하는가입니다. 저는 MacOS를 사용하고 있으며 이전에 이것을 본 적이 있는데 꽤 미스터리합니다. 나는 bash만이 이 파일들을 로드할 것이라고 생각합니다.
고쳐 쓰다: bash와 sh는 특별한 것이 아닙니다. 터미널에 bash를 입력하면 다음과 같은 결과가 나타납니다.
alex$ bash
beginning to load .bashrc
finished loading .bashrc
bash-3.2$
sh
터미널에 입력 하면 다음과 같은 결과가 나타납니다.
alex$ sh
sh: error importing function definition for `read.json'
sh: error importing function definition for `ts-project'
sh-3.2$
답변1
bash
비슷한 파일을 해석하여 함수를 로드하는 대신, 이러한 함수를 가장한 POSIX 셸이 환경에서 가져오려고 시도할 때 오류가 발생합니다 ~/.bashrc
. 단순화된 예:
foo.bar(){ true; }; export -f foo.bar; bash --posix -c true
bash: error importing function definition for `foo.bar'
원래는 bash
posix 모드의 환경에서 함수를 로드하지 않으려고 했지만물론, 이름에 흥미로운 문자가 포함된 경우에만 불평합니다.
환경 변수를 설정하거나 / 로 컴파일할 때 bash
posix 모드에서도 실행된다는 점에 유의하세요.POSIXLY_CORRECT
POSIX_PEDANTIC
--enable-strict-posix-default
STRICT_POSIX
/bin/sh
후자는 MacOS의 경우인 것 같습니다.여기PRODUCT_NAME = sh
)의 경우, 또는 같은 라이브러리 함수를 사용할 때도 이 오류가 발생할 것으로 예상됩니다 .popen(3)
system(3)
답변2
답변3
그 이유는 ~/.bashrc 파일에 다음과 같은 bash 스크립트가 있기 때문입니다.
for f in "$HOME/.oresoftware/bash/"*; do
. "$f"
done;
그래서 방금 다음과 같이 변경했습니다.
for f in "$HOME/.oresoftware/bash/"*; do
if [[ "$(basename "$0")" != 'sh' ]]; then
# source only if not using sh
. "$f"
fi
done;
따라서 이론적으로 sh
그때까지 호출되면 파일을 가져오려고 시도하지 않지만 이것이 100% 유효한지는 확실하지 않습니다.