Answers:
export
විචල්යය උප ක්රියාවලි සඳහා ලබා දෙයි.
එනම්,
export name=value
එම ෂෙල් ක්රියාවලියෙන් ඔබ ක්රියාත්මක වන ඕනෑම ක්රියාවලියකට විචල්ය නාමය ලබා ගත හැකි බව අදහස් වේ. ඔබට මෙම විචල්යය භාවිතා කිරීමට ක්රියාවලියක් අවශ්ය නම්, එම කවචයෙන් ක්රියාවලිය භාවිතා කරන්න export
.
name=value
විචල්ය විෂය පථය කවචයට පමණක් සීමා වී ඇති අතර එය වෙනත් ක්රියාවලියකට ලබා ගත නොහැක. ඔබ මෙය (කියන්න) ලූප් විචල්යයන්, තාවකාලික විචල්යයන් සඳහා භාවිතා කරනු ඇත.
විචල්යයක් අපනයනය කිරීමෙන් එය මව් ක්රියාවලි සඳහා ලබා ගත නොහැකි බව සැලකිල්ලට ගැනීම වැදගත්ය. එනම්, විචල්ය ක්රියාවලියක් තුළ විචල්යයක් නියම කිරීම සහ අපනයනය කිරීම එය දියත් කළ ක්රියාවලිය තුළ එය ලබා ගත නොහැක.
name=value command
කරන්නේ උප ක්රියාවලිය තුළ විචල්ය ලබා ගත හැකි බවට command
.
තවත් සමහරු පිළිතුරු දී ඇත්තේ අපනයනය මඟින් විචල්යය උපසෙල් වලට ලබා ගත හැකි වන අතර එය නිවැරදි නමුත් හුදෙක් අතුරු ආබාධයකි. ඔබ විචල්යයක් අපනයනය කරන විට, එය එම විචල්යය වත්මන් කවචයේ පරිසරයට දමයි (එනම් ෂෙල් ඇමතුම් putenv(3)
හෝ setenv(3)
).
ක්රියාවලියක පරිසරය ක්රියාත්මක වන විට උරුම වී ඇති අතර විචල්යය උප කුලකවල දෘශ්යමාන වේ.
සංස්කරණය කරන්න (අවුරුදු 5 ක ඉදිරිදර්ශනයකින්): මෙය මෝඩ පිළිතුරකි. 'අපනයනය' හි පරමාර්ථය වන්නේ විචල්යයන් “පසුව ක්රියාත්මක කරන ලද විධානවල පරිසරය තුළ” තිබීමයි, එම විධානයන් උප-ෂෙල් හෝ උපප්රොසෙස් වේවා. බොළඳ ක්රියාවට නැංවීම යනු විචල්යය කවචයේ පරිසරය තුළ තැබීමයි, නමුත් මෙය ක්රියාත්මක කිරීමට නොහැකි වනු export -p
ඇත.
bash
, අපනයනය ඇත්ත වශයෙන්ම වත්මන් කවචයේ පරිසරයට විචල්යය එක් කරයි, නමුත් මෙය එසේ නොවේ dash
. වර්තමාන කවචයේ පරිසරයට විචල්යය එකතු කිරීම අර්ථ නිරූපණය ක්රියාත්මක කිරීමට ඇති සරලම ක්රමය බව මට පෙනේ export
, නමුත් එම හැසිරීම අනිවාර්ය නොවේ.
dash
. මුල් පෝස්ටරය ගැන විශේෂයෙන් විමසීය bash
.
bash
නමුත් ඕනෑම බෝර්න්-ෂෙල් ප්රභේදයකට සමානව අදාළ වේ. ඕනෑවට වඩා නිශ්චිතව සිටීම සහ ඒවාට පමණක් පිළිතුරු සපයන පිළිතුරු සැපයීම bash
විශාල නපුරකි.
bash
යනු කවචයේ jQuery ය.
export makes the variable available to subshells, and that is correct
මෙය පාරිභාෂිතය ඉතා ව්යාකූල භාවිතයකි. උපසෙල් export
වලට විචල්යයන් උරුම කර ගැනීමට අවශ්ය නොවේ . උපසිරැසි සිදු කරයි.
උපසිරැසි නිපදවීමේදී කඩිනමින් අපනයනය කිරීම අවශ්ය නොවන බව පවසා ඇති අතර අනෙක් අය පැවසුවේ ඊට ප්රතිවිරුද්ධ දෙයයි. එය උපකවච (විසින් නිර්මාණය කරන බව එම අතර වෙනස සටහන් කිරීම වැදගත් වේ ()
, ``
, $()
හෝ වළළු) සහ subprocesses (නම උලුප්පා දක්වන ක්රියාවලිය, උදාහරණයක් ප්රායෝගික bash
ඔබේ තිර රචනය දැක්ෙවන).
මෙම ඉදිකිරීම් දෙකෙහි පොදු දෙය නම් විචල්යයන් දෙකටම මව් කවචයට යැවිය නොහැකි වීමයි.
$ noexport=noexport; export export=export; (echo subshell: $noexport $export; subshell=subshell); bash -c 'echo subprocess: $noexport $export; subprocess=subprocess'; echo parent: $subshell $subprocess
subshell: noexport export
subprocess: export
parent:
තවත් ව්යාකූල ප්රභවයක් තිබේ: සමහරු සිතන්නේ අපනයනය නොකරන ලද විචල්යයන් නොපෙනෙන 'දෙබලක' උප සැකසුම් බවයි. සාමාන්යයෙන් දෙබලක () s වහාම ක්රියාත්මක වන්නේ exec () s වන අතර, ඒ නිසා දෙබලක () සෙවිය යුතු දෙය බව පෙනේ, ඇත්ත වශයෙන්ම එය ක්රියාත්මක වන්නේ () ය. පළමුවෙන්ම exec
විධානය සමඟ දෙබලකින් තොරව විධාන ධාවනය කළ හැකි අතර , මෙම ක්රමය මඟින් ආරම්භ කරන ලද ක්රියාවලි වලට අපනයනය නොකළ විචල්යයන් සඳහා ප්රවේශයක් නොමැත:
$ noexport=noexport; export export=export; exec bash -c 'echo execd process: $noexport $export; execd=execd'; echo parent: $execd
execd process: export
අපි parent:
මේ වතාවේ පේළිය නොදකින බව සලකන්න , මන්ද අපි මව් කවචය විධාන සමඟ ප්රතිස්ථාපනය කර ඇති බැවින් exec
එම විධානය ක්රියාත්මක කිරීමට කිසිවක් ඉතිරිව නැත.
&
) ද උප කුලකයක් නිර්මාණය කරයි.
var=asdf bash -c 'echo $var'
හෝ var=asdf exec bash -c 'echo $var'
? ප්රතිදානය වේ asdf
. මෙම ;
විචල්ය නිර්වචනය පසු තබා නම් වෙනසක්. පැහැදිලි කිරීම කුමක් ද? පෙනෙන ආකාරයට var
(නැත ;
) කෙසේ හෝ බිහි වූ උපසිරැසිය සම්බන්ධයෙන්, මූලාරම්භක කවචය නිසා එයට කිසිදු සම්බන්ධයක් නැත. echo $var
දෙවන පේළියේ ක්රියාත්මක කරන්නේ නම් කිසිවක් මුද්රණය නොකරයි. නමුත් එක් පේළියක් var=asdf bash -c 'echo $var'; echo $var
ලබා දෙයි asdf\nasdf
.
export NAME=value
උප ක්රියාවලියකට අර්ථයක් ඇති සැකසුම් සහ විචල්යයන් සඳහා.
NAME=value
වත්මන් ෂෙල් ක්රියාවලියට පෞද්ගලික තාවකාලික හෝ ලූප් විචල්යයන් සඳහා.
වඩාත් විස්තරාත්මකව, export
පරිසරයේ විචල්ය නාමයක් උපසිරැසියකට පිටපත් කරන අතර ඒවායේ නිර්මානය කිරීමෙන් පසු ඒවායේ උපසිරැසි සලකුණු කරයි. උප ක්රියාවලියෙන් කිසිඳු නමක් හෝ වටිනාකමක් නැවත පිටපත් නොකෙරේ.
පොදු දෝෂයක් වන්නේ සමාන ලකුණ වටා ඉඩක් තැබීමයි:
$ export FOO = "bar"
bash: export: `=': not a valid identifier
අපනයනය කළ විචල්යය ( B
) පමණක් උප ක්රියාවලිය මඟින් දැකිය හැකිය:
$ A="Alice"; export B="Bob"; echo "echo A is \$A. B is \$B" | bash
A is . B is Bob
උප ක්රියාවලියෙහි වෙනස්වීම් ප්රධාන කවචය වෙනස් නොකරයි:
$ export B="Bob"; echo 'B="Banana"' | bash; echo $B
Bob
අපනයනය සඳහා සලකුණු කර ඇති විචල්යයන්ට උපප්රොසෙස් නිර්මාණය කරන විට පිටපත් කළ අගයන් ඇත:
$ export B="Bob"; echo '(sleep 30; echo "Subprocess 1 has B=$B")' | bash &
[1] 3306
$ B="Banana"; echo '(sleep 30; echo "Subprocess 2 has B=$B")' | bash
Subprocess 1 has B=Bob
Subprocess 2 has B=Banana
[1]+ Done echo '(sleep 30; echo "Subprocess 1 has B=$B")' | bash
අපනයනය කරන ලද විචල්යයන් පමණක් පරිසරයේ කොටසක් බවට පත්වේ ( man environ
):
$ ALICE="Alice"; export BOB="Bob"; env | grep "ALICE\|BOB"
BOB=Bob
ඉතින්, දැන් එය ගිම්හානයේ හිරු මෙන් පැහැදිලි විය යුතුය! මොළයේ ඇග්නිව්, ඇලෙක්ස්ප් සහ විලියම් ප්රුසෙල්ට ස්තූතියි.
ඔබට විචල්යයක් අපනයනය කර පසුව අගය වෙනස් කළ හැකි බව සැලකිල්ලට ගත යුතුය. විචල්යයේ වෙනස් කළ අගය ළමා ක්රියාවලි සඳහා ලබා ගත හැකිය. විචල්යයක් සඳහා අපනයනය සැකසූ පසු export -n <var>
, දේපල ඉවත් කිරීම සඳහා ඔබ කළ යුතුය .
$ K=1
$ export K
$ K=2
$ bash -c 'echo ${K-unset}'
2
$ export -n K
$ bash -c 'echo ${K-unset}'
unset
ඔබ දැනටමත් දන්නා පරිදි, යුනික්ස් විසින් ක්රියාදාමයන්ට යතුරු / අගය යුගල වන පාරිසරික විචල්යයන් සමූහයක් තබා ගැනීමට ඉඩ දෙයි. එක් එක් ක්රියාවලිය සඳහා මෙම යුගල වෙන වෙනම තබා ගැනීම මෙහෙයුම් පද්ධතියේ වගකීම වේ.
මෙම යුනික්ස් API හරහා වැඩසටහනට එහි පරිසර විචල්යයන්ට ප්රවේශ විය හැකිය:
char *getenv(const char *name);
int setenv(const char *name, const char *value, int override);
int unsetenv(const char *name);
ක්රියාවලි මගින් මව් ක්රියාවලි වලින් පරිසර විචල්යයන් උරුම වේ. ළමා ක්රියාවලිය නිර්මාණය කරන මොහොතේම සියළුම “එන්වර්” වල පිටපතක් නිර්මාණය කිරීම මෙහෙයුම් පද්ධතියේ වගකීම වේ.
Bash , වෙනත් ෂෙල් වෙඩි අතර, පරිශීලක ඉල්ලීම මත එහි පරිසර විචල්යයන් සැකසීමට හැකියාව ඇත. මේ මොකක්ද export
සඳහා පවතී.
export
යනු Bash සඳහා පරිසර විචල්යය සැකසීම සඳහා වන Bash විධානයකි. මෙම විධානය සමඟ සකසා ඇති සියලුම විචල්යයන් මෙම බෑෂ් විසින් නිර්මාණය කරන සියලුම ක්රියාවලීන්ගෙන් උරුම වේ.
බෑෂ් හි පරිසරය පිළිබඳ වැඩි විස්තර
Bash හි තවත් ආකාරයක විචල්යයක් වන්නේ අභ්යන්තර විචල්යයයි. Bash හුදෙක් අන්තර්ක්රියාකාරී කවචයක් නොවන බැවින් එය ඇත්ත වශයෙන්ම ස්ක්රිප්ට් පරිවර්තකයෙකි, වෙනත් ඕනෑම පරිවර්තකයෙකු මෙන් (උදා: පයිතන්) එයට තමන්ගේම විචල්යයන් සමූහයක් තබා ගැනීමට හැකියාව ඇත. Bash (Python මෙන් නොව) සහය දක්වන්නේ සංගීත විචල්යයන්ට පමණක් බව සඳහන් කළ යුතුය.
Bash විචල්යයන් අර්ථ දැක්වීම සඳහා අංකනය වේ name=value
. මෙම විචල්යයන් Bash තුළ රැඳී ඇති අතර මෙහෙයුම් පද්ධතිය විසින් තබා ඇති පරිසර විචල්යයන් සමඟ කිසිදු සම්බන්ධයක් නොමැත.
ෂෙල් පරාමිතීන් පිළිබඳ තවත් (විචල්යයන් ඇතුළුව)
Bash විමර්ශන අත්පොතට අනුව එය ද සඳහන් කිරීම වටී:
ෂෙල් පරාමිතීන්හි විස්තර කර ඇති පරිදි ඕනෑම සරල විධානයක් හෝ ශ්රිතයක් සඳහා වන පරිසරය තාවකාලිකව පරාමිති පැවරුම් සමඟ උපසර්ග කිරීමෙන් වැඩි දියුණු කළ හැකිය . මෙම පැවරුම් ප්රකාශයන් බලපාන්නේ එම විධානය මඟින් දකින පරිසරයට පමණි.
දේවල් සාරාංශ කිරීමට:
export
මෙහෙයුම් පද්ධතියේ පරිසර විචල්යය සැකසීමට භාවිතා කරයි. මෙම විචල්යය වර්තමාන බාෂ් ක්රියාවලිය මගින් නිර්මාණය කරන ලද සියලුම ළමා ක්රියාවලීන් සඳහා ලබා ගත හැකිය.A="string"
ඇත්ත වශයෙන්ම සමාන වේ A[0]="string"
. ඇත්ත වශයෙන්ම, පැවසීමෙන් පසු A="string"
, ඔබට තවත් නූල් 1-පෙළ අරාව සමඟ සංයුක්ත කළ හැකිය A[1]="string2"
, A+=(string3 string4 "string 5 is longer")
පසුව echo "${A[@]}"
ඒවා මුද්රණය කරන්න. printf
පෙරනිමිය අවකාශයක් වන අතර string5 හි අවකාශයන් ඇති බැවින් නූල් අතර යම් ආකාරයක පරිසීමකයක් ලබා ගැනීම සඳහා විධානයකට අරාව පෝෂණය කිරීම වැනි දෙයක් අවශ්ය බව සලකන්න .
export a b; a=this; b[0]=that; env | grep ^[ab]
සමාන නොවේ. සී / සී ++ / ජාවා හි float
සහ සමහර අවස්ථාවන්හි double
එකිනෙකට හුවමාරු කළ හැකි නමුත් ඒවා තවමත් වෙනස් වර්ග වේ.
මෙම පිළිගත් පිළිතුර මේ මඟින්, නමුත් මම ෂෙල් builtins ම පැහැදිලි ඇති සම්බන්ධය ගැනීමට කැමතියි:
දැනටමත් සඳහන් කර ඇති පරිදි, export
කවචයට හා ළමයින්ට විචල්යයක් ලබා දෙනු ඇත. නම් export
වේ නොහැකි භාවිතා, විචල්ය පමණක් ෂෙල් ලබාගත හැකි වනු ඇත, සහ එකම ශෙලය builtins එය පිවිසිය හැකිය.
එනම්,
tango=3
env | grep tango # prints nothing, since env is a child process
set | grep tango # prints tango=3 - "type set" shows `set` is a shell builtin
යුනික්ස් හි නිර්මාතෘවරුන් දෙදෙනෙකු වන බ්රයන් කර්නිගන් සහ රොබ් පයික් ඔවුන්ගේ “යුනික්ස් ක්රමලේඛන පරිසරය” නම් පොතේ මෙය පැහැදිලි කරයි. මාතෘකාව සඳහා ගූගල් සහ ඔබට පහසුවෙන් පීඩීඑෆ් අනුවාදයක් සොයාගත හැකිය.
ඔවුන් 3.6 වගන්තියේ ෂෙල් විචල්යයන් ආමන්ත්රණය කරන export
අතර එම කොටසේ අවසානයේ විධානය භාවිතා කිරීම කෙරෙහි අවධානය යොමු කරයි :
ඔබට විචල්යයක වටිනාකම උප කවච වලින් ප්රවේශ විය හැකි විට, කවචයේ අපනයන විධානය භාවිතා කළ යුතුය. (විචල්යයක වටිනාකම උප කවචයක සිට එහි මවුපියන්ට අපනයනය කිරීමට ක්රමයක් නැත්තේ මන්දැයි ඔබ සිතනු ඇත).
මෙන්න තවත් උදාහරණයක්:
VARTEST="value of VARTEST"
#export VARTEST="value of VARTEST"
sudo env | grep -i vartest
sudo echo ${SUDO_USER} ${SUDO_UID}:${SUDO_GID} "${VARTEST}"
sudo bash -c 'echo ${SUDO_USER} ${SUDO_UID}:${SUDO_GID} "${VARTEST}"'
අපනයන VARTEST භාවිතා කිරීමෙන් පමණක් VARTEST හි අගය ලබා ගත හැක්කේ sudo bash -c '...'!
වැඩි විස්තර සඳහා බලන්න:
bash-hackers.org/wiki/doku.php/scripting/processtree
අපනයනය කරන ලද විචල්යයක් පරිසරයේ (env) සහ අපනයනය නොකරන ලද විචල්යයක් පරිසරයේ නොමැති අතර වෙනස පෙන්වීමට:
මම මෙය කරන්නේ නම්:
$ MYNAME=Fred
$ export OURNAME=Jim
env හි දිස්වන්නේ $ OURNAME පමණි. විචල්යය $ MYNAME env හි නොමැත.
$ env | grep NAME
OURNAME=Jim
නමුත් විචල්යය $ MYNAME කවචයේ පවතී
$ echo $MYNAME
Fred
සාකච්ඡාවේ පැහැදිලිව සඳහන් කර නොතිබුණද, සියලු විචල්යයන් ළමා ක්රියාවලියට පිටපත් කර ඇති බැවින් ඇතුළත බෑෂ් එකෙන් උපසිරැසියක් ලබා ගැනීමේදී අපනයනය භාවිතා කිරීම අවශ්ය නොවේ.
export name=value
අතේ ගෙන යා නොහැකි බව ස්පර්ශක ලෙස සටහන් කරන්න . ඔබට අවශ්ය දේ මත පදනම්ව,name=value; export name
අතේ ගෙන යා හැකි විසඳුමක් සඳහා උත්සාහ කරන්න .