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


16

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

Bash 참조 매뉴얼에 따르면

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

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


올바른 인식. 는 -k우리가 그들을 리팩토링 할 필요없이 30 세 쉘 스크립트를 실행할 수 있습니다. 대신 접두사 구문을 사용하여 임시 환경 변수를 전달하십시오.var1=x var2=y command ...
Henk Langeveld

답변:


14

쉘 스크립트에 인자로 전달 된 환경 변수를 마치 마치 마치 마치 환경에서 설정 한 것처럼 "주입"하고 싶을 때 기본적으로 사용할 수 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

어떤 언어로 프로그래밍 할 때 변수와 값 전달은 안정적인 코드 작성에 중요합니다. 정수 및 배열 변수 유형 외에도 다른 모든 쉘 변수는 문자열을 값으로 허용합니다. 쉘 프로그래밍 언어에 대해 이야기 할 때 일관성을 유지하기 위해 "keyword parameter"라는 문구를 선호합니다. 키워드 매개 변수에 값을 지정할 때주의해야 할 사항은 다음과 같습니다.

  • 예기치 않은 영향을 피하려면 항상 매개 변수 할당 하위 문자열을 명령 문자열 앞에 놓으십시오.

    B 쉘에서 키워드 매개 변수의 지정된 값은 (로컬) 쉘 변수에 저장됩니다. bash 및 ksh에서 명령 앞의 키워드 매개 변수 지정 문자열은 쉘 변수에 저장되지 않습니다. 현재 명령을 실행하기 위해 분기 된 즉각적인 하위 프로세스에만 영향을줍니다. 키워드 매개 변수 할당 문자열 만 (로컬) 셸 변수에 저장됩니다. 키워드 매개 변수 할당 문자열은 별칭, 선언, 조판, 내보내기, 읽기 전용 및 로컬 내장 명령에 대한 인수로 나타날 수도 있습니다. [Bash Reference Manual의 섹션 3.4]

  • 키워드 매개 변수 지정 문자열은 명령 이름 뒤에 놓인 경우 실행될 명령의 인수로 처리됩니다.

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

이 링크에서 ss64.com/bash/set.html 위해 set -k그들은 준 -o keyword외에 -k옵션을 선택합니다. 그게 뭔가를 의미합니까?
Ramesh

@ Ramesh- set -o keyword는 긴 형식입니다 set -k. 참조하십시오 help set | grep -- '-k'.
slm

그래. 나는 왜 두 가지 옵션이 있는지 이해하려고 오랫동안 머리를 긁고있었습니다. 평소 완벽한 답변 :)
Ramesh

4
./cmd.bash VARCMD=hi 필요 set -kVARCMD=hi ./cmd.bash없이 정확하게 작동하도록 합니다 set -k. OP의 특정 질문은 bash가 ./cmd.bash VARCMD=hi양식 을 지원해야 할 필요성에 관한 것
같아요

@ 1_CR-좋은 지적. 나는 그것이 무엇보다 스타일과 관련이 있다고 생각하지만 실제 소스를 찾을 수 있는지 알 수 있습니다.
slm

8

실제적인 사용법 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.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.