나는 bash 스크립팅을 배우고 있는데 /usr/share/bash-completion의 305번째 줄에서 이것을 발견했습니다:
local cword words=()
그것은 무엇을 합니까? 인터넷의 모든 튜토리얼은 형식일 뿐입니다.
local var=value
답변1
내가 좋아하지만조던의 대답경험이 부족한 Linux 사용자에게 이러한 문제를 스스로 처리하는 방법을 보여주는 것도 마찬가지로 중요하다고 생각합니다.
제안된 방법은 Google 검색결과 페이지에 표시된 임의의 페이지에서 답변을 찾는 것보다 더 빠르고 다양합니다.
첫째, 명시적인 경로를 입력하지 않고도 Bash에서 실행할 수 있는 모든 명령은 ./command
두 가지 범주로 나눌 수 있습니다.Bash 쉘 내장 함수그리고외부 명령. Bash 셸 내장 명령은 Bash와 함께 설치되어 Bash의 일부이지만 외부 명령은 Bash의 일부가 아닙니다. 이는 Bash 쉘 내장이 내부적으로 문서화되어 man bash
있고 해당 문서가 help
명령을 통해 호출될 수도 있는 반면, 외부 명령은 일반적으로 자체 매뉴얼 페이지에 문서화되거나 일종의 플래그를 채택하기 때문에 중요합니다 . -h, --help
외부 명령:
$ type local
local is a shell builtin
명령 이름(에서 help type
)으로 사용되는 경우 명령이 어떻게 해석되는지 보여줍니다. 여기에서 이것이 local
쉘 내장 함수임을 알 수 있습니다 . 또 다른 예를 살펴보겠습니다.
$ type vim
vim is /usr/bin/vim
vim
여기서는 이것이 쉘 내장이 아니라 에 위치한다는 것을 알 수 있습니다 /usr/bin/vim
. 그러나 때로는 동일한 명령이 외부 명령과 쉘 내장으로 동시에 설치될 수 있습니다. 모든 가능성을 나열 -a
하려면 추가하세요 type
. 예:
$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo
echo
여기서는 쉘 내장 명령이자 외부 명령임을 알 수 있습니다 . 하지만 그냥 입력 echo
하고 누르면 Return쉘 내장이 이 목록의 첫 번째에 나타나기 때문에 호출됩니다. 이러한 버전이 모두 echo
동일할 필요는 없습니다. 예를 들어 내 시스템에는 태그가 /usr/bin/echo
필요 --help
하지만 Bash 내장 시스템에는 필요하지 않습니다.
자, 이제 이것이 쉘 내장이라는 것을 알았으니 local
어떻게 작동하는지 살펴보겠습니다.
$ help local
local: local [option] name[=value] ...
Define local variables.
Create a local variable called NAME, and give it VALUE. OPTION can
be any option accepted by `declare'.
Local variables can only be used within a function; they are visible
only to the function where they are defined and its children.
Exit Status:
Returns success unless an invalid option is supplied, an error occurs,
or the shell is not executing a function.
첫 번째 줄에 주목하세요: name[=value]
. 그리고 [
그 사이의 ]
모든 것임의로 선택할 수 있는. 이는 전 세계의 많은 매뉴얼 페이지와 문서 양식에서 사용되는 일반적인 규칙입니다 *nix
. 그렇긴 하지만, 귀하의 질문에서 요청하는 명령은 완벽하게 합법적입니다. Character 는 ...
이전 인수가 반복될 수 있음을 의미합니다. 다음에서 이 규칙에 대해 읽을 수도 있습니다 man man
.
The following conventions apply to the SYNOPSIS section and can be used
as a guide in other sections.
bold text type exactly as shown.
italic text replace with appropriate argument.
[-abc] any or all arguments within [ ] are optional.
-a|-b options delimited by | cannot be used together.
argument ... argument is repeatable.
[expression] ... entire expression within [ ] is repeatable.
이제 마지막으로 Linux에서 다양한 명령이 어떻게 작동하는지 더 쉽게 이해할 수 있기를 바랍니다.
답변2
당신의 모범
local cword words=()
cword
현재 함수 범위에서 스칼라 변수와 빈 배열을 정의합니다 .words
local
주 실행 환경이 값을 "볼" 수 없도록 현재 정의된 함수 내에서만 범위를 갖도록 변수를 선언하기만 하면 됩니다. local
함수 외부에서는 사용할 수 없습니다 . 예
func() {
nonlocal="Non local variable"
local onlyhere="Local variable"
}
func
echo $nonlocal
echo $onlyhere
출력: 비지역 변수
따라서 $onlyhere
함수 범위 외부에서는 표시되지 않습니다.
답변3
키워드는 local
여러 변수를 사용할 수 있습니다. 변수 값 제공은 선택 사항입니다. 귀하의 예에서는 두 개의 변수를 선언 cword
하고 words
. 변수 words
에 빈 배열이 할당됩니다.
답변4
Unix 및 Linux SE 사용자/@alex-santos님, 안녕하세요. 이 질문에 대한 전체 답변, 포괄적인 답변이 여기에 있습니다!
질문 1
local cword words=()
그것은 무엇을 합니까?
답변 1
"local 키워드는 여러 변수를 사용할 수 있습니다. 변수 값 제공은 선택 사항입니다. 귀하의 예에서는 cword와 word라는 두 가지 변수를 선언합니다."(@jordanm에게 감사드립니다!)
SC2155는 별도로 선언하고 할당해야 한다는 점을 참고할 수 있습니다.
즉, 매개변수 사이에 여러 선언 옵션을 사용하는 것을 제외하고는 여전히 작동합니다. 또한 선언된 매개변수는 모든 변수에 적용됩니다(이 경우 -i). 이봐한 줄에 여러 지역 변수를 선언할 수 있나요?
변수 words
에 빈 배열이 할당됩니다. 변수가 local
액세스 수준 으로 설정되어 있으므로쉘 함수에서 선언해야 합니다.. 변수는 local
오류를 발생시키지 않고 동일한 이름의 전역 변수를 재정의합니다. 지역 변수는 함수 실행 중에 전역 변수의 값만 대체합니다. 전역 변수의 값은 재정의 함수의 범위 외부에서 관리되는 값입니다.
또한 함수 범위 내에서만 선언되고 아직 전역적으로 선언되거나 가져오지 않은 변수에는 이 사례를 설명하는 여러 기존 답변의 아래 코드와 아래 코드에서 설명하는 다른 사례를 다루기 위해 추가한 코드가 표시됩니다.
*아래 첫 번째 함수/로컬 범위 예시의 사례 중 하나를 설명한 @electric-coffee, @Otheus에게 감사드립니다.*
쉘 함수를 사용하여 모든 접근 권한과 범위 배열이 주어진 로컬/글로벌 변수를 보여줍니다.
사례 1. 로컬 범위가 존재하지 않기 때문에 전역 범위에 액세스할 수 없습니다.
exampleFunction() {
nonlocal="Non local variable"
local localToExampleFunctionOnly="Local variable"
}
# Prints "Non local variable".
echo $nonLocal
사례 2. 전역 범위 변수를 함수 범위의 지역 변수 값으로 덮어씁니다.
# Set the globally accessible variable value.
globalVariable="Globally accessible variable."
# Prints "Globally accessible variable." to the console from within
# the global context.
echo $globalVariable;
exampleFunction() {
globalVariable="Locally accessible variable."
# Prints "Locally accessible variable."
echo $globalVariable;
}
# Call function, printing "Globally accessible variable." to the console from within
# the global context.
exampleFunction
# Prints "Globally accessible variable." to the console
# from within the global runtime environment (the original value set to globally accessible scope).
echo $globalVariable
Case 3. 함수 범위에서 참조하는 전역 범위 변수가 전역 범위에서 변경된 후 두 번째 함수 범위에서 출력됩니다.
# Set the globally accessible variable value.
globalVariable="Globally accessible variable."
# Prints "Globally accessible variable." to the console from within
# the global context.
echo $globalVariable
exampleFunction() {
# Prints "Globally accessible variable." to the console
# from within the function scope context.
echo $globalVariable;
}
# Call function the first time
exampleFunction
# Prints "Globally accessible variable." to the console
# from within the global runtime environment.
echo $globalVariable
# Update the globally accessible variable to a new value.
globalVariable="That's all the cases for scoping I can think of..."
# Prints "That's all the cases for scoping I can think of..." to the
# console from within the global context.
echo $globalVariable;
# Call function the last time, now that the value has been updated
# from global and local scope.
# Prints "That's all the cases for scoping I can think of..."
# from the `exampleFunction`.
# Prints "That's all the cases for scoping I can think of..." to the
# console from within the function scoped context, re-referencing
# the updated global value and printing it to the terminal's output.
echo $globalVariable
함수 범위를 "외부" 환경의 부작용 없이 실행 중에 지역 변수를 수정하거나 참조할 수 있는 코드 공간으로 생각해보세요.
요약하자면 words=()
이는 이 쉘 스크립트에 설정된 두 번째 지역 변수이며 구문상의 이유로 해당 유형은 Array 입니다 words=()
. 이 ()
섹션은 선언 후에 액세스할 수 있는 빈 배열로 초기화됩니다 $words
. $words[$elementNumericIndex] and set during initialization like
Words=("bob" "john" "steve") Words[0]="bob"`를 통한 or
액세스 및 요소 .
*이것은 bash에서 사용하기 위한 완전한 문서입니다.nix 쉘 변수(설정, 액세스 등).
https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_10_02.html
질문 2
인터넷의 모든 튜토리얼은 형식일 뿐입니다.
local var=value
답변 2
이미 알고 계시겠지만 이는 키-값 변수 관계를 유지하기 위해 더 일반적으로 사용되는 단일 값->변수 할당이므로 코드 가독성이 향상되고 중복이 줄어들며 참조 값이 다시 선언될 때 성능이 향상됩니다( Duplicate 값의 하드코딩), 모범 사례를 장려하고 중복된 하드코딩된 버전과 친숙한 이름의 변수(또한 가장 현대적인 변수)에서 값을 읽거나 설정/선언할 때 "뚱뚱한 손가락"의 위험을 줄입니다. 잘못된 IDE 및 편집기에서도 플러그인을 지원합니다. 또는 기본적으로 선언 후 변수를 자동 완성하는 기능이 있습니다(범위 내에 있고 애플리케이션을 작성할 때 커서 위치에 따라 다름).
추상적인
OP 질문에 대한 완전하고 간결한 답변을 제공하기 위해 이 스레드에 제공된 훌륭한 답변 중 일부를 결합했습니다.
나는 이것을 우연히 발견하고 OP의 답변에 완전히 대답하는 가장 정확하고 간결한 방법이 @jordanm, @electric-coffee, @arkadiusz-drabczyk에 흩어져 있다는 것을 깨달았습니다 (로컬 터미널 매뉴얼에서 직접 Guide us to good 응답 출력) 선언된 함수 범위 변수 사용에 관한 OP의 질문을 해결합니다 local
.
local cword words=()
local var=value
유용한 링크: