ক্লাসিক বোর্ন শেল সমর্থিত, এবং বাশ এবং কর্ন শেল এখনও সমর্থন করে, একটি -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
'ডি স্ক্রিপ্টে সেট করা আছে ।