Answers:
ස්ක්රිප්ටයක් උපුටා ගැනීම වත්මන් ෂෙල් ක්රියාවලියේ විධාන ක්රියාත්මක කරයි.
ක්රියාත්මක වන කේත රචනය තුල විධානයන් ක්රියාත්මක කරනු ඇත නව ෂෙල් ක්රියාවලිය.
ඔබගේ දැනට ක්රියාත්මක වන කවචයේ පරිසරය වෙනස් කිරීමට ස්ක්රිප්ටයට අවශ්ය නම් ප්රභවය භාවිතා කරන්න. වෙනත් ආකාරයකින් ක්රියාත්මක කරන්න.
ඔබ තවමත් ව්යාකූල නම්, කරුණාකර කියවන්න.
ක්රියාත්මක කිරීමට වාක්ය ඛණ්ඩය සහ ප්රභවයට ඇති වාක්ය ඛණ්ඩය පිළිබඳ පොදු ව්යාකූලතා පැහැදිලි කිරීම සඳහා:
./myscript
මෙම වනු ඇත ක්රියාත්මක myscript
ගොනුව ක්රියාත්මක වූ අතර වත්මන් ඩිරෙක්ටරියේ පිහිටා බව ලබා. ප්රමුඛ තිත සහ කප්පාදුව ( ./
) වත්මන් නාමාවලිය දක්වයි. වත්මන් නාමාවලිය සාමාන්යයෙන් (සහ සාමාන්යයෙන් නොවිය යුතුය) නොමැති නිසා මෙය අවශ්ය වේ $PATH
.
myscript
ගොනුව ක්රියාත්මක කළ හැකි සහ කිසියම් නාමාවලියක පිහිටා තිබේ නම් මෙය ක්රියාත්මක myscript
වේ $PATH
.
source myscript
මෙය ප්රභවයක් වනු ඇත myscript
. ගොනුව ක්රියාත්මක කළ නොහැකි නමුත් එය වලංගු ෂෙල් පිටපතක් විය යුතුය. ගොනුව වත්මන් නාමාවලියෙහි හෝ තුළ ඇති නාමාවලියක විය $PATH
හැකිය.
. myscript
මෙයද ප්රභවයක් වනු ඇත myscript
. POSIX විසින් අර්ථ දක්වා ඇති පරිදි මෙම "අක්ෂර වින්යාසය" නිල එකකි . බෑෂ් තිතට source
අන්වර්ථයක් ලෙස අර්ථ දක්වා ඇත.
myscript.sh
පහත අන්තර්ගතය සමඟ සලකා බලන්න :
#!/bin/sh
# demonstrate setting a variable
echo "foo: "$(env | grep FOO)
export FOO=foo
echo "foo: "$(env | grep FOO)
# demonstrate changing of working directory
echo "PWD: "$PWD
cd somedir
echo "PWD: "$PWD
අපි මුලින්ම ස්ක්රිප්ට් ක්රියාත්මක කිරීමට පෙර වත්මන් පරිසරය පරීක්ෂා කරමු:
$ env | grep FOO
$ echo $PWD
/home/lesmana
විචල්යය FOO
නිර්වචනය කර නොමැති අතර අප සිටින්නේ නිවාස නාමාවලියෙහි ය.
දැන් අපි ගොනුව ක්රියාත්මක කරමු :
$ ./myscript.sh
foo:
foo: FOO=foo
PWD: /home/lesmana
PWD: /home/lesmana/somedir
පරිසරය නැවත පරීක්ෂා කරන්න:
$ env | grep FOO
$ echo $PWD
/home/lesmana
විචල්යය FOO
සකසා නැති අතර වැඩ කරන නාමාවලිය වෙනස් නොවීය.
ස්ක්රිප්ට් ප්රතිදානය පැහැදිලිවම පෙන්වන්නේ විචල්යය සකසා ඇති අතර නාමාවලිය වෙනස් කර ඇති බවයි. චෙක්පත පසුව පෙන්වන්නේ විචල්යය සකසා නැති බවත් නාමාවලිය වෙනස් නොවන බවත් ය. සිදුවුයේ කුමක් ද? වෙනස්කම් නව කවචයකින් සිදු කරන ලදී . මෙම වත්මන් ෂෙල් පැටව් ගසා නව තිර රචනය ක්රියාත්මක කිරීමට ෂෙල්. ස්ක්රිප්ට් එක නව කවචයේ ක්රියාත්මක වන අතර පරිසරයේ සිදුවන සියලුම වෙනස්කම් නව කවචයේ ක්රියාත්මක වේ. ස්ක්රිප්ට් එක කළ පසු නව කවචය විනාශ වේ. නව කවචයේ පරිසරයේ සිදුවන සියළු වෙනස්කම් නව කවචය සමඟ විනාශ වේ. වත්මන් කවචයේ මුද්රණය කරන්නේ ප්රතිදාන පෙළ පමණි.
දැන් අපි ගොනුව මූලාශ්රය :
$ source myscript.sh
foo:
foo: FOO=foo
PWD: /home/lesmana
PWD: /home/lesmana/somedir
පරිසරය නැවත පරීක්ෂා කරන්න:
$ env | grep FOO
FOO=foo
$ echo $PWD
/home/lesmana/somedir
විචල්ය FOO සකසා ඇති අතර වැඩ කරන නාමාවලිය වෙනස් වී ඇත.
ස්ක්රිප්ට් එක මූලාශ්ර කිරීමෙන් නව කවචයක් නිර්මාණය නොවේ. සියලුම විධාන වත්මන් කවචයේ ක්රියාත්මක වන අතර පරිසරයේ සිදුවන වෙනස්කම් වත්මන් කවචයේ ක්රියාත්මක වේ.
මෙම සරල උදාහරණයේ දී ක්රියාත්මක කිරීමේ ප්රතිදානය ස්ක්රිප්ට් මූලාශ්රයට සමාන බව සලකන්න. මෙය සැමවිටම එසේ නොවේ.
පහත පිටපත සලකා බලන්න pid.sh
:
#!/bin/sh
echo $$
(විශේෂ විචල්යය $$
වත්මන් ධාවන කවච ක්රියාවලියේ PID දක්වා විහිදේ)
පළමුව වත්මන් කවචයේ PID මුද්රණය කරන්න:
$ echo $$
25009
පිටපත මූලාශ්රය:
$ source pid.sh
25009
පිටපත ක්රියාත්මක කරන්න, PID සටහන:
$ ./pid.sh
25011
මූලාශ්රය නැවතත්:
$ source pid.sh
25009
නැවත ක්රියාත්මක කරන්න:
$ ./pid.sh
25013
ස්ක්රිප්ට් ක්රියාත්මක කිරීමේදී එකම ක්රියාවලියක් තුළ ස්ක්රිප්ට් එක ක්රියාත්මක වන බව ඔබට දැක ගත හැකිය. එම නව ක්රියාවලිය වන්නේ පිටපත ක්රියාත්මක කිරීම සඳහා නිර්මාණය කරන ලද නව කවචයයි. ස්ක්රිප්ට් එක මූලාශ්ර කිරීම මඟින් නව කවචයක් නිර්මාණය නොවන අතර එමඟින් PID එක සමාන වේ.
ස්ක්රිප්ට් එක මූලාශ්ර කිරීම සහ ක්රියාත්මක කිරීම යන දෙකම ස්ක්රිප්ට් රේඛාවේ විධාන රේඛාවෙන් ක්රියාත්මක කරනු ඇත, ඔබ එම විධානයන් අතින් රේඛාවෙන් ටයිප් කළාක් මෙන්.
වෙනස්කම්:
ඔබගේ දැනට ක්රියාත්මක වන කවචයේ පරිසරය වෙනස් කිරීමට ස්ක්රිප්ටයට අවශ්ය නම් ප්රභවය භාවිතා කරන්න. වෙනත් ආකාරයකින් ක්රියාත්මක කරන්න.
මෙයද බලන්න:
source myscript.sh
සහ අතර වෙනසක් . myscript.sh
තිබේද?
ස්ක්රිප්ටයක් ක්රියාත්මක කිරීමෙන් එය වෙනම ළමා ක්රියාවලියක් තුළ ක්රියාත්මක වේ, එනම්, ස්ක්රිප්ට් සැකසීම සඳහා වෙනමම කවචයක් යෙදේ. මෙයින් අදහස් කරන්නේ ස්ක්රිප්ටයේ අර්ථ දක්වා ඇති ඕනෑම පරිසර විචල්යයන් මව් (වත්මන්) කවචයේ යාවත්කාලීන කළ නොහැකි බවයි.
ස්ක්රිප්ටයක් ඇඹුල් කිරීම යනු එය වර්තමාන කවචය විසින්ම විග්රහ කොට ක්රියාත්මක කරන බවයි. එය හරියට ඔබ පිටපතෙහි අන්තර්ගතය ටයිප් කළාක් මෙනි. මේ හේතුව නිසා, පිටපත උපුටා ගැනීම ක්රියාත්මක කළ යුතු නොවේ. නමුත් ඔබ එය ඇත්ත වශයෙන්ම ක්රියාත්මක කරන්නේ නම් එය ක්රියාත්මක කළ යුතුය.
වත්මන් කවචයේ ස්ථානීය තර්ක තිබේ නම් ඒවා නොවෙනස්ව පවතී.
එබැවින් මා සතුව ගොනුවක් තිබේ නම් a.sh
:
echo a $*
මම කරනවා:
$ set `date`
$ source ./a.sh
මට මේ වගේ දෙයක් ලැබෙනවා:
a Fri Dec 11 07:34:17 PST 2009
ෙකෙසේෙවතත්:
$ set `date`
$ ./a.sh
මට ලබා දෙයි:
a
උපකාරවත් වන බලාපොරොත්තුව.
මූලාශ්රය අත්යාවශ්යයෙන්ම විධාන විමසුමේදී ස්ක්රිප්ටයේ සෑම පේළියක්ම එකවර ටයිප් කිරීමට සමාන වේ ...
ක්රියාත්මක කිරීම නව ක්රියාවලියක් ආරම්භ කර පසුව ස්ක්රිප්ටයේ සෑම පේළියක්ම ක්රියාත්මක කරයි, එය නැවත පැමිණෙන දෙයින් වත්මන් පරිසරය වෙනස් කිරීම පමණි.
ඉහත කරුණු වලට අමතරව, පිටපත ./myscript
ක්රියාත්මක කිරීම සඳහා ලිපිගොනු පිටපතක් සඳහා අවසර ලබා ගත යුතු අතර මූලාශ්රය සඳහා කිසිදු ක්රියාත්මක අවසරයක් අවශ්ය නොවේ. chmod +x myscript
කලින් අවශ්ය නොවන්නේ එබැවිනිsource myscript
bash myscript
.
මූලාශ්රය මඟින් ඔබට පිටපතෙහි අර්ථ දක්වා ඇති සියලුම අතිරේක විචල්යයන් ලැබේ.
එබැවින් ඔබට වින්යාසයන් හෝ ක්රියාකාරී අර්ථ දැක්වීම් තිබේ නම් ඔබ ක්රියාත්මක කළ යුතු නොවේ. මරණ ද utions ුවම දෙමාපියන්ගේ පරිසරයෙන් ස්වාධීන වේ.
මට නිවැරදි යැයි මතක් වුවහොත්, ස්ක්රිප්ට් ක්රියාත්මක කිරීම විධානාවලියක් #!
ලෙස ස්ක්රිප්ට් ගොනුව සමඟ ක්රියාත්මක වේ (සාමාන්යයෙන් නව කවචයක් ආරම්භ කර ස්ක්රිප්ට් නව කවචයට effectively ලදායී ලෙස ලබා ගනී #!/bin/sh
);
එනමුත්, ස්ක්රිප්ට් එක මූලාශ්ර කිරීම මඟින් ඔබේ වත්මන් ෂෙල් පරිසරය තුළ එක් එක් පේළිය ක්රියාත්මක වන අතර එය ඔබගේ වර්තමාන කවචය විකෘති කිරීමට ප්රයෝජනවත් වේ (නිදසුනක් ලෙස, ෂෙල් ක්රියාකාරිත්වය සහ අපනයන පරිසර විචල්යයන් නිර්වචනය කිරීමට ක්රමයක් සපයයි).
source
විධානය ලබා තිර රචනය ඉටු (ක්රියාවෙහි යෙදවිය අවසරය අනිවාර්ය නොවේ ) තුළ වත්මන් අතර, ෂෙල් පරිසරය ./
ඉටු සපයා ක්රියාත්මක දී තිර රචනය නව ෂෙල්.
උදාහරණයක් ලෙස, මෙම පිළිතුර පරීක්ෂා කරන්න: https://superuser.com/a/894748/432100