Klasik Bourne kabuğu destekleniyor ve Bash ve Korn kabuğu hala bir -kseçenek destekliyor . Geçerli olduğunda dd, komut satırında herhangi bir ' -like' komut seçeneği otomatik olarak komuta iletilen ortam değişkenlerine dönüştürülür:
$ set -k
$ echo a=1 b=2 c=3
$
Çevre değişkenleri olduğuna ikna etmek biraz daha zor; bu benim için çalışıyor:
$ 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
$
Birincisi env | grep, tek küçük harfli ortam değişkenleri göstermemektedir. Birincisi bash, üzerinden çalıştırılan betiğe argüman aktarılmadığını -cve ortamın üç tek harfli değişkeni içerdiğini gösterir. İptal set +keder -kve aynı komutun artık kendisine iletilen bağımsız değişkenlere sahip olduğunu gösterir. ( Senaryo için a=1olduğu gibi tedavi edildi $0; bunu da uygun yankı ile kanıtlayabilirsiniz.)
Bu, sorunun sorduğunu başarır - yazmanın yazmakla ./script.sh a=1 b=2aynı olması gerekir a=1 b=2 ./script.sh.
Bir betiğin içinde böyle hileler denerseniz sorun yaşarsınız:
if [ -z "$already_invoked_with_minus_k" ]
then set -k; exec "$0" "$@" already_invoked_with_minus_k=1
fi
"$@"Aynen muamele edilmektedir; atama stili değişkenleri (hem bashve hem de ksh) bulmak için yeniden analiz edilmez . Denedim:
#!/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
ve d komut dosyasında yalnızca already_invoked_with_minus_kortam değişkeni ayarlanır exec.