bash가 아닌 sh가 .bashrc에 정의된 함수에 대해 불평하는 이유는 무엇입니까?

bash가 아닌 sh가 .bashrc에 정의된 함수에 대해 불평하는 이유는 무엇입니까?

터미널 세션을 열면 다음과 같은 결과가 나타납니다.

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'

원래는 bashposix 모드의 환경에서 함수를 로드하지 않으려고 했지만물론, 이름에 흥미로운 문자가 포함된 경우에만 불평합니다.

환경 변수를 설정하거나 / 로 컴파일할 때 bashposix 모드에서도 실행된다는 점에 유의하세요.POSIXLY_CORRECTPOSIX_PEDANTIC--enable-strict-posix-defaultSTRICT_POSIX

/bin/sh후자는 MacOS의 경우인 것 같습니다.여기PRODUCT_NAME = sh)의 경우, 또는 같은 라이브러리 함수를 사용할 때도 이 오류가 발생할 것으로 예상됩니다 .popen(3)system(3)

답변2

이식 가능한 함수 이름이 아닌 read.json이유 에 대한 부분에 대답하려면 다음을 수행하십시오 .ts-project

POSIX에 따르면,기능 정의이어야 한다명명 된통과

밑줄, 숫자, 이식 가능한 문자 집합의 문자로만 구성된 단어입니다. 이름의 첫 번째 문자는 숫자가 아닙니다.

또한 ~으로 알려진식별자, C 언어로. 또는 정규 표현식에서는 다음과 같습니다.[_a-zA-Z][0-9_a-zA-Z]*

답변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% 유효한지는 확실하지 않습니다.

관련 정보