#! / Bin / sh සහ #! / Bin / bash අතර වෙනස කුමක්ද?


310

මම ලියන්නේ නම්,

#!/bin/bash
echo "foo"

හෝ

#!/bin/sh
echo "foo"

අස්වැන්න දෙකම එක හා සමානයි. මම සමඟ ආරම්භ සමහර පිටපත් දැක ඇති #!/bin/shහෝ #!/bin/bash. ඔවුන් අතර වෙනසක් තිබේද?

Answers:


270

bashහා shදෙක විනඩෝස් වේ. මූලික වශයෙන් bashවේ shවැඩි අංග ලක්ෂණ සහ වඩා හොඳ කාරක රීති සමග. බොහෝ විධාන එකම ලෙස ක්‍රියා කරයි, නමුත් ඒවා වෙනස් වේ.

එසේ පැවසීමෙන් පසු, /bin/shබොහෝ පද්ධතිවල සංකේතාත්මක සම්බන්ධකයක් වනු ඇති බව ඔබ වටහා ගත යුතු අතර එය ක්‍රියාත්මක නොවනු shඇත. උබුන්ටු සමග /bin/shසම්බන්ධ කිරීමට භාවිතා bashLinux බෙදාහැරීම් පිළිබඳ සාමාන්ය හැසිරීම, නමුත් මේ සම්බන්ධ කිරීමට වෙනස් වී ඇත ඩෑෂ් නමින් තවත් ෂෙල් . මම භාවිතා කරන bashබව (මගේ අත්දැකීම් වලින්, හෝ අවම වශයෙන් වඩාත් පොදු) එච්චරමයි සම්මත පරිදි,. ඇත්ත වශයෙන්ම, බාෂ් ස්ක්‍රිප්ට් එකක් භාවිතා කරන විට ගැටලු පැන නගින්නේ #!/bin/shස්ක්‍රිප්ට් සාදන්නා විසින් සබැඳිය තිබිය යුතු bashයැයි උපකල්පනය කරන බැවිනි.

වැඩි විස්තර සඳහා, http://man.cx/sh , http://man.cx/bash .


27
ඔබගේ පළමු ඡේදය තරමක් නොමඟ යවන සුළුය. "sh" යනු කිසිසේත් ෂෙල් එකක් නොවේ, නමුත් දැනට වින්‍යාස කර ඇති පද්ධති කවචයට සමමුහුර්තයක් වන අතර එය ලිනක්ස් පද්ධතිවල සාමාන්‍යයෙන් බාෂ් හෝ ඩෑෂ් වේ (උබුන්ටු හි මෑත අනුවාදයන් භාවිතා කරයි).
thomasrutter

21
/bin/sh1977 දී බෝර්න් ෂෙල් ලෙස හැඳින්වෙන කවචයක් ලෙස භාවිතා කරන ලදී. බාෂ් යනු / බින් / ෂා අනුකූල ෂෙල් එකක් වන අතර එය බෝර්න් ෂෙල් ආදේශකයක් ලෙස භාවිතා කළ හැකි අතර එය පොසික්ස් අනුකූල වේ. en.wikipedia.org/wiki/Bourne_shell
ඇලෙක්ස්

5
bash තත්වාකාර සම්මත (ඉතා පුළුල් ලෙස භාවිතා) නමුත් එය "සම්මත" නොවේ; sh on උබුන්ටු ඩෑෂ් භාවිතා කරයි , එය පොසික්ස් අනුකූල කවචයකි, එබැවින් එය සැබවින්ම සම්මත වේ. මගේ අවවාදය නම් , ස්ක්‍රිප්ට් කිරීම සඳහා, විශේෂයෙන් සේවාදායක පාර්ශවීය ස්ක්‍රිප්ට් සඳහා හැකි සෑම විටම ඉරක් භාවිතා කිරීමයි . නමුත් bash වැඩි ප්රකාශන වන අතර, ඩෑෂ් වේගවත් ගොඩක් දිවෙන හා වඩා ආරක්ෂිත වේ.
රික් -777

@ රික් -777 එබැවින් මම පැහැදිලිවම මගේ ස්ක්‍රිප්ටයේ ඉහළින් #! / Bin / dash දැමිය යුතුද? මම විධාන පමණක් ලියා ./scriptName සමඟ ක්‍රියාත්මක කරන ස්ක්‍රිප්ට් ද ලියා ඇති අතර එය හොඳින් ක්‍රියාත්මක වේ. #! / Bin / yourShellHere අවශ්‍යද?
user137717

@ රික් -777 මම ඕනෑම #! / Bin / shellName බැහැර කරන අවස්ථා වලදී, මම ගොනුව fileName.sh ලෙස නම් කර ඇත්තෙමි. #! / Bin / sh ප්‍රකාශ නොකර එය කැමති පද්ධති කවචයට ව්‍යංගයෙන් සම්බන්ධ වේද?
user137717

88

ලිනක්ස් සහ වෙනත් යුනික්ස් වැනි පද්ධති වල ඔබට බහු ෂෙල් වෙඩි තෝරා ගත හැකිය.

කවචය වගකිව යුත්තේ ඔබේ කුඩා විමසුම ඇඳීමට පමණක් නොව, ඔබේ විධානයන් අර්ථ නිරූපණය කිරීමට ය, විශේෂයෙන් ඔබ පයිප්ප, කොන්දේසි වැනි සංකීර්ණ තර්කනයන් ඉදිරිපත් කරන්නේ නම්.

bash යනු ලිනක්ස් පද්ධති භාවිතා කරන්නන් සඳහා පෙරනිමි කවචයක් ලෙස භාවිතා කරන වඩාත් පොදු කවචයයි. එය යුනික්ස් ඉතිහාසය පුරාම භාවිතා කරන වෙනත් ෂෙල් වෙඩි වලින් ආධ්‍යාත්මිකව පැවත එන්නකි. එහි නම, බාෂ් යනු බෝර්න්-නැවතත් ෂෙල් හි කෙටි යෙදුමකි, එය ප්‍රතිස්ථාපනය කිරීම සඳහා නිර්මාණය කරන ලද බෝර්න් කවචයට උපහාර දැක්වීමකි, නමුත් එය සී ෂෙල් සහ කෝර්න් ෂෙල් වෙතින් අංග ඇතුළත් වේ.

එය ක්‍රියාත්මකයි, මේ දිනවල සිට /bin/bash- බැෂ් සහිත ඕනෑම පද්ධතියකට මෙහි ප්‍රවේශ විය හැකිය.

එය ෂෙල් වෙඩි භාවිතා කරන්නන් පමණක් නොවේ. ස්ක්‍රිප්ට ( ෂෙල් ස්ක්‍රිප්ට් ) ඒවා අර්ථ නිරූපණය කිරීම සඳහා ෂෙල් වෙඩි අවශ්‍ය වේ. ඔබ ෂෙල් ස්ක්‍රිප්ට් එකක් ධාවනය කරන විට, ඔබේ ස්ක්‍රිප්ට් ක්‍රියාත්මක කිරීම සඳහා ඔබේ පද්ධතියට ෂෙල් ක්‍රියාවලියක් ආරම්භ කළ යුතුය.

ගැටළුව වන්නේ, විවිධ ෂෙල් වෙඩි අතර ඉතා කුඩා නොගැලපීම් ඇති අතර, ස්ක්‍රිප්ට් ධාවනය කිරීමේදී මේවා සැබෑ ගැටළුවක් විය හැකිය. bash සතුව ස්ක්‍රිප්ටින් විශේෂාංග රාශියක් ඇත, ඒවා බාෂ් සඳහා පමණක්ම වන අතර අනෙක් ෂෙල් වලට නොවේ. ඔබ සෑම විටම එම ස්ක්‍රිප්ට් ධාවනය කිරීමට බාෂ් භාවිතා කරන්නේ නම් මෙය හොඳයි. වෙනත් ෂෙල් වෙඩි මඟින් බාෂ් අනුකරණය කිරීමට උත්සාහ කළ හැකිය, නැතහොත් පොසික්ස් ප්‍රමිතියට අනුගත විය හැකිය.

ෂෙබාං භාවිතයෙන් එය ක්‍රියාත්මක කළ යුත්තේ කුමන කවචයේද යන්න ෂෙල් ස්ක්‍රිප්ටයේ ඉහළින්ම සඳහන් කළ හැකිය. ස්ක්‍රිප්ටයක් #!/bin/bashපළමු පේළියේ සඳහන් කළ හැකිය , එයින් අදහස් කරන්නේ ස්ක්‍රිප්ට් සෑම විටම වෙනත් කවචයකට වඩා බාෂ් සමඟ ධාවනය කළ යුතු බවයි.

/ bin / sh යනු පද්ධති කවචය නියෝජනය කරන ක්‍රියාත්මක කළ හැකි ය . ඇත්ත වශයෙන්ම, එය සාමාන්‍යයෙන් ක්‍රියාත්මක වන්නේ සංකේතාත්මක සම්බන්ධකයක් ලෙස වන අතර එය ක්‍රියාත්මක කළ හැකි ඕනෑම කවචයක් සඳහා පද්ධති කවචය වේ. පද්ධති කවචය යනු පද්ධති ස්ක්‍රිප්ට් භාවිතා කළ යුතු පෙරනිමි කවචයකි. Linux බෙදාහැරීම් දී, දීර්ඝ කාලයක් තිස්සේ මෙම සාමාන්යයෙන් සංකේතාත්මක පුරුකක් විය bash , මේ තරම් එය තරමක් සෑම විටම සබැඳිය / bin / bash කිරීමට sh හෝ bash-අනුකූල ෂෙල් කිරීමට සමුළුවේ බවට පත් වී ඇති. කෙසේ වෙතත්, පසුගිය වසර කිහිපය තුළ ඩෙබියන් (සහ උබුන්ටු) පද්ධති කවචය බාෂ් සිට ඩෑෂ් වෙත මාරු කිරීමට තීරණය කළහ- ඒ හා සමාන කවචයක් - / bin / sh සඳහා bash භාවිතා කිරීමේ ලිනක්ස් (හොඳින්, GNU) හි දිගු සම්ප්‍රදායක් බිඳ දැමීම. ඩෑෂ් සැහැල්ලු හා වඩා වේගවත් ෂෙල් එකක් ලෙස පෙනේ, එය ආරම්භක වේගය සඳහා ප්‍රයෝජනවත් විය හැකිය (සහ පැකේජ ස්ථාපන ස්ක්‍රිප්ට් වැනි ෂෙල් ස්ක්‍රිප්ට් විශාල ප්‍රමාණයක් අවශ්‍ය වන වෙනත් දේ).

ඩෑෂ් එකම පොසික්ස් ප්‍රමිතිය මත පදනම්ව, බාෂ් සමඟ තරමක් හොඳින් අනුකූල වේ. කෙසේ වෙතත්, එය බාෂ්-විශේෂිත දිගු ක්‍රියාත්මක නොකරයි. #!/bin/sh(පද්ධති කවචය) ඒවායේ ෂෙබාං ලෙස භාවිතා කරන ස්ක්‍රිප්ට් පවතී , නමුත් ඒවාට විශේෂිත විස්තාරණ අවශ්‍ය වේ. මෙය දැනට ඩෙබියන් සහ උබුන්ටු විසින් නිවැරදි කළ යුතු දෝෂයක් ලෙස සලකනු ලබන අතර, ඉරක් පෙන්වා ඇති විට වැඩ කිරීමට / bin / sh අවශ්‍ය වේ.

උබුන්ටු හි පද්ධති කවචය ඉරක් වෙතට යොමු වුවද, පරිශීලකයෙකු ලෙස ඔබගේ පිවිසුම් කවචය මේ අවස්ථාවේ දී අඛණ්ඩව පවතී. එනම්, ඔබ ලිනක්ස් හි ඕනෑම තැනක ටර්මිනල් ඉමුලේටරයකට පිවිසෙන විට, ඔබේ පිවිසුම් කවචය කඩාවැටෙනු ඇත. කවචය අන්තර්ක්‍රියාකාරීව භාවිතා කරන විට මෙහෙයුම් වේගය එතරම් ගැටළුවක් නොවන අතර පරිශීලකයින් බැෂ් ගැන හුරුපුරුදුය (සහ ඔවුන්ගේ නිවාස නාමාවලියෙහි විශේෂිත රිසිකරණයන් තිබිය හැක).

ස්ක්‍රිප්ට් ලිවීමේදී ඔබ භාවිතා කළ යුතු දේ

ඔබගේ ස්ක්‍රිප්ටයට අවශ්‍ය වන්නේ විශේෂාංග පමණක් වන අතර එය භාවිතා කරන්න #!/bin/bash.

නමුත් හැකි නම්, ඔබේ ස්ක්‍රිප්ට් POSIX- අනුකූලද යන්න තහවුරු කර ගැනීම හොඳය, තවද භාවිතා කිරීම #!/bin/sh, සෑම විටම, තරමක් විශ්වාසදායක ලෙස, ඕනෑම ස්ථාපනයකදී කැමති POSIX- අනුකූල පද්ධති කවචයට යොමු කළ යුතුය.


21

පෙර පිළිතුරු වලට අමතරව, /bin/shසංකේතාත්මක සබැඳියක් වුවද /bin/bash, #!/bin/shඑය සම්පූර්ණයෙන්ම සමාන නොවේ #!/bin/bash.

සිට bash (1) man පිටුව :

"Sh යන නාමයෙන් බැෂ් ආයාචනා කරන්නේ නම්, එය POSIX ප්‍රමිතියට අනුකූල වන අතරම sh හි historical තිහාසික අනුවාදයන්ගේ ආරම්භක හැසිරීම හැකි තරම් සමීපව අනුකරණය කිරීමට උත්සාහ කරයි."

උදාහරණයක් ලෙස bash විශේෂිත වාක්‍ය ඛණ්ඩය:

 exec  > >(tee logfile.txt)

#!/bin/shsh-> bash සංකේතාත්මක සබැඳිය සමඟ පවා ආරම්භ වන කවචයක දෝෂයක් ලබා දෙයි .


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.