Bash ස්ක්‍රිප්ට් එකක් එදිරිව ක්‍රියාත්මක කිරීම අතර ඇති වෙනස කුමක්ද?


315

A වැනි Bash ස්ක්‍රිප්ට් එකක් ක්‍රියාත්මක කිරීම සහ B වැනි Bash ස්ක්‍රිප්ට් එකක් ලබා ගැනීම අතර ඇති වෙනස කුමක්ද?

A
> ./myscript

B
> source myscript

ඔබට මෙය කියවිය හැකිය: bash.cyberciti.biz/guide/Source_command
ERU

Answers:


389

ස්ක්‍රිප්ටයක් උපුටා ගැනීම වත්මන් ෂෙල් ක්‍රියාවලියේ විධාන ක්‍රියාත්මක කරයි.

ක්රියාත්මක වන කේත රචනය තුල විධානයන් ක්රියාත්මක කරනු ඇත නව ෂෙල් ක්රියාවලිය.

ඔබගේ දැනට ක්‍රියාත්මක වන කවචයේ පරිසරය වෙනස් කිරීමට ස්ක්‍රිප්ටයට අවශ්‍ය නම් ප්‍රභවය භාවිතා කරන්න. වෙනත් ආකාරයකින් ක්‍රියාත්මක කරන්න.

ඔබ තවමත් ව්‍යාකූල නම්, කරුණාකර කියවන්න.

පාරිභාෂිතය

ක්‍රියාත්මක කිරීමට වාක්‍ය ඛණ්ඩය සහ ප්‍රභවයට ඇති වාක්‍ය ඛණ්ඩය පිළිබඳ පොදු ව්‍යාකූලතා පැහැදිලි කිරීම සඳහා:

./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 එක සමාන වේ.

සාරාංශය

ස්ක්‍රිප්ට් එක මූලාශ්‍ර කිරීම සහ ක්‍රියාත්මක කිරීම යන දෙකම ස්ක්‍රිප්ට් රේඛාවේ විධාන රේඛාවෙන් ක්‍රියාත්මක කරනු ඇත, ඔබ එම විධානයන් අතින් රේඛාවෙන් ටයිප් කළාක් මෙන්.

වෙනස්කම්:

  • ඔබ නව කවචයක් විවෘත කරන ස්ක්‍රිප්ට් එක ක්‍රියාත්මක කරන විට , නව කවචයේ විධාන ටයිප් කරන්න, ප්‍රතිදානය ඔබගේ වත්මන් කවචයට පිටපත් කර නව කවචය වසා දමන්න. පරිසරයේ සිදුවන ඕනෑම වෙනස්කමක් ක්‍රියාත්මක වන්නේ නව කවචය තුළ පමණක් වන අතර නව කවචය වසා දැමූ පසු එය නැති වී යයි.
  • ඔබ ස්ක්‍රිප්ට් එක ප්‍රභව කරන විට ඔබ ඔබේ වර්තමාන කවචයේ විධාන ටයිප් කරයි . පරිසරයේ සිදුවන ඕනෑම වෙනස්කමක් බලාත්මක වන අතර ඔබගේ වර්තමාන කවචයේ රැඳෙනු ඇත.

ඔබගේ දැනට ක්‍රියාත්මක වන කවචයේ පරිසරය වෙනස් කිරීමට ස්ක්‍රිප්ටයට අවශ්‍ය නම් ප්‍රභවය භාවිතා කරන්න. වෙනත් ආකාරයකින් ක්‍රියාත්මක කරන්න.


මෙයද බලන්න:


2
මූලාශ්‍රයේ එක් භාවිතයක් වන්නේ ඔබේ ස්ක්‍රිප්ට් සඳහා මූලික වින්‍යාස ගොනුවක් නිර්මාණය කිරීමයි. ඔබ විවිධ විචල්‍යයන් පෙරනිමි අගයන්ට සැකසීමෙන් ආරම්භ කර, පසුව myscript.conf වැනි දෙයකින් මූලාශ්‍රය ලබා ගත හැකිය - තවද එම මූලාශ්‍ර පිටපතට ඔබට අවශ්‍ය ඕනෑම අගයක් අභිබවා යන පැවරුම් ප්‍රකාශ තිබිය හැකිය. මූලාශ්‍ර පිටපත # / bin / bash වලින් ආරම්භ නොවන බැවින් එය කෙලින්ම ක්‍රියාත්මක කිරීමට දිරිගන්වනු නොලැබේ.
ලෝරන්ස් සී

එබැවින් ප්‍රභවය එය ගෝලීය විෂය පථයක් තුළ ක්‍රියාත්මක කිරීම හා සමාන වන අතර ක්‍රියාත්මක කිරීම නව දේශීය විෂය පථයක් නිර්මාණය කරයි. මෙය ස්ක්‍රිප්ට් එකක ශ්‍රිතයක් දක්වා විහිදිය හැකිද? ශ්‍රිතයක් ක්‍රියාත්මක කිරීමට (සාමාන්‍යයෙන්) හෝ එය “ප්‍රභව” කිරීමටද?
aliteralmind

3
භාවිතා කිරීම source myscript.shසහ අතර වෙනසක් . myscript.shතිබේද?
හොලොවේ

3
bash භාවිතා කරන්නේ නම් ප්‍රායෝගිකව වෙනසක් නැත. ප්‍රභවය යනු තිත් තිත් කිරීමට අන්වර්ථයකි.
lesmana

2
මා වැනි ලිනක්ස් නවකයින්ට පවා තේරුම් ගත හැකි වන පරිදි මිනිසුන් එවැනි විස්තීර්ණ උදාහරණ සපයන විට මම එයට කැමතියි. ස්තූතියි!
ජුලියස්

23

ස්ක්‍රිප්ටයක් ක්‍රියාත්මක කිරීමෙන් එය වෙනම ළමා ක්‍රියාවලියක් තුළ ක්‍රියාත්මක වේ, එනම්, ස්ක්‍රිප්ට් සැකසීම සඳහා වෙනමම කවචයක් යෙදේ. මෙයින් අදහස් කරන්නේ ස්ක්‍රිප්ටයේ අර්ථ දක්වා ඇති ඕනෑම පරිසර විචල්‍යයන් මව් (වත්මන්) කවචයේ යාවත්කාලීන කළ නොහැකි බවයි.

ස්ක්‍රිප්ටයක් ඇඹුල් කිරීම යනු එය වර්තමාන කවචය විසින්ම විග්‍රහ කොට ක්‍රියාත්මක කරන බවයි. එය හරියට ඔබ පිටපතෙහි අන්තර්ගතය ටයිප් කළාක් මෙනි. මේ හේතුව නිසා, පිටපත උපුටා ගැනීම ක්‍රියාත්මක කළ යුතු නොවේ. නමුත් ඔබ එය ඇත්ත වශයෙන්ම ක්‍රියාත්මක කරන්නේ නම් එය ක්‍රියාත්මක කළ යුතුය.

වත්මන් කවචයේ ස්ථානීය තර්ක තිබේ නම් ඒවා නොවෙනස්ව පවතී.

එබැවින් මා සතුව ගොනුවක් තිබේ නම් a.sh:

echo a $*

මම කරනවා:

$ set `date`
$ source ./a.sh

මට මේ වගේ දෙයක් ලැබෙනවා:

a Fri Dec 11 07:34:17 PST 2009

ෙකෙසේෙවතත්:

$ set `date`
$ ./a.sh

මට ලබා දෙයි:

a

උපකාරවත් වන බලාපොරොත්තුව.


5
මෙම පිළිතුර සෑම ආකාරයකින්ම නිවැරදි වුවත්, එය වෙනත් සංකල්පයක් (ස්ථානීය පරාමිතීන් සැකසීම) භාවිතා කර නිරූපණය කර ඇති හෙයින් එය තේරුම් ගැනීම මට අපහසුය.
lesmana

9

මූලාශ්‍රය අත්‍යාවශ්‍යයෙන්ම විධාන විමසුමේදී ස්ක්‍රිප්ටයේ සෑම පේළියක්ම එකවර ටයිප් කිරීමට සමාන වේ ...

ක්‍රියාත්මක කිරීම නව ක්‍රියාවලියක් ආරම්භ කර පසුව ස්ක්‍රිප්ටයේ සෑම පේළියක්ම ක්‍රියාත්මක කරයි, එය නැවත පැමිණෙන දෙයින් වත්මන් පරිසරය වෙනස් කිරීම පමණි.


6

ඉහත කරුණු වලට අමතරව, පිටපත ./myscriptක්‍රියාත්මක කිරීම සඳහා ලිපිගොනු පිටපතක් සඳහා අවසර ලබා ගත යුතු අතර මූලාශ්‍රය සඳහා කිසිදු ක්‍රියාත්මක අවසරයක් අවශ්‍ය නොවේ. chmod +x myscriptකලින් අවශ්‍ය නොවන්නේ එබැවිනිsource myscript


2
ඇත්ත, නමුත් එය ගැටලුවක් නම්, ඔබට සැමවිටම ධාවනය කළ හැකිය bash myscript.
ඩැනියෙල් බෙක්

5

මූලාශ්‍රය මඟින් ඔබට පිටපතෙහි අර්ථ දක්වා ඇති සියලුම අතිරේක විචල්‍යයන් ලැබේ.
එබැවින් ඔබට වින්‍යාසයන් හෝ ක්‍රියාකාරී අර්ථ දැක්වීම් තිබේ නම් ඔබ ක්‍රියාත්මක කළ යුතු නොවේ. මරණ ද utions ුවම දෙමාපියන්ගේ පරිසරයෙන් ස්වාධීන වේ.


3

මට නිවැරදි යැයි මතක් වුවහොත්, ස්ක්‍රිප්ට් ක්‍රියාත්මක කිරීම විධානාවලියක් #!ලෙස ස්ක්‍රිප්ට් ගොනුව සමඟ ක්‍රියාත්මක වේ (සාමාන්‍යයෙන් නව කවචයක් ආරම්භ කර ස්ක්‍රිප්ට් නව කවචයට effectively ලදායී ලෙස ලබා ගනී #!/bin/sh);
එනමුත්, ස්ක්‍රිප්ට් එක මූලාශ්‍ර කිරීම මඟින් ඔබේ වත්මන් ෂෙල් පරිසරය තුළ එක් එක් පේළිය ක්‍රියාත්මක වන අතර එය ඔබගේ වර්තමාන කවචය විකෘති කිරීමට ප්‍රයෝජනවත් වේ (නිදසුනක් ලෙස, ෂෙල් ක්‍රියාකාරිත්වය සහ අපනයන පරිසර විචල්‍යයන් නිර්වචනය කිරීමට ක්‍රමයක් සපයයි).


2

sourceවිධානය ලබා තිර රචනය ඉටු (ක්රියාවෙහි යෙදවිය අවසරය අනිවාර්ය නොවේ ) තුළ වත්මන් අතර, ෂෙල් පරිසරය ./ඉටු සපයා ක්රියාත්මක දී තිර රචනය නව ෂෙල්.

උදාහරණයක් ලෙස, මෙම පිළිතුර පරීක්ෂා කරන්න: https://superuser.com/a/894748/432100

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.