Bash 재귀 호출이 실패함

Bash 재귀 호출이 실패함

./bashrc환경 변수, 명령 등을 전환 하는 함수를 작성 중입니다 . 함수는 필요한 변수를 설정한 다음 자신을 호출해야 합니다. 대신 나는 얻는다

bash: ./bash: No such file or directory

내 스크립트의 기능 .bashrc은 다음과 같습니다.

switch() {
    EXISTS="$(ls ~/br/*$1 2> /dev/null)"
    if [ -z "EXISTS" ]; then
        BR="$1*"
        export PS1="...."
    else
        # Find "export BRANCH=" in .bashrc and replace it with input
        sed -i "0,/export/BRANCH=/{s/export BRANCH=.*$/export BRANCH\"$1\"/}" ~/.bashrc

        ./$0
    fi
}

이 포스팅을 보니,재귀적으로 스크립트 호출, 그러나 문제가 같은지 확실하지 않습니다.

편집하다

내 목표는 기본적으로 환경 변수, 별칭 등을 변경하는 것입니다. 따라서 내 bash 스크립트에는 처음에 다음이 포함됩니다.

export WORKNAME="br-190"
export BRANCH="~/$WORKNAME"
export WORKSPACE="~/workspace-${WORKNAME}"

alias sw='cd $BRANCH/source'
alias fix='mv ~/.good-files $WORKSPACE'

switch() {
   ... See Above ...
}

목표는 WORKNAME명령줄에서 변경을 수행하는 것입니다.

switch br-104

답변1

첫 번째 분명한 질문은 다음과 같습니다.

if [ -z "EXISTS" ]; then

그럴 것이다언제나당신이 확인하고 있기 때문에 사실입니다 EXISTS비었다. 문자열이므로 비워 둘 수 없습니다. 당신은 이것을하고 싶습니다 :

if [ -z "$EXISTS" ]; then

ls또한 이런 종류의 일에는 나쁜 습관이고, 스크립트 변수 이름에 대문자를 사용하는 것도 나쁜 습관입니다. 이름이 겹치는 것을 방지하려면 환경 변수에만 대문자를 사용하세요.

다음 주요 문제는 통화 중이라는 것입니다 ./$0. $0그게 bash다 입니다 ./$0. ./bash존재하지 않습니다. 아마도 당신이 원하는 것은 다시 읽는 것뿐입니다 .bashrc.

물론 sed구문 오류를 수정한 후에도 명령은 항상 자체적으로 일치합니다. 실제 sed 명령을 사용하여 줄을 건너뛰어야 합니다. 예를 들어 줄의 시작 부분에서만 일치합니다(수정 사항도 참고하세요).

sed -i "/^export BRANCH=/{s/export BRANCH=.*$/export BRANCH="$1\"/}" ~/.bashrc

하지만 다음과 같이 단순화할 수 있습니다.

sed -i "s/^export BRANCH=.*$/export BRANCH="$1\"/" ~/.bashrc

이것을 종합하면 아마도 다음과 같은 것을 원할 것입니다.

switch() {
  shopt -s nullglob
  exists=(~/br/*"$1")
  if [ -z "$exists" ]; then
    ## Are you sure you want the * there? That will expand to all
    ## files and directories beginning with $1
    BR="$1*"
    export PS1="...."
  else
    # Find "export BRANCH"a"
    sed -i "s/export BRANCH=.*$/export BRANCH=\"$1\"/" ~/.bashrc
    . ~/.bashrc
    fi
}

답변2

가져 오면 .bashrc실행 명령이 간단히 호출됩니다 bash.

이는 다시 다음 ./$0으로 확장됨을 의미합니다.

./bash

파일이 현재 디렉터리에 없기 때문에 bash이 오류 메시지가 나타납니다 . 실행하고 싶지 않고 가져오고 싶기 때문에 .와 파일 이름 사이에 공백이 있어야 합니다. 그렇지 않으면 .현재 작업 디렉터리가 참조됩니다.

. ~/.bashrc

관련 정보