클래식 Bourne 셸이 지원되며 Bash 및 Korn 셸은 여전히 -k옵션입니다. 이것이 효과가있을 때 dd, 명령 행 어디에서나 ' -like'명령 옵션은 자동으로 명령에 전달 된 환경 변수로 변환됩니다.
$ set -k
$ echo a=1 b=2 c=3
$
그들이 환경 변수라는 것을 확신시키기는 조금 더 어렵습니다. 이것을 실행하면 나를 위해 작동합니다.
$ set -k
$ env | grep '^[a-z]=' # No environment a, b, c
$ bash -c 'echo "Args: $*" >&2; env' a=1 b=2 c=3 | grep '^[a-z]='
Args:
a=1
b=2
c=3
$ set +k
$ bash -c 'echo "Args: $*" >&2; env' a=1 b=2 c=3 | grep '^[a-z]='
Args: b=2 c=3
$
첫 번째 env | grep는 소문자가 하나 인 환경 변수가 없음을 보여줍니다. 첫 번째 bash는를 통해 실행 된 스크립트에 전달 된 인수가 없으며 -c환경에 세 개의 단일 문자 변수가 포함되어 있음을 보여줍니다 . 는 set +k을 취소 -k하고 같은 명령을 지금에 전달 된 인수를 가지고 있음을 보여줍니다. (이것은 대본 a=1과 같이 취급 $0되었으므로 적절한 에코로 증명할 수도 있습니다.)
이것은 타이핑 ./script.sh a=1 b=2이 타이핑과 같아야 한다는 질문을합니다 a=1 b=2 ./script.sh.
스크립트 내에서 다음과 같은 트릭을 시도하면 문제가 발생합니다.
if [ -z "$already_invoked_with_minus_k" ]
then set -k; exec "$0" "$@" already_invoked_with_minus_k=1
fi
는 "$@"그대로 처리됩니다; 할당 스타일 변수를 찾기 위해 재분석되지 않습니다 ( bash및 모두 ksh). 나는 시도했다 :
#!/bin/bash
echo "BEFORE"
echo "Arguments:"
al "$@"
echo "Environment:"
env | grep -E '^([a-z]|already_invoked_with_minus_k)='
if [ -z "$already_invoked_with_minus_k" ]
then set -k; exec "$0" "$@" already_invoked_with_minus_k=1
fi
echo "AFTER"
echo "Arguments:"
al "$@"
echo "Environment:"
env | grep -E '^([a-z]|already_invoked_with_minus_k)='
unset already_invoked_with_minus_k
already_invoked_with_minus_k환경 변수 만 exec'd 스크립트에 설정됩니다 .