අත්තනෝමතික තර්ක විස්ථාපනය කිරීමට යාන්ත්රණයක් නොමැති බැෂ් අන්වර්ථයේ ගැටලුවට සාමාන්ය විසඳුමක් ලබා ගැනීමට නීත්යානුකූල තාක්ෂණික හේතු තිබේ. එක් හේතුවක් නම්, ඔබ ක්රියාත්මක කිරීමට බලාපොරොත්තු වන විධානය ශ්රිතයක් ක්රියාත්මක කිරීමෙන් ඇතිවන පරිසරයේ සිදුවන වෙනස්කම් වලට අහිතකර ලෙස බලපානු ඇත. අනෙක් සියලුම අවස්ථාවන්හිදී, කාර්යයන් භාවිතා කළ යුතුය.
මේ සඳහා විසඳුමක් ලබා දීමට මෑතකදී මට බල කෙරුනේ, විචල්යයන් සහ ශ්රිතයන්ගේ අර්ථ දැක්වීම් මුද්රණය කිරීම සඳහා කෙටි විධාන කිහිපයක් නිර්මාණය කිරීමට මට අවශ්ය වීමයි. ඒ නිසා මම ඒ සඳහා කාර්යයන් කිහිපයක් ලිව්වා. කෙසේ වෙතත්, සමහර විචල්යයන් ඇත, ඒවා ශ්රිත ඇමතුමකින්ම වෙනස් වේ (හෝ විය හැකිය). ඒවා අතර:
FUNCNAME BASH_SOURCE BASH_LINENO BASH_ARGC BASH_ARGV
විචල්ය defns මුද්රණය කිරීම සඳහා මා භාවිතා කළ මූලික විධානය (ශ්රිතයක). set විධානය මඟින් ආකෘති ප්රතිදානයේදී:
sv () { set | grep --color=never -- "^$1=.*"; }
උදා:
> V=voodoo
sv V
V=voodoo
ගැටලුව: මෙය ඉහත සඳහන් විචල්යයන්ගේ අර්ථකථන වත්මන් සන්දර්භය තුළ මුද්රණය නොකෙරේ , උදා: අන්තර්ක්රියාකාරී ෂෙල් විමසුමක් තුළ (හෝ කිසිදු ක්රියාකාරී ඇමතුමක නොවේ නම්), FUNCNAME අර්ථ දක්වා නැත. නමුත් මගේ ක්රියාකාරිත්වය මට වැරදි තොරතුරු කියයි:
> sv FUNCNAME
FUNCNAME=([0]="sv")
මා විසින් ඉදිරිපත් කරන ලද එක් විසඳුමක් අනෙක් අය විසින් මෙම මාතෘකාව පිළිබඳ සඳහන් කර ඇත. විචල්ය defns., සහ එක් තර්කයක් පමණක් අවශ්ය වන මෙම නිශ්චිත විධානය සඳහා මම මෙය කළෙමි:
alias asv='(grep -- "^$(cat -)=.*" <(set)) <<<'
එමඟින් නිවැරදි ප්රතිදානය (කිසිවක් නැත) සහ ප්රති result ල තත්ත්වය (අසත්යය) ලබා දෙයි:
> 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
මෙම විසඳුම පිළිබඳ හොඳ දෙයක් නම්, කොටු වූ විධානය රචනා කිරීමේදී විධාන සඳහා ස්ථානීය පරාමිතීන් (තර්ක) හැසිරවීමට භාවිතා කරන සියලුම විශේෂ උපක්රම ක්රියාත්මක වනු ඇත. එකම වෙනස වන්නේ අරාව සින්ටැක්ස් භාවිතා කළ යුතු බවයි.
උදා,
ඔබට "$ @" අවශ්ය නම්, "$ {CMD_ARGV [@] use" භාවිතා කරන්න.
ඔබට "$ #" අවශ්ය නම්, "$ {# CMD_ARGV [@] use" භාවිතා කරන්න.
ආදිය.