가져온 bash 기능에서 sh 오류를 제거하는 방법은 무엇입니까?

가져온 bash 기능에서 sh 오류를 제거하는 방법은 무엇입니까?

그래서 내보낸 bash 함수가 많은 .bash_aliases 파일이 있는데 그 중 많은 함수가 sh와 호환되지 않습니다.

문제는 sh가 내 노트북(OS X)과 SSH를 연결하는 Linux 상자의 모든 곳에서 사용된다는 것입니다. 또한 항상 bash 기능과 스팸 오류를 가져오려고 시도합니다.

문제의 기능은 다음과 같습니다.

  • 이름에 "-"가 포함된 모든 기능(참고: Linux가 아닌 OS X의 스팸 오류임)
  • 그리고 구문이 bash에서만 유효한 log() 함수(아래)

    log() {
        # braces allow for piping of same output to multiple files
        { $@ 2> >(tee .err.log); } &> >(tee .out.log);
        echo; echo logged output to .err.log \& .out.log respectively;
    }
    export -f log
    

그렇다면 이 문제를 어떻게 해결해야 할까요? 함수 이름을 바꾸거나 */bin 디렉토리에 별도의 스크립트에 넣을 필요가 없다면 더 좋을 것 같습니다...

도와주셔서 감사합니다!

PS 스크린샷:

여기에 이미지 설명을 입력하세요.

편집: 정보가 충분하지 않다는 것을 깨달았습니다. 그렇습니다. .bash_profile소스 .bashrc는 소스입니다 .bash_aliases(저는 소스가 없습니다 .profile). 또한 .bash_aliases에 종료 절을 만들어 보았지만 $SHELL='sh'작동하지 않습니다.내 환경에서 직접 가져오기(@Bodo와 마찬가지로수입스크린샷의 오류 표시).

편집 2 중요 참고 사항: 또한 이상하게도 Linux 상자에서 /bin/sh로 ssh를 보내는 것을 발견했습니다.bash에 대한 심볼릭 링크입니다.. 이것은 bash를 의미합니다.구매할 때 오류가 발생하지 않습니다.환경에서 가져올 때 log()가 실제로 오류를 발생시키나요?

답변1

이러한 함수를 내보내면 안 됩니다. 대신, 필요한 .bash_aliases모든 인스턴스에 리소스를 제공하는 것이 좋습니다 . bash(대화형 쉘의 기능만 필요하다고 생각합니다 bash.)

비슷한 질문이 여기에 언급되어 있습니다./bin/sh: 'some-function'에 대한 함수 정의를 가져오는 중 오류가 발생했습니다., 여기서 허용되는 답변은 함수 이름을 바꾸는 것을 제안합니다.

시스템에 연결되어 있어도 /bin/shPOSIX처럼 작동하고 준수하려고 호출할 때 오류가 표시됩니다.bashbashshshhttps://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Invoked-with-name-sh

답변2

간단한 해결책은 그것들을 조달하는 것이 아닙니다. 표준 파일이 아니기 때문에 ~/.bash_aliases구성 파일 중 하나에서 명시적으로 가져와야 합니다. 따라서 간단한 해결책은 해당 소스 라인(대부분 귀하의 소스 라인 ~/.bashrc)을 찾아 다음에서 변경하는 것입니다(또는 시스템에 있는 것이 무엇이든 이것은 Ubuntu에서 가져온 것입니다).

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

이와 관련하여:

if [ -f ~/.bash_aliases ] && [ -n "$BASH_VERSION" ]; then
    . ~/.bash_aliases
fi

이렇게 하면 .bash_aliasesbash를 실행할 때만 파일을 가져옵니다.


명확히 하기 위해 귀하의 질문과 의견에 있는 정보를 바탕으로 여기서 무슨 일이 일어나고 있는지 가정합니다.

  1. SSH를 통해 컴퓨터에 연결하고 있습니다.

  2. SSH를 사용하면 기본 /bin/sh로그인 쉘이 시작됩니다.

  3. 이것은 로그인 쉘이므로 ~/.profile.

  4. 설정 .profile이 소스 코드 (역시 표준은 아니지만 일반) 이므로 bash를 실행하지 않더라도 ~/.bashrc지금 읽을 수 있습니다 ..bashrc

  5. 설정 .bashrc이 source ~/.bash_aliases이므로 해당 파일을 읽고 오류가 생성됩니다.

개인적으로 이 작품을 좋아하지 않는 또 다른 이유일부 시스템에서 내리는 결정기본 ~/.bashrc소스를 만듭니다 ~/.profile.

관련 정보