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


11

터미널 세션을 열 때이 정보를 얻습니다.

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
아마도 / bin / sh 해당 시스템에서 bash입니까?
Jeff Schaller

1
그들 중 누구도 서로를 출처로 삼지 못했습니다. 그러나 ~ / .profile은 공유 bash 파일을 소싱하므로 sh.profile 파일의 출처는 무엇입니까?
Alexander Mills

1
공유 파일을 소스 화하는 ~ / .profile 파일에 대한 정보는 나에게 중요한 것 같습니다.
Jeff Schaller

3
bash 인 / bin / sh의 의미는 bash에 심볼릭 링크되거나 하드 링크되어있을 수 있다는 것입니다. Bash는 sh를 에뮬레이트하지만 ~ / .profile도 제공합니다. OSX 패키지가 어떻게 엉망이되는지 모르겠습니다.
Jeff Schaller

3
그것들은 같은 bash소스, STRICT_POSIX다른 하나는 그것없이, 다른 하나는 소스 없이 만들어졌습니다.
mosvy

답변:


20

bashPOSIX 쉘로 가장 할 때 이러한 오류 는 파일 ~/.bashrc등 을 해석하여로드 할 때가 아니라 환경에서 해당 함수를 가져 오려고 할 때 발생합니다 . 단순화 된 예 :

foo.bar(){ true; }; export -f foo.bar; bash --posix -c true
bash: error importing function definition for `foo.bar'

bashposix 모드에있을 때 환경에서 함수를로드하지 않을 것으로 기대 했지만 실제로는 이름에 재미있는 문자가 포함되어있을 때만 불평합니다.

공지 사항 bash경우에도 POSIX 모드로 실행됩니다 POSIXLY_CORRECT또는 POSIX_PEDANTIC환경 변수가 설정하거나,이 컴파일 할 때 --enable-strict-posix-default/ STRICT_POSIX.

이 후자의 경우 것으로 보인다 /bin/sh(보기 맥 OS에 여기PRODUCT_NAME = sh같은 라이브러리 함수를 사용할 때 나는 또한 트리거이 오류를 기대), popen(3)또는 system(3).


3
수정 : 환경에서 기능을 내 보내지 마십시오. Shellshock을 유발 한 것은 배쉬의 반 기능입니다. Shellshock은 제거 되었어야했지만, 사람들이 어리석게 그것을 사용했기 때문이 아닙니다. 그들 중 하나가되지 마십시오.
R .. GitHub 중지 지원 얼음

bash가 호출 될 때에도 함수를 임포트한다는 사실 sh은 shellshock / bashdoor 취약점을 훨씬 더 악화 시켰습니다.
Stéphane Chazelas

참조 SHELLOPTS=posix-o posix는 POSIX 모드를 사용하기위한 다른 방법을.
Stéphane Chazelas

또한 점에 유의 set -a/ set -o allexport모든 기능을 내보낼 bash는 원인 (그리고로 호출하는 경우 sh, 원인 POSIXLY_CORRECT설정하고 내보낼 수!)
스테판 Chazelas가에게

( sh -a원인은 POSIXLY_CORRECT설정하고 수출하는 단계; set -ash없이 -a내 보내지 않습니다 시작했다 POSIXLY_CORRECT가 이전에 설정되어 있기 때문에 -a효과가 있었다).
Stéphane Chazelas

5

이유에 대한 부분에 대답 read.json하고 ts-project있지 휴대용 함수 이름입니다을 :

POSIX에 따르면, 함수 정의가 있어야합니다 라는 이름 으로

휴대용 문자 집합의 밑줄, 숫자 및 알파벳으로 만 구성된 단어 이름의 첫 문자는 숫자가 아닙니다.

C lingo에서 식별자 라고도 합니다. 또는 정규식에서 :[_a-zA-Z][0-9_a-zA-Z]*


그러나 POSIX는 구현에서 함수에 다른 이름을 허용하는 것을 금지하지 않으므로 bash는 POSIX 모드에있을 때 이러한 제한을 적용 하지 않아도 됩니다. 함수 이름은 명령 인수와 동일한 네임 스페이스를 공유하므로 / / ... 와 같은 것을 받아 들일 이유가 없습니다.zshrcfish
Stéphane Chazelas

@ StéphaneChazelas : 알고 있습니다. 그러나 "자동 확장하지 않음"과 같이 "모든 확장명을 흘리지"않은 경우 POSIX 모드에 있다는 것은 무엇을 의미합니까?
user2394284

@ user2394284 확실히 bashPOSIX 모드에서 POSIX 모드에있는 동안 환경에서 함수를 가져 오지 않는다는 의미 는 아닙니다. ;-)
mosvy

@mosvy : 그래, bash가 어딘가에서 실패했다는 것은 명백하다. 나는 일반 POSIX 쉘이라고 말할 것이다. 이것은 버그 일 것이다.
user2394284

0

그래서 내 ~ / .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 % 작동하는지 확실하지 않습니다.

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