বাশ ওরফে সমস্যা সমাধানের ব্যবস্থা গ্রহণের ব্যবস্থা না রাখার সমস্যাটির সাধারণীকরণ সমাধান পাওয়ার বৈধ প্রযুক্তিগত কারণ রয়েছে। এর একটি কারণ হ'ল যদি আপনি আদেশটি কার্যকর করতে চান তবে ফাংশন সম্পাদন করার ফলে পরিবেশের পরিবর্তনের ফলে বিরূপ প্রভাব পড়বে। অন্যান্য সমস্ত ক্ষেত্রে, ফাংশনগুলি ব্যবহার করা উচিত।
সম্প্রতি আমাকে এর সমাধানের চেষ্টা করতে বাধ্য করে তা হ'ল আমি ভেরিয়েবল এবং ফাংশনগুলির সংজ্ঞা মুদ্রণের জন্য কিছু সংক্ষেপিত কমান্ড তৈরি করতে চেয়েছিলাম। তাই আমি এই উদ্দেশ্যে কিছু ফাংশন লিখেছি। যাইহোক, কিছু ভেরিয়েবল রয়েছে যা একটি ফাংশন কল দ্বারা নিজেই পরিবর্তিত (বা হতে পারে)। এর মধ্যে হ'ল:
FUNCNAME BASH_SOURCE BASH_LINENO BASH_ARGC BASH_ARGV
ভেরিয়েবল ডিফেন্সগুলি মুদ্রণের জন্য আমি যে বেসিক কমান্ডটি ব্যবহার করেছি (একটি ফাংশনে)। সেট কমান্ড দ্বারা ফর্ম আউটপুট ছিল:
sv () { set | grep --color=never -- "^$1=.*"; }
উদাহরণ:
> V=voodoo
sv V
V=voodoo
সমস্যা: এটি উপরে উল্লিখিত ভেরিয়েবলগুলির সংজ্ঞাটি বর্তমান প্রসঙ্গে যেমন মুদ্রণ করবে না , উদাহরণস্বরূপ, যদি ইন্টারেক্টিভ শেল প্রম্পটে (বা কোনও ফাংশন কলগুলিতে নয়), FUNCNAME সংজ্ঞায়িত হয়নি। তবে আমার ফাংশন আমাকে ভুল তথ্য বলে:
> sv FUNCNAME
FUNCNAME=([0]="sv")
আমি যে সমাধানটি নিয়ে এসেছি সে সম্পর্কে অন্যরা এই বিষয়ে অন্যান্য পোস্টে উল্লেখ করেছেন। এই নির্দিষ্ট কমান্ডটির জন্য ভেরিয়েবল Defns। মুদ্রণ করতে এবং যার জন্য কেবল একটি যুক্তি প্রয়োজন, আমি এটি করেছি:
alias asv='(grep -- "^$(cat -)=.*" <(set)) <<<'
যা সঠিক আউটপুট দেয় (কিছুই নয়) এবং ফলাফলের স্থিতি (মিথ্যা):
> asv FUNCNAME
> echo $?
1
যাইহোক, আমি এখনও একটি সমাধান খুঁজে বের করতে বাধ্য হয়েছি যা নির্বিচারে সংখ্যক যুক্তিগুলির জন্য কাজ করে।
বাশ অ্যালিয়াসেড কমান্ডে স্বেচ্ছাচারী তর্কগুলি পাস করার একটি সাধারণ সমাধান:
# (I put this code in a file "alias-arg.sh"):
# cmd [arg1 ...] – an experimental command that optionally takes args,
# which are printed as "cmd(arg1 ...)"
#
# Also sets global variable "CMD_DONE" to "true".
#
cmd () { echo "cmd($@)"; declare -g CMD_DONE=true; }
# Now set up an alias "ac2" that passes to cmd two arguments placed
# after the alias, but passes them to cmd with their order reversed:
#
# ac2 cmd_arg2 cmd_arg1 – calls "cmd" as: "cmd cmd_arg1 cmd_arg2"
#
alias ac2='
# Set up cmd to be execed after f() finishes:
#
trap '\''cmd "${CMD_ARGV[1]}" "${CMD_ARGV[0]}"'\'' SIGUSR1;
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# (^This is the actually execed command^)
#
# f [arg0 arg1 ...] – acquires args and sets up trap to run cmd:
f () {
declare -ag CMD_ARGV=("$@"); # array to give args to cmd
kill -SIGUSR1 $$; # this causes cmd to be run
trap SIGUSR1; # unset the trap for SIGUSR1
unset CMD_ARGV; # clean up env...
unset f; # incl. this function!
};
f' # Finally, exec f, which will receive the args following "ac2".
উদাহরণ:
> . alias-arg.sh
> ac2 one two
cmd(two one)
>
> # Check to see that command run via trap affects this environment:
> asv CMD_DONE
CMD_DONE=true
এই সমাধানটির একটি দুর্দান্ত বিষয় হ'ল আটকে থাকা কমান্ডটি রচনা করার সময় পজিশনাল প্যারামিটারগুলি (আর্গুমেন্টগুলি) কমান্ডগুলিতে হ্যান্ডেল করার জন্য ব্যবহৃত সমস্ত বিশেষ ট্রিক্স কাজ করবে। পার্থক্যটি হ'ল অ্যারে সিনট্যাক্সটি অবশ্যই ব্যবহার করা উচিত।
যেমন,
আপনি যদি "$ @" চান তবে "$ {সিএমডি_আরজিভি [@]।" ব্যবহার করুন।
আপনি যদি "$ #" চান তবে "$ {# সিএমডি_আরজিভি [@]।" ব্যবহার করুন।
প্রভৃতি