./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