set -k
bash에서 언제 옵션을 사용 합니까?
Bash 참조 매뉴얼에 따르면
대 입문 형식의 모든 인수는 명령 이름 앞에 오는 인수뿐만 아니라 명령의 환경에 배치됩니다.
옵션의 기능을 이해하지만 언제 필요할지 상상할 수 없었습니다.
set -k
bash에서 언제 옵션을 사용 합니까?
Bash 참조 매뉴얼에 따르면
대 입문 형식의 모든 인수는 명령 이름 앞에 오는 인수뿐만 아니라 명령의 환경에 배치됩니다.
옵션의 기능을 이해하지만 언제 필요할지 상상할 수 없었습니다.
답변:
쉘 스크립트에 인자로 전달 된 환경 변수를 마치 마치 마치 마치 환경에서 설정 한 것처럼 "주입"하고 싶을 때 기본적으로 사용할 수 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 명령으로 조작 할 수 있습니다.
set -o keyword
는 긴 형식입니다 set -k
. 참조하십시오 help set | grep -- '-k'
.
./cmd.bash VARCMD=hi
필요 set -k
VARCMD=hi ./cmd.bash
없이 정확하게 작동하도록 합니다 set -k
. OP의 특정 질문은 bash가 ./cmd.bash VARCMD=hi
양식 을 지원해야 할 필요성에 관한 것
실제적인 사용법 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.
-k
우리가 그들을 리팩토링 할 필요없이 30 세 쉘 스크립트를 실행할 수 있습니다. 대신 접두사 구문을 사용하여 임시 환경 변수를 전달하십시오.var1=x var2=y command ...