환경: 우분투 14.04
bc
내 홈 폴더에 파일 이름이 있습니다. 파일의 전체 내용은 다음과 같습니다.
func() {
local a b=()
echo $0
}
func
#!/bin/bash
참고로 처음에는 아무것도 없습니다.
그러면 내가 이렇게 하면 /bin/bash ~/bc
나는 얻는다.
/home/dev/bc
예상대로.
그러나 대신 가져오면 . ~/bc
다음 오류가 발생합니다.
bash: /home/dev/bc: line 2: syntax error near unexpected token `('
bash: /home/dev/bc: line 2: ` local a b=()'
구매를 위해 다른 쉘이 실행된다고 가정합니다. 이런 경우 어떻게 변경할 수 있나요?
내가 하나를 하면 chsh
나는 얻는다.
dev@c1:~$ sudo chsh
[sudo] password for dev:
Changing the login shell for root
Enter the new value, or press ENTER for the default
Login Shell [/bin/bash]:
------댓글 중에서---------
echo $SHELL
반품/bin/bash
답변1
문제는 거의 확실하게 앨리어싱입니다. 이 작업을 수행할 때:
/bin/bash somefile
새 셸을 로드합니다. 새로운 시작을 하게 될 것입니다. 실행 파일에는 초기화 파일에 넣은 모든 내용이 포함되어 있지 않습니다.RCs - 이는 기본적으로 대화형 셸에서만 시작되기 때문에 이후에 생성된 다른 논리는 말할 것도 없습니다.
별칭이 이상해요. 별칭은 파서 확장입니다. 대부분의 셸에서 지원되는 최초의 확장 가능한 개체이며 많은 사람들이 기대하지 않는 방식으로 확장됩니다. bash
실제로 어떤 이유로든 alias
비대화형 셸에서 기본적으로 확장 기능을 비활성화하면 해당 기능의 사용이 방지됩니다. 따라서 별칭이 오류를 일으키는 경우(나는 이것이 문제라고 확신합니다) 환경 파일을 소싱하더라도 여전히 동일한 오류 출력이 발생하지 않을 수 있습니다 /bin/bash
.
별칭이 이상하다고 말하는 이유는 확장 수준이 다른 유형의 셸 확장과 다르기 때문입니다. 이는 아마도 쉘 확장이 발생하지 않는 함수 정의의 맥락에서 가장 분명할 것입니다. 왜냐하면 이러한 확장은 나중에 함수 실행을 위해 예약되어 있기 때문입니다.별칭 제외표현식을 두 번 평가할 필요가 없습니다. 별칭은 다음과 같습니다.안 돼요확장하다기간기능 실행(다시 말하지만 누락됨 eval
), 왜냐하면 그들은이미정의하는 동안 확장되었습니다.
예는 다음과 같습니다.
alias a='echo not a;b'
b(){ echo a\?; }; a(){ echo le sigh...; }
a; b
...인쇄...
not a
not a
le sigh...
le sigh...
alias
이름 지정이 처음으로 확장되는 때는 a
다음과 같습니다.
a(){...
()
이는 괄호가 예약어가 아닌 쉘 토큰이기 때문에 가능합니다 {}
. 따라서 공백 없이 단어를 구분할 수 있습니다. 이는 파서가 실행 가능한 명령문에 도달하기 위해 매크로 확장을 수행하므로 함수 및 배열 선언과 같은 작업에 특히 유용합니다. 위 확장의 결과는 다음과 같습니다.
}; echo not a;b(){
마지막 전개 변환:
a; b
...입력하다...
echo not a;b; b
일반적인 쉘 확장은 미리 분리된 컨텍스트에서 발생합니다. 모든 측면은 다음과 같은 제어 연산자에 의해 제한됩니다.
\n[]{}|&();<>\'"`
이러한 방식으로 대부분의 쉘 확장 자체는 인용 메커니즘으로 작동합니다. 변수에서 확장된 인용문은 확장에서 인용문을 인용하기 때문에 추가 인용문의 컨텍스트를 재귀적으로 제한하지 않습니다. 그러나 이보다 먼저 별칭 확장이 발생합니다. 간단한 명령에서 첫 번째 쉘 단어를 스캔할 때 파서가 별칭을 인식하면 나머지를 스캔하기 전에 별칭이 확장됩니다. 따라서 확장된 결과가 단순한 명령 이상의 것이라면... 그렇게 하십시오.
내 가정은 당신이 가장 간단한 설명이 될 것이라는 alias
진술을 가지고 있다는 것입니다 func
. 그러나 별칭은 후행 공백으로 정의되면 연결될 수 있고 또한 확장될 것입니다.이내에기능 정의 - 귀하가 제공한 정보만으로는 결정할 수 없습니다. 그러나 나는 귀하의 오류를 재현할 수 있다고 생각합니다. 이것은 가깝습니다:
alias func='func('
func(){
local a b=()
echo $0
}
func
...인쇄...
bash: syntax error near unexpected token `('
bash: local: can only be used in a function
bash
bash: syntax error near unexpected token `}'
bash: syntax error near unexpected token `newline'
그러니 이렇게 하세요:
alias func local a b echo
우리에게 말 해주세요.