වඩා හොඳ කුමන: භාවිතා කිරීම; හෝ && එක් පේළියක බහු විධාන ක්‍රියාත්මක කිරීමට?


477

නිබන්ධන සහ කෙසේද-කෙසේද යන්න බොහෝ විට විධාන ඒකාබද්ධව මම දකිමි. උදාහරණයක් වශයෙන්,

sudo apt-get update && sudo apt-get install pyrenamer

හැකි සම්බන්ධක හතර බව පෙනීයයි: &, &&, ||සහ ;. ක් වුවත් & සම්බන්ධකය මට පැහැදිලි ය (එය පසුබිම සහ කොළ ලබා ගත හැකි මෙම පර්යන්තය වෙත ක්රියාවලිය යවයි), එය වෙනස අතර දේ පැහැදිලි නැත &&හා ;. ||කායාගේ ප්‍රකාශය තෙක් මම දැන සිටියේ නැත .

පහත සඳහන් ප්‍රශ්න සම්බන්ධක දෙක අතර වෙනස සමඟ කටයුතු කරයි, නමුත් බොහෝ විට අදහස් දැක්වීමේදී එසේ කරන්න:

එබැවින් අදාළ ප්‍රශ්න ගණනාවක් මෙන්න:

  1. ;සහ අතර ඇති වෙනස &&කුමක්ද?
  2. ඔබ ඒවා පිළිවෙලින් භාවිතා කළ යුත්තේ කවදාද ? සමහර භාවිත අවස්ථා දැකීම සතුටක් වනු ඇත: මට විධානයක් ක්‍රියාත්මක කිරීමට අවශ්‍ය නම් සහ එය මගේ පරිගණකය වසා දැමූ පසු, මා තෝරා ගත යුත්තේ කුමන සම්බන්ධකයද?
  3. ඒවායේ වාසි සහ අන්තරායන් මොනවාද? නිදසුනක් ලෙස විධාන දාමයේ පළමු අංගය අසමත් වුවහොත් වැනි විධානයක් විනාශකාරී ප්‍රතිවිපාක ගෙන දිය හැකි බව රොබී බාසාක් මෙම පිළිතුරට අදහස් දක්වමින් සඳහන් කරයි cd /somewhere_else; rm -Rf *.
  4. අදාළ නම්, ඔවුන් පැමිණෙන්නේ කොහෙන්ද?

7
ඔබට හමු නොවූ තවත් සම්බන්ධකයක් තිබේ: ||එය සමාන &&වන්නේ එය දෙවන විධානය ක්‍රියාත්මක කරන්නේ පළමු ශුන්‍ය ශුන්‍ය නොවන (අසාර්ථක) තත්වයෙන් ඉවත් වුවහොත් පමණි.
කායා

4
ඔබගේ විධානාවලිය සමඟ ධාවනය කිරීමෙන් set -eසියලු විධාන සම්බන්ධ වී ඇති ආකාරයට ස්ක්‍රිප්ට් අසාර්ථක වනු ඇති බව සලකන්න &&.
choroba


3
Qn 4 ට කිසිවෙකු පිළිතුරු දුන්නේ නැත ... && සහ || සී ක්‍රමලේඛන භාෂාවෙන් දේවානුභාවයෙන්. (X && y) සම්බන්ධයෙන් ගත් කල, x අසත්‍යය ලෙස තක්සේරු කරන්නේ නම්, මුළු ප්‍රකාශනයම අසත්‍ය විය යුතුය, එබැවින් සම්පාදකයෙකුට y තක්සේරු කිරීම ප්‍රශස්ත කළ හැකිය, එය මිල අධික නම්. නූතන සී සහ සී ++ ප්‍රමිතීන්ට ඇත්ත වශයෙන්ම මෙම ප්‍රශස්තිකරණය අවශ්‍ය වේ , එබැවින් x අසත්‍ය නම් y ඇගයීමට ලක් නොවනු ඇතැයි වැඩසටහන් වලට ආරක්ෂිතව උපකල්පනය කළ හැකිය. උදාහරණයක් ලෙස, (ptr && ptr-> days> 31) ptr ශුන්‍ය වුවද බිඳ වැටෙන්නේ නැත. C හි ද ප්‍රකාශයන් අවසන් වන්නේ; එකම පේළියේ වෙනත් ප්‍රකාශයක් තිබේද නැද්ද යන්න නොසලකා.
කෙවින්

Answers:


846

වංචා පත්‍රිකාව:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if and only if A succeeded
A || B  # Run B if and only if A failed
A &     # Run A in background.

23
ඇත්ත වශයෙන්ම , A & B &: පසුබිමක A ධාවනය කරන්න, ඉන්පසු B පසුබිමෙන් ධාවනය කරන්න (සාර්ථකත්වය නොතකා) සහ පාලනය නැවත කවචයට ගෙන යන්න. මෙය බොහෝ විට ක්‍රියාදාම දෙකම එකවර ක්‍රියාත්මක කිරීම හා සමාන වේ.
සීමිත පව් කමාව

5
මෙසේ පැවසිය හැකිද: පසුබිමක් තුළ ධාවනය කරන්න, ඉන්පසු b පසුබිමෙහි වැඩ කරන්නේ නම් පමණක් වැඩ කළ හැකිද? (මම අනුමාන කරන්නේ &&&?)
user230910

18
@ user230910: එය එසේ වනු ඇත (A && B) &.
leftaroundabout

5
මේ සඳහා ඔබට බලයලත් ලේඛනයක් යොමු කළ හැකිද?
ජයිම් හබ්ලුට්සෙල්

2
A ජයිම් හබ්ලූට්සෙල් ෂෙල් ග්‍රාමර් man bashයටතේ බලන්න -> ලැයිස්තු
wjandrea

79

&&පළමු විධානය 0 තත්වයෙන් ඉවත් වුවහොත් පමණක් දෙවන විධානය ක්‍රියාත්මක වේ (සාර්ථකයි). ;පළමු එක ශුන්‍ය නොවන තත්වයෙන් පිටව ගියද විධාන දෙකම ක්‍රියාත්මක කරයි.

සමඟ ඇති ඔබේ උදාහරණය &&සමානව අක්ෂර වින්‍යාසගත කළ හැකිය

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi

ස්තූතියි. විවිධ උපසිරැසි පහසුවෙන් වෙන්කර හඳුනාගත හැකි බව තහවුරු කර ගැනීම සඳහා මම ප්‍රශ්නය යාවත්කාලීන කර ඇත.
don.joey

5
Riv පුද්ගලික: ;දෙවන විධානය සාර්ථක වීමට පෙර විධානය අවශ්‍ය නොවේ නම් ඔබ භාවිතා කළ යුතුය .
choroba

33

;පළමු විධානය සාර්ථකද නැද්ද යන්න භාවිතා කිරීමෙන් විධාන ක්‍රියාත්මක වේ.

භාවිතා &&2 වන විධාන පළමු විධානය සාර්ථකව ක්රියාත්මක විට පමණක් (තත්ත්වය 0) ක්රියාත්මක කිරීම.

දෙකම විවිධ දෘෂ්ටිකෝණයන් මත භාවිතා වේ. දිගු ක්‍රියාවලියක් සඳහා මෙන්, ඔබට එය සම්පාදනය කර ස්ථාපනය කිරීමට අවශ්‍ය යැයි කියන්න. ඔබ කළ යුතුයි make && make install. එබැවින් ස්ථාපනය ක්‍රියාත්මක වන්නේ makeසාර්ථක වුවහොත් පමණි .

එබැවින් යැපෙන විධානයන් සඳහා ඔබ භාවිතා කළ යුතුය &&

රැහැන් බාෂ්, හෝ ස්වාධීන විධාන භාවිතා කරන විධාන භාවිතා කරන්න ;

එබැවින් ඔබට පරිගණකය වසා දැමීමට අවශ්‍ය නම් පළමු රැකියාව පවා අසාර්ථක විය ;, නමුත් පළමු රැකියාවේ සම්පූර්ණ සාර්ථකත්වය සඳහා අවශ්‍ය නම් වසා දැමීමේ භාවිතය ආරම්භ කරන්න&&


15

a ; ba හි පිටවීමේ තත්වය නොසලකා b ධාවනය වේ. a && bb ධාවනය වන්නේ සාර්ථක වුවහොත් පමණි.

පළමු ප්‍රශ්න 3 ට පිළිතුරු දීමට මෙය අවශ්‍ය සහ ප්‍රමාණවත් වේ. විශේෂයෙන්, 2 ඉතා පුළුල් වන අතර එයට “එක” නිශ්චිත පිළිතුරක් ලබා දිය නොහැක - ඔබේ හොඳම ඔට්ටුව වන්නේ සිද්ධියක් පදනම් කරගෙන තීරණය කිරීමයි.

4 වන ප්‍රශ්නය සඳහා: ඒවා බාෂ් සින්ටැක්ස් ය .

මේ දෙකම භාවිතා කිරීමේදී සහජ අනතුරක් නොමැත. නැවතත්, ඉහත අර්ථ දැක්වීම ප්රමාණවත්ය. එයින් ගම්‍ය වන්නේ සාර්ථක නොවන්නේ නම් අනපේක්ෂිත බලපෑම් ඇති &&වූ විට ඔබ ලියන බවයි. වැඩිදුර නීති හෝ පැහැදිලි කිරීමක් අවශ්‍ය නොවේ, IMHO.ba


3

ඒ; B # A හි සාර්ථකත්වය නොසලකා A සහ ​​පසුව B ධාවනය කරන්න

A && B # A සාර්ථක වුවහොත් පමණක් ධාවනය කරන්න

අ || B # A අසමත් වුවහොත් පමණක් B ධාවනය කරන්න

A & # පසුබිමකින් ධාවනය කරන්න.

ඉතා හොඳ රීතියක්. සමහර අවස්ථාවලදී, මෙම විධානයන් උප ඒකකයක් ලෙස භාවිතා කිරීම අපට තනි ඒකකයක් ලෙස සලකා බැලීමට අවශ්‍ය වූ විට හෝ වර්තමාන කවචය සමඟ සමහර මෙහෙයුම් ප්‍රති come ල යුවළක් කිරීමට අපට අවශ්‍ය නොවන බව මම එකතු කරමි.

උදාහරණ:

විධාන දෙකක ප්‍රතිදානය සංයුක්ත කරන්න:

(ls foo; ls bar) > single-result.txt

ඩිරෙක්ටරියක් තුළට ගොස් ෂෙල් එකේ වත්මන් ඩිරෙක්ටරිය වෙනස් නොකර එතැන් සිට විධානයක් කරන්න:

(cd target-directory && jar -xf ../my-jar)
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.