Bash에서 `set -k` 옵션의 실제 사용법

Bash에서 `set -k` 옵션의 실제 사용법

set -kBash에서는 언제 옵션을 사용합니까?

배쉬 참조 매뉴얼설명하다,

할당문 형식의 모든 인수는 명령 이름 앞의 인수뿐만 아니라 명령 환경에 배치됩니다.

이 옵션의 기능을 이해하지만 언제 필요할지는 상상할 수 없습니다.

답변1

기본적으로 환경 변수를 통해 설정된 것처럼 쉘 스크립트에 인수로 전달된 환경 변수를 언제든지 "주입"할 수 있지만 명령 중간을 실행하기 전에 목록에 영구적으로 상주할 export필요는 없습니다 .export

노트:-k스위치의 긴 형태 도 있습니다 set -o keyword.

$ cat cmd1.bash 
#!/bin/bash

echo $VARCMD

이제 내가 set -k:

$ set -k; ./cmd1.bash VARCMD="hi"; set +k
hi

하지만 위 스크립트를 실행하면 다음과 같습니다.

$ ./cmd1.bash 

$

수출은 무엇을 합니까?

$ help export
...
Marks each NAME for automatic export to the environment of subsequently
executed commands.  If VALUE is supplied, assign VALUE before exporting.
...

export | grep VAR따라서 스크립트에 다음과 같이 추가하면 :

$ cat cmd2.bash 
#!/bin/bash

echo $VARCMD
export | grep VAR

위의 테스트를 다시 실행합니다.

$ set -k; ./cmd2.bash VARCMD="hi"; set +k
hi
declare -x VARCMD="hi"

하지만 set -k:

$ ./cmd2.bash 

$

set -k일시적으로 변수를 일괄적으로 내보내는 경우에도 마찬가지입니다.

다른 예시

$ cat cmd3.bash 
#!/bin/bash

echo $VARCMD1
echo $VARCMD2
export | grep VAR

여러 변수를 설정하면 모두 내보내집니다.

$ set -k; ./cmd3.bash VARCMD1="hi" VARCMD2="bye"; set +k
hi
bye
declare -x VARCMD1="hi"
declare -x VARCMD2="bye"

그렇다면 모든 환경 변수를 주입하는 것일까요?

아니요, -k여기서는 매우 분명한 일이 이루어지고 있습니다. 명령을 실행할 때 명령줄에 포함된 변수만 내보냅니다.

이 변수를 설정했다고 가정해 보겠습니다.

$ VARCMD1="hi"

이제 동일한 명령을 실행할 때 다음을 생략합니다 VARCMD1="hi".

$  set -k; ./cmd3.bash VARCMD2="bye"; set +k

bye
declare -x VARCMD2="bye"

그런데 왜 이런 일이 발생합니까?

이 기능에 대해 약간 설명하는 "키워드 인수 할당 문자열"이라는 소스를 찾았습니다.노트:원본 URL은 IP 주소를 사용하므로 SE에서 직접 연결할 수 없습니다.

http://140.120.7.21/OpenSystem2/SoftwareTools/node16.html

어떤 언어로든 프로그래밍할 때 변수와 해당 값 전달은 안정적인 코드를 작성하는 데 중요합니다. 정수 및 배열 변수 유형을 제외하고 다른 모든 쉘 변수는 문자열을 값으로 허용합니다. 일관성을 위해 우리는 쉘 프로그래밍 언어에 대해 말할 때 "키워드 인수"라는 문구를 사용하는 것을 선호합니다. 키워드 인수에 값을 할당할 때 주의해야 할 몇 가지 사항이 있습니다.

  • 의도하지 않은 효과를 방지하려면 항상 명령 문자열 앞에 매개변수 할당 하위 문자열을 추가하십시오.

    B 쉘에서는 키워드 인수에 할당된 값이 (로컬) 쉘 변수에 저장됩니다. Bash 및 ksh에서 명령 앞의 키워드 인수 할당 문자열은 쉘 변수에 저장되지 않습니다. 현재 명령을 실행하기 위해 분기된 직계 하위 프로세스에만 영향을 미칩니다. 한 줄짜리 키워드 인수 할당 문자열은 실제로 (로컬) 쉘 변수에 저장됩니다. 키워드 인수 할당 문자열은 별명, 선언, 조판, 내보내기, 읽기 전용 및 로컬 내장 명령에 대한 인수로 나타날 수도 있습니다. [Bash 참조 매뉴얼 섹션 3.4]

  • 키워드 인수 할당 문자열이 명령 이름 뒤에 오면 실행할 명령에 대한 인수로 처리됩니다.

  • 키워드 매개변수는 set 명령을 통해 조작할 수 있습니다.

답변2

실제 사용법은 set -k개인 스타일의 문제일 가능성이 높습니다. 함수 호출에서 키워드 인수 사용을 제공하는 프로그래밍 언어를 선호하는 사람이나 dd명령 구문을 선호하는 소수의 사람 등 일부 사람들은 다음을 선호할 수 있습니다.

세트-k
...
명령 var 1 =val 1 var 2 =val 2

도착하다

var 1 =val 1 var 2 =val 2 명령

이 옵션이 일부 쉘에 존재하는 실제 이유는POSIX 표준의 set 명령의 기본 원칙:

The following set flags were omitted intentionally with the following rationale:

The -k flag was originally added by the author of the Bourne shell to make it easier
for users of pre-release versions of the shell. In early versions of the Bourne shell
the construct
    set name=value
had to be used to assign values to shell variables.

관련 정보