කවචයේ පාලන සහ නැවත හරවා යැවීමේ ක්‍රියාකරුවන් මොනවාද?


283

විවිධ විධාන විවිධ සංකේත සමඟ සම්බන්ධ කරන නිබන්ධන මම බොහෝ විට දකිමි. උදාහරණයක් වශයෙන්:

command1 |  command2
command1 &  command2
command1 || command2    
command1 && command2

තවත් සමහරු විධාන ගොනු වලට සම්බන්ධ කරන බව පෙනේ:

command1  > file1
command1  >> file1

මේ දේවල් මොනවාද? ඔවුන් හඳුන්වන්නේ කුමක්ද? ඔවුන් මොකක්ද කරන්නේ? ඒවායින් වැඩි ප්‍රමාණයක් තිබේද?


මෙම ප්‍රශ්නය පිළිබඳ මෙටා නූල්. .

Answers:


385

මේවා ෂෙල් ක්‍රියාකරුවන් ලෙස හැඳින්වෙන අතර ඔව්, ඒවායින් වැඩි ප්‍රමාණයක් ඇත. ප්‍රධාන පංති දෙක අතර වඩාත් සුලභ, පාලක ක්‍රියාකරුවන් සහ යළි හරවා යැවීමේ ක්‍රියාකරුවන් සහ ඔවුන් බැෂ් කවචයට සාපේක්ෂව ක්‍රියා කරන ආකාරය පිළිබඳ කෙටි විස්තරයක් ලබා දෙන්නෙමි .

පාලන ක්‍රියාකරුවන්

ෂෙල් විධාන භාෂාවෙන්, පාලක ශ්‍රිතයක් කරන ටෝකනයක්.
එය පහත දැක්වෙන සංකේත වලින් එකකි:

&   &&   (   )   ;   ;;   <newline>   |   ||

සහ |&බාෂ් වලින්.

!වන නොවේ පාලන ක්රියාකරු නමුත් ඇවිරිනි වචනය . එය ගණිත ප්‍රකාශන තුළ සහ පරීක්ෂණ ව්‍යුහයන් තුළ තාර්කික NOT [නිෂේධන ක්‍රියාකරු] බවට පත්වේ (තවමත් අවකාශ පරිසීමකය අවශ්‍ය වන විට).

A.1 ලැයිස්තු පර්යන්ත

  • ; : පළමු ප්‍රති come ලය නොසලකා එක් විධානයක් තවත් විධානයක් ක්‍රියාත්මක කරයි.

    command1 ; command2

    පළමුව command1ධාවනය වේ, පෙරබිමෙහි, එය අවසන් වූ පසු command2ධාවනය වේ.

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

  • & : මෙය පසුබිමේ විධානයක් ක්‍රියාත්මක කරනු ඇති අතර එමඟින් එකම කවචයේ වැඩ කිරීමට ඔබට ඉඩ සලසයි.

     command1 & command2

    මෙන්න, command1පසුබිම තුළ දියත් කර පිටවීමට command2බලා නොසිට වහාම පෙරබිමෙහි ධාවනය කිරීමට පටන් ගනී command1.

    පසු නව රේඛාවක් command1අත්‍යවශ්‍ය නොවේ.

A.2 තාර්කික ක්‍රියාකරුවන්

  • && : ගොඩනැඟීමට සහ ලැයිස්තු ගත කිරීමට භාවිතා කරන අතර, එය ඔබට එක් විධානයක් ක්‍රියාත්මක කිරීමට ඉඩ දෙන්නේ තවත් විධානයක් සාර්ථකව පිටව ගියහොත් පමණි.

     command1 && command2

    මෙන්න, command2අවසන් වූ පසු ක්‍රියාත්මක වන command1අතර එය සාර්ථක වූයේ නම් පමණිcommand1 (එහි පිටවීමේ කේතය 0 නම්). විධාන දෙකම ක්‍රියාත්මක වන්නේ පෙරබිම තුළ ය.

    මෙම විධානය ද ලිවිය හැකිය

    if command1
    then command2
    else false
    fi

    නැතහොත් if command1; then command2; fiආපසු පැමිණීමේ තත්වය නොසලකා හරිනු ලැබුවහොත්.

  • || : හෝ ලැයිස්තු තැනීමට භාවිතා කරයි, එය ඔබට එක් විධානයක් ක්‍රියාත්මක කිරීමට ඉඩ දෙන්නේ තවත් එකක් අසාර්ථක ලෙස පිටව ගියහොත් පමණි.

     command1 || command2

    මෙන්න, command2ක්‍රියාත්මක වන්නේ command1අසමත් වුවහොත් පමණි (එය 0 හැර වෙනත් පිටවීමේ තත්වයක් ලබා දුන්නේ නම්). විධාන දෙකම ක්‍රියාත්මක වන්නේ පෙරබිම තුළ ය.

    මෙම විධානය ද ලිවිය හැකිය

    if command1
    then true
    else command2
    fi

    හෝ කෙටි ආකාරයකින් if ! command1; then command2; fi.

    බව සටහන &&හා ||-associative ඉතිරි වේ; බලන්න ෂෙල් තාර්කික දු &&, || වැඩි විස්තර සඳහා.

  • !: මෙය වෙන් කර ඇති වචනයක් වන අතර එය “නො” ක්‍රියාකරු ලෙස ක්‍රියා කරයි (නමුත් පරිසීමකය තිබිය යුතුය), එය විධානයක ආපසු පැමිණීමේ තත්වය ප්‍රතික්ෂේප කිරීමට භාවිතා කරයි - විධානය 0 නොවන තත්වයක් ලබා දෙන්නේ නම් 0 ආපසු, එය තත්වය 0 ලබා දෙන්නේ නම් 1 එසේම testඋපයෝගීතාව සඳහා තාර්කික NOT .

    ! command1
    
    [ ! a = a ]

    අංක ගණිත ප්‍රකාශන තුළ සත්‍ය නොවන ක්‍රියාකරු:

    $ echo $((!0)) $((!23))
    1 0

A.3 පයිප්ප ක්‍රියාකරු

  • |: පයිප්ප ක්‍රියාකරු, එය එක් විධානයක ප්‍රතිදානය තවත් ආදානයකට යොමු කරයි. පයිප්ප ක්‍රියාකරුගෙන් සාදන ලද විධානයක් නල මාර්ගයක් ලෙස හැඳින්වේ .

     command1 | command2

    මුද්‍රණය කරන ඕනෑම ප්‍රතිදානයක් command1ආදානය ලෙස ලබා දෙනු command2ලැබේ.

  • |&: මෙය 2>&1 |bash සහ zsh සඳහා කෙටි යෙදුමකි . එය එක් විධානයක සම්මත ප්‍රතිදානය සහ සම්මත දෝෂය තවත් ආදානයකට යොමු කරයි.

    command1 |& command2

A.4 වෙනත් ලැයිස්තු විරාම ලකුණු

;;සිද්ධි ප්‍රකාශයක අවසානය සලකුණු කිරීම සඳහා පමණක් භාවිතා වේ. Ksh, bash සහ zsh ද ;&ඊළඟ නඩුවට වැටීමට සහාය වන අතර ;;&(ATT ksh හි නොවේ) ඉදිරියට ගොස් පසුව ඇති අවස්ථා පරීක්ෂා කිරීමට.

(හා )කිරීම සඳහා භාවිතා වේ පිරිසක් විධාන හා උප කබොළ ඔවුන් දියත්. {හා }ද පිරිසක් විධාන, නමුත් උප කබොළ ඔවුන් දියත් කරන්නේ නැහැ. ෂෙල් සින්ටැක්ස් හි විවිධ වර්ගයේ වරහන්, වරහන් සහ වරහන් පිළිබඳ සාකච්ඡාවක් සඳහා මෙම පිළිතුර බලන්න .

යළි හරවා යැවීමේ ක්‍රියාකරුවන්

යළි හරවා යැවීමේ ක්‍රියාකරු

ෂෙල් විධාන භාෂාවෙන්, යළි-යොමුවීමේ කාර්යයක් කරන ටෝකනයක්. එය පහත දැක්වෙන සංකේත වලින් එකකි:

<     >     >|     <<     >>     <&     >&     <<-     <>

ඔබේ විධාන වල ආදානය සහ ප්‍රතිදානය පාලනය කිරීමට මේවා ඔබට ඉඩ දෙයි. සරල විධානයක් තුළ ඕනෑම තැනක ඒවා දිස්විය හැකිය, නැතහොත් විධානයක් අනුගමනය කළ හැකිය. යළි-යොමුවීම් වමේ සිට දකුණට පෙනෙන අනුපිළිවෙලින් සකසනු ලැබේ.

  • < : විධානයකට ආදානය ලබා දෙයි.

    command < file.txt

    ඉහත සඳහන් දෑ commandඅන්තර්ගතය මත ක්‍රියාත්මක වේ file.txt.

  • <>: ඉහත ආකාරයටම, නමුත් ගොනුව කියවීමට පමණි වෙනුවට කියවීමේ + ලිවීමේ ආකාරයෙන් විවෘත වේ :

    command <> file.txt

    ගොනුව නොපවතී නම්, එය නිර්මාණය වනු ඇත.

    එම ක්‍රියාකරු කලාතුරකින් භාවිතා කරනුයේ විධාන සාමාන්‍යයෙන් කියවන්නේ ඒවායේ stdin වලින් පමණක් වන නමුත් එය විශේෂිත අවස්ථා ගණනාවකදී ප්‍රයෝජනවත් විය හැකි බැවිනි.

  • > : විධානයක ප්‍රතිදානය ගොනුවකට යොමු කරයි.

    command > out.txt

    ඉහත දැක්වෙන්නේ commandas හි ප්‍රතිදානය සුරකිනු ඇත out.txt. ගොනුව තිබේ නම්, එහි අන්තර්ගතය නැවත ලියනු ලබන අතර එය නොපවතී නම් එය නිර්මාණය වේ.

    සම්මත දෝෂයකට හෝ සම්මත ප්‍රතිදානයකට යමක් මුද්‍රණය කළ යුතුද යන්න තෝරා ගැනීමට මෙම ක්‍රියාකරු බොහෝ විට භාවිතා කරයි :

    command >out.txt 2>error.txt

    ඉහත උදාහරණයේ දී, >සම්මත ප්‍රතිදානය 2>හරවා යවන අතර සම්මත දෝෂය යළි හරවා යවනු ඇත. ප්‍රතිදානය ද භාවිතයෙන් හරවා යැවිය හැකි 1>නමුත්, මෙය පෙරනිමිය බැවින්, 1සාමාන්‍යයෙන් මඟ හැරී ඇති අතර එය ලියා ඇත්තේ සරලවම ය >.

    එබැවින්, එහි ප්‍රතිදානය ක්‍රියාත්මක commandකර file.txtසුරැකීමට out.txtසහ error.txtඔබ තුළ ඇති ඕනෑම දෝෂ පණිවිඩ ක්‍රියාත්මක වනු ඇත:

    command < file.txt > out.txt 2> error.txt
  • >|: >නැවත නැවත ලිවීම ප්‍රතික්ෂේප කිරීම සඳහා කවචය වින්‍යාස කර තිබුණද (එය සමඟ set -Cහෝ සමග set -o noclobber) ඉලක්කය නැවත ලියයි .

    command >| out.txt

    out.txtපවතී නම් , ප්‍රතිදානය commandඑහි අන්තර්ගතය ප්‍රතිස්ථාපනය කරයි. එය නොපවතී නම් එය නිර්මාණය වනු ඇත.

  • >>: >ඉලක්ක ගොනුව තිබේ නම්, නව දත්ත එකතු කරනු ලැබේ.

    command >> out.txt

    out.txtපවතින්නේ නම් , එහි ප්‍රතිදානය commandදැනටමත් එහි ඇති ඕනෑම දෙයකට පසුව එයට එකතු වේ. එය නොපවතී නම් එය නිර්මාණය වනු ඇත.

  • &>, >&, >>&හා &>>: (සම්මත නොවන). සම්මත දෝෂය සහ සම්මත ප්‍රතිදානය පිළිවෙලින් ප්‍රතිස්ථාපනය කිරීම හෝ එකතු කිරීම යලි හරවා යැවීම.

    command &> out.txt

    සම්මත දෝෂය සහ සම්මත ප්‍රතිදානය යන දෙකම commandසුරකිනු ඇත out.txt, එහි අන්තර්ගතය නැවත ලිවීම හෝ එය නොපවතී නම් එය නිර්මාණය කිරීම.

    command &>> out.txt

    ඉහත පරිදි, out.txtපවතින්නේ නම් හැර , ප්‍රතිදානය සහ දෝෂය commandඑයට එකතු වේ.

    මෙම &>තුළ ප්රභේද්යයක් බිහි bashවූ අතර, >&ප්රභේද්යයක් csh (පෙර දශක) පැමිණෙන්නේ. ඔවුන් දෙදෙනාම අනෙකුත් පොසික්ස් ෂෙල් ක්‍රියාකරුවන් සමඟ ගැටෙන අතර ඒවා අතේ ගෙන යා හැකි shස්ක්‍රිප්ට් වල භාවිතා නොකළ යුතුය .

  • <<: මෙහි ලේඛනයක්. එය බොහෝ විට බහු රේඛා නූල් මුද්‍රණය කිරීමට යොදා ගනී.

     command << WORD
         Text
     WORD

    මෙන්න, commandඑය ඊළඟ සිදුවීම සම්බ වන තුරු සියල්ල ගනු ඇත WORD, Textආදාන ලෙස, ඉහත උදාහරණයේ. WORDබොහෝ විට EoFහෝ එහි වෙනස්කම් තිබියදීත් , එය ඔබ කැමති ඕනෑම අක්ෂරාංක (පමණක් නොව) නූලක් විය හැකිය. WORDඋපුටා දක්වන විට , මෙහි ලේඛනයේ පෙළ වචනාර්ථයෙන් සලකනු ලබන අතර පුළුල් කිරීම් සිදු නොකෙරේ (උදාහරණයක් ලෙස විචල්‍යයන් මත). එය නම් කර නොමැති නම්, විචල්යයන් පුළුල් වේ. වැඩි විස්තර සඳහා, bash අත්පොත බලන්න .

    ඔබට ප්‍රතිදානය command << WORD ... WORDකෙලින්ම වෙනත් විධානයකට හෝ විධානයකට නල කිරීමට අවශ්‍ය නම් , ඔබට නළය එකම පේළියකට << WORDදැමිය යුතුය, එය අවසන් වූ වචනයෙන් පසුව හෝ පහත දැක්වෙන පේළියට දැමිය නොහැක. උදාහරණයක් වශයෙන්:

     command << WORD | command2 | command3...
         Text
     WORD
  • <<<: මෙන්න නූල්, මෙහි ලේඛන වලට සමාන, නමුත් තනි පේළියක් සඳහා අදහස් කෙරේ. මේවා පවතින්නේ යුනික්ස් වරාය හෝ ආර්සී (එය ආරම්භ වූ ස්ථානය), zsh, ksh, yash සහ bash සමහර ක්‍රියාත්මක කිරීම් වල පමණි.

    command <<< WORD

    WORDපුළුල් කර ඇති පරිදි ලබා දී ඇති ඕනෑම දෙයක් සහ එහි අගය ආදානය ලෙස සම්මත වේ command. විචල්යයන්ගේ අන්තර්ගතය විධානයකට ආදානය කිරීම සඳහා මෙය බොහෝ විට භාවිතා කරයි. උදාහරණයක් වශයෙන්:

     $ foo="bar"
     $ sed 's/a/A/' <<< "$foo"
     bAr
     # as a short-cut for the standard:
     $ printf '%s\n' "$foo" | sed 's/a/A/'
     bAr
     # or
     sed 's/a/A/' << EOF
     $foo
     EOF

ගොනු විස්තර කරන්නන් වසා දැමීමට හෝ අනුපිටපත් කිරීමට තවත් ක්‍රියාකරුවන් ( >&-, x>&y x<&y) භාවිතා කළ හැකිය. ඔවුන් මත විස්තර සඳහා, කරුණාකර (ඔබගේ ෂෙල් ගේ අත්පොත අදාළ කොටස බලන්න මෙතන කාව්යකරණයේ සඳහා උදාහරණයක්.)

එය ආවරණය කරන්නේ බෝර්න් වැනි ෂෙල් වෙඩි බහුලව භාවිතා කරන්නන් පමණි. සමහර ෂෙල් වෙඩි වලට තමන්ගේම අතිරේක යළි-යොමුවීම් ක්‍රියාකරුවන් කිහිපයක් ඇත.

Ksh, bash සහ zsh ද ඉදිකිරීම් ඇත <(…), >(…)සහ =(…)(එය දෙවැන්න zshපමණි). මේවා යළි-යොමුවීම් නොව ක්‍රියාවලි ආදේශනයකි .


2
සෑම කවචයක්ම එක හා සමාන නොවන බව සඳහන් කිරීම වටී.
ග්‍රෙග් හෙව්ගිල්

1
Reg ග්‍රෙග් හියුගිල් ඔව්, මම සාකච්ඡා කරන්නේ ගෞරවයෙන් බව පවසමින් මම එයින් මිදුනෙමි bash. විවිධාකාර "මෙම අමුතු දේ කරන්නේ කුමක්ද" යන ප්‍රශ්න වැසීමට මෙය කැනොනිකල් ප්‍රශ්නෝත්තරයක් ලෙස සකස් කර ඇති අතර ඒවායින් බොහොමයක් බාෂ් භාවිතා කරන්නන්ගෙන් වේ. මම බලාපොරොත්තු වෙනවා වෙනත් අයෙකු බැෂ් නොවන ෂෙල් වෙඩි සඳහා පිළිතුරු සපයනු ඇතැයි කියා, නමුත් බැෂ්-විශේෂිත ඒවා ඉස්මතු කිරීම අර්ථවත් කරයි. මට පරීක්ෂා කිරීමට සිදුවේ, නමුත් ඒවා මගේ හිස මුදුනේ තිබෙන්නේ කුමක් දැයි මම නොදනිමි.
ටර්ඩන්

&>, >>>සහ <<<ඒවා සියල්ලම පොසික් නොවන අතර මෙහි ඩොක්ගේ නමෙහි ඇති ඇල්ෆනම් නොවන අක්ෂර පමණක් නොවේ. මේ පිළිතුර ගැන ද ඉතා සුළු සාකච්ඡා ආකාරය ඔවුන් වැඩ - උදාහරණයක් ලෙස, එය ගැන කතා කිරීම නිෂ්ඵල වඩා පාහේ නරක ය සරල විධාන හා විධානය මේවා කුමක් ද යන්න පැහැදිලි කරන්නේ කෙසේ ද ෂෙල් තීරණය තොරව.
mikeserv

ikmikeserv ස්තූතියි. ඔවුන් වැඩ කරන්නේ bash සහ zsh වුවත්. එම ලැයිස්තුවේ ඇත්ත වශයෙන්ම විශේෂිත වන්නේ කුමක් දැයි මම නොදනිමි. මම මේ හරහා ගොස් එක් එක් වැඩ කරන ෂෙල් වෙඩි එකතු කළ යුතු නමුත් එයට පළමුව සොයා ගැනීම ඇතුළත් වේ.
ටර්ඩන්

1
C Arc676 නැත, ඔවුන් සත්‍ය හෝ අසත්‍යය තක්සේරු නොකරයි, එය සම්පූර්ණයෙන්ම වෙනස් සන්දර්භයකි. මෙයින් අදහස් කරන්නේ 0 නොවන පිටවීමේ අගය ගැටළුවක් (නොවේ false) සහ 0 හි පිටවීමේ කේතය මඟින් සාර්ථකත්වය (නොවේ true) පෙන්නුම් කරන බවයි . එය සෑම විටම මාර්ගය වන අතර එය තරමක් සම්මත වේ. 0 නොවන පිටවීමේ කේතයක් මා දන්නා සෑම පරිසරයකම දෝෂයක් දක්වයි.
ටර්ඩන්

65

'>' පිළිබඳ අනතුරු ඇඟවීම

I / O යළි හරවා යැවීම ( <සහ >) ගැන ඉගෙන ගෙන ඇති යුනික්ස් ආරම්භකයින් බොහෝ විට වැනි දේ උත්සාහ කරති

විධානයinput_file > the_same_file

හෝ

විධානය … < ගොනුව      > the_same_file

හෝ, බොහෝ දුරට සමානව,

cat file | විධානය …> the_same_file

( grep, sed, cut, sort, හා spellජනතාව මේ වගේ නිර්මාණය කරන භාවිතා කිරීමට පෙළඹෙනු ඇති බව විධාන උදාහරණ වේ.) පරිශීලකයන් මෙකී හිස් බවට පත් වෙමින් ගොනුව ප්රතිඵලය බව සොයා ගැනීමට පුදුමයට පත් වේ.

අනෙක් පිළිතුරෙහි සඳහන් නොවන බව පෙනෙන සූක්ෂ්ම බාෂ් (1) හි යළි-යොමුවීමේ කොටසේ පළමු වාක්‍යයේ සැඟවී ඇති බව සොයාගත හැකිය :

විධානයක් ක්‍රියාත්මක කිරීමට පෙර, එහි ආදානය සහ ප්‍රතිදානය කවචය මගින් අර්ථ නිරූපණය කරන විශේෂ අංකනයක් භාවිතා කර හරවා යවනු ලැබේ .

පළමු වචන පහක් නිර්භීත, තද පැහැ ඇළ අකුරු විය යුතුය, නිමේෂ රතු පාට, සහ සළකුණු විශාල අවධාරනය කලේය, විශ්මයජනක සලකුණ රතු ත්‍රිකෝණයෙන්අයිකනය, ෂෙල් කිරිමටද ඉල්ලා හරවා යැවීමේ (ව) බව අවධාරණය කිරීමට මෙම විධානය පෙර ක්රියාත්මක වන . මතක තබා ගන්න

ප්‍රතිදානය නැවත හරවා යැවීම ගොනුව ලිවීමට විවෘත වේ…. ගොනුව නොපවතී නම් එය නිර්මාණය වේ; එය පවතින්නේ නම් එය ශුන්‍ය ප්‍රමාණයට කපා ඇත.

  1. ඉතින්, මෙම උදාහරණයේ:

    sort roster > roster

    වැඩසටහන ක්‍රියාත්මක rosterවීමට පෙර කවචය ලිවීම සඳහා ගොනුව විවෘත කරයි , එය කප්පාදු කරයි (එනම් එහි සියලුම අන්තර්ගතයන් ඉවතලයි) sort. ස්වාභාවිකවම, දත්ත නැවත ලබා ගැනීමට කිසිවක් කළ නොහැක.

  2. යමෙකුට එය බොළඳ ලෙස බලාපොරොත්තු විය හැකිය

    tr "[:upper:]" "[:lower:]" < poem > poem

    වඩා හොඳ විය හැකිය. කවචය වමේ සිට දකුණට හරවා යැවීම් හසුරුවන හෙයින්, එය ලිවීම සඳහා විවෘත කිරීමට පෙර (සම්මත ප්‍රතිදානය සඳහා) poemකියවීම සඳහා ( trසම්මත ආදානය සඳහා) විවෘත වේ. නමුත් එය උදව් කරන්නේ නැත. මෙම මෙහෙයුම් අනුක්‍රමය ගොනු හැසිරවීම් දෙකක් ලබා දුන්නද, ඒවා දෙකම එකම ගොනුවකට යොමු කරයි. කවචය කියවීම සඳහා ගොනුව විවෘත කළ විට, අන්තර්ගතය තවමත් පවතී, නමුත් වැඩසටහන ක්‍රියාත්මක කිරීමට පෙර ඒවා තවමත් වසා දමනු ලැබේ. 

ඉතින්, ඒ ගැන කුමක් කළ යුතුද?

විසඳුම් වලට ඇතුළත් වන්නේ:

  • ඔබ ක්‍රියාත්මක කරන වැඩසටහනට ප්‍රතිදානය යන්නේ කොතැනටද යන්න සඳහන් කිරීමේ හැකියාවක් තිබේද යන්න පරීක්ෂා කරන්න. මෙය බොහෝ විට -o(හෝ --output=) ටෝකනයකින් දැක්වේ. විශේෂයෙන්,

    sort roster -o roster

    දළ වශයෙන් සමාන වේ

    sort roster > roster

    හැර, පළමු අවස්ථාවේ දී, sortවැඩසටහන ප්‍රතිදාන ගොනුව විවෘත කරයි. සියලු ආදාන ගොනුව (ය) කියවා අවසන් වන තුරු ප්‍රතිදාන ගොනුව විවෘත නොකිරීමට එය දක්ෂයි .

    ඒ හා සමානව, අවම වශයෙන් සමහර අනුවාද sedඇති -i(සංස්කරණය i ආදාන ගොනුව (නැවත, නැවත ප්රතිදානය ලියන්න යොදා ගත හැකි බව n ස්ථානය) විකල්පය පසු සියලු ආදාන කියවා ඇති). වැනි සංස්කාරකවරුන්ට ed/ ex, emacs, pico, සහ vi/ vim සංස්කරණය කිරීම සඳහා පරිශීලක පෙළ ගොනුවක් ඉඩ සහ මුල් ගොනුවේ සංස්කරණය පෙළ සුරකින්න. ed(අවම වශයෙන්) අන්තර්ක්‍රියාකාරී නොවන ලෙස භාවිතා කළ හැකි බව සලකන්න .

    • viආශ්‍රිත අංගයක් ඇත. ඔබ ටයිප් කළහොත් , එය සංස්කරණ බෆරයේ අන්තර්ගතය ලිවීමට , ප්‍රතිදානය කියවීමට සහ එය බෆරයට ඇතුළු කරනු ඇත (මුල් අන්තර්ගතය වෙනුවට).:%!commandEntercommand
  • සරල නමුත් effective ලදායී:

    විධානයinput_file > temp_file   && mv temp_file  input_file

    මෙහි ඇති අඩුපාඩුව නම්, input_fileසබැඳියක් නම්, එය (බොහෝ විට) වෙනම ගොනුවකින් ප්‍රතිස්ථාපනය වනු ඇත. එසේම, පෙරනිමි ආරක්ෂණ සහිතව නව ගොනුව ඔබ සතු වේ. විශේෂයෙන්, මෙය ගොනුව මුල් පිටපත input_fileනොවුනත් , ලෝක කියවිය හැකි බවට පත්වීමේ අවදානම දරයි .

    වෙනස්කම්:

    • commandinput_file > temp_file && cp temp_file input_file && rm temp_file
      එය තවමත් (විභවයෙන්) temp_fileලෝකයට කියවිය හැකි වනු ඇත. ඊටත් වඩා හොඳයි:
    • cp input_file temp_file && commandtemp_file > input_file && rm temp_file
      මේවා ගොනුවේ සම්බන්ධක තත්ත්වය, හිමිකරු සහ මාදිලිය (ආරක්ෂාව) ආරක්ෂා කරයි. ( ගුණාංග ආරක්ෂා කර ගැනීම සඳහා ඔබට එය පැවසීමට -aහෝ ඊට සමාන විකල්පයක් භාවිතා කිරීමට අවශ්‍ය විය හැකිය .)-pcp
    • commandinput_file > temp_file &&
      cp --attributes-only --preserve=all input_file temp_file &&
      mv temp_file input_file
      (කියවීමට පමණක් වෙනම රේඛාවලට බෙදී ඇත) මෙය ගොනුවේ මාදිලිය ආරක්ෂා කරයි (සහ, ඔබ root නම්, හිමිකරු), නමුත් එය ඔබට අයිති කර ගනී (ඔබ මූල නොවේ නම්), සහ එය නව එකක් බවට පත් කරයි, වෙනම ගොනුවක්.
  • මෙම බ්ලොගය (“ස්ථානගත” ගොනු සංස්කරණය කිරීම) යෝජනා කරයි සහ පැහැදිලි කරයි

    {rm input_file   &&   විධානය …> input_file ; input < input_file

    මේ සඳහා commandසම්මත ආදානය සැකසීමට හැකියාව තිබිය යුතුය (නමුත් සියලුම පෙරහන් පාහේ කළ හැකිය). බ්ලොග් අඩවියම මෙය අවදානම් සහගත ගැටයක් ලෙස හඳුන්වන අතර එහි භාවිතය අධෛර්යමත් කරයි. තවද මෙය ඔබට අයත් සහ පෙරනිමි අවසරයන් සහිත නව වෙනම ගොනුවක් (කිසිවක් සමඟ සම්බන්ධ නොවේ) නිර්මාණය කරයි.

  • Moreutils පැකේජයට විධානයක් ඇත sponge:

    විධානයinput_file | ස්පොන්ජ් the_same_file

    වැඩි විස්තර සඳහා මෙම පිළිතුර බලන්න .

මෙන්න මට සම්පූර්ණ පුදුමයක් ඇති වූ දෙයක්: syntaxerror පවසයි :

[මෙම විසඳුම් බොහෝ] "කියවීමට පමණක්" ඔබගේ ඒ කියන්නෙ එය කියවීමට පමණක් ගොනු පද්ධතිය, මත අසාර්ථක වනු ඇත $HOME ඇත , ලිවිය-හැකි ගොනුවක් විය, නමුත් /tmpකරනු ලැබේ කියවීමට පමණක් (පෙරනිමියෙන්). උදාහරණයක් ලෙස, ඔබට උබුන්ටු තිබේ නම් සහ ඔබ ප්‍රතිසාධන කොන්සෝලය තුළට පිවිස තිබේ නම්, මෙය සාමාන්‍යයෙන් සිදුවේ. එසේම, මෙහි ලේඛනයක් ක්රියාකරු <<<එහි එක්කෝ, එය අවශ්ය ලෙස ක්රියා නොකරනු ඇත /tmpවීමට කියවීම් / ලිවීම් එය මෙන්ම එහි බවට තාවකාලික ගොනුවක් ලිවීමට ඇත නිසා.
(cf. මෙම ප්‍රශ්නයටstrace 'd ප්‍රතිදානය ඇතුළත් වේ )

පහත දැක්වෙන කරුණු එම අවස්ථාවේ දී ක්‍රියාත්මක විය හැකිය:

  • පමණක් උසස් පරිශීලකයින් සඳහා: ඔබගේ විධානය ආදාන (උදා, පවතින බැවින් ප්රතිදානය දත්ත එම ප්රමාණය නිපදවීමට සහතික තිබේ නම් sort, හෝ tr තොරව එම -dහෝ -sවිකල්පය), ඔබ උත්සාහ කළ හැකි
    විධානයinput_file | dd of = the_same_file conv = notrunc
    බලන්න මේ පිළිතුර හා මෙම පිළිතුර ඉහත පැහැදිලි කිරීමක්, සහ ආදාන පවතින බැවින් කාර්යන්හි දත්ත එම ප්රමාණය නිපදවීමට ඔබගේ විධානය සහතික කර ඇත නම් විකල්ප ඇතුළු, වැඩි තොරතුරු සඳහා හෝ ඊට අඩු (උදා, grepහෝ cut). මෙම පිළිතුරු වලට වාසියක් ඇත්තේ ඔවුන්ට කිසිදු නිදහස් ඉඩක් අවශ්‍ය නොවන බවය (නැතහොත් ඔවුන්ට ඉතා සුළු ප්‍රමාණයක් අවශ්‍ය වේ). පෝරමයේ ඉහත පිළිතුරු වලින් පැහැදිලිවම අවශ්‍ය වන්නේ පද්ධතියට සම්පූර්ණ ආදාන (පැරණි) ගොනුව සහ ප්‍රතිදාන (නව) ගොනුව එකවර රඳවා තබා ගැනීමට ප්‍රමාණවත් ඉඩ ප්‍රමාණයක් තිබීමයි; අනෙක් විසඳුම් බොහොමයකට (උදා: සහ ) මෙය පැහැදිලිවම සත්‍ය නොවේ . ව්‍යතිරේකය: බොහෝ විට නිදහස් ඉඩ ප්‍රමාණයක් අවශ්‍ය වනු ඇතcommandinput_file > temp_file && …sed -ispongesort … | dd …sort කිසියම් නිමැවුමක් ලිවීමට පෙර එහි සියලු ආදාන කියවිය යුතු අතර, එම දත්ත සියල්ලම තාවකාලික ගොනුවක නොමැති නම් එය බොහෝ විට බෆර් කරයි.
  • උසස් පරිශීලකයින් සඳහා පමණි:
    විධානයinput_file 1 <> the_same_file
    ddඉහත පිළිතුරට සමාන විය හැකිය . මෙම කාරක රීති ගොනුව descriptor මත නම් ගොනුව විවෘත කරයි ආදානය සහ ප්රතිදානය යන දෙකම සඳහා එය truncating තොරව, - ක එකතුවක් ආකාරයක හා . සටහන: ආදාන සහ ප්‍රතිදානය එකම ගොනුවක් බව හඳුනාගත හැකි නිසා සමහර වැඩසටහන් (උදා, සහ ) මෙම තත්වය තුළ ක්‍රියාත්මක වීම ප්‍රතික්ෂේප කළ හැකිය. ඉහත සාකච්ඡා කිරීම සඳහා මෙම පිළිතුර බලන්න , සහ ආදානය හෝ ඊට අඩු ප්‍රතිදාන දත්ත ප්‍රමාණයක් නිපදවීමට ඔබේ විධානය සහතික වී ඇත්නම් මෙම පිළිතුර ක්‍රියාත්මක වන පිටපතක් බලන්න . අවවාදයයි: මම පීටර්ගේ පිටපත අත්හදා බලා නැත, එබැවින් මම ඒ ගැන සහතික නොවෙමි.n<> filen n<n>catgrep

ඉතින්, ප්‍රශ්නය කුමක්ද?

මෙය යූ ඇන්ඩ් එල් හි ජනප්‍රිය මාතෘකාවක් වී තිබේ. එය පහත සඳහන් ප්‍රශ්න වලින් ආමන්ත්‍රණය කෙරේ:

… එය සුපිරි පරිශීලකයෙකු හෝ උබුන්ටු අසන්න නොවේ. ඉහත ප්‍රශ්න වලට පිළිතුරු වලින් මම බොහෝ තොරතුරු මෙම පිළිතුරට ඇතුළත් කර ඇත, නමුත් සියල්ලම නොවේ. (එනම්, වැඩි විස්තර සඳහා, ඉහත ලැයිස්තුගත ප්‍රශ්න සහ ඒවායේ පිළිතුරු කියවන්න.)

PS මා ඉහත සඳහන් කළ බ්ලොග් අඩවිය සමඟ මට කිසිදු සම්බන්ධයක් නැත .


මෙම ප්‍රශ්නය දිගින් දිගටම මතුවෙමින් පවතින බැවින්, “කැනොනිකල් පිළිතුරක්” ලිවීමට මම උත්සාහ කරමි. මම එය මෙහි පළ කළ යුතුද (සමහර විට තවත් දැඩි ලෙස වෙළඳාමට ලක්වූ වෙනත් ප්‍රශ්න වලින් එය සම්බන්ධ කළ හැකිය), නැතහොත් මෙම ප්‍රශ්නය ඇත්ත වශයෙන්ම මතු කරන ප්‍රශ්න වලින් එකකට මා ගෙන යා යුතුද? එසේම, මෙය සමහර විට ප්‍රශ්න ඒකාබද්ධ කළ යුතු තත්වයක්ද?
ස්කොට්

/ tmp තාවකාලික ලිපිගොනු සෑදීමට ස්ථානයක් අවශ්‍ය යෙදුම් සඳහා ලබා දී ඇති නාමාවලියකි. මෙම නාමාවලිය තුළ ලිපිගොනු සෑදීමට යෙදුම් වලට අවසර දෙනු ලැබේ, නමුත් යෙදුමේ ආයාචනා අතර එවැනි ගොනු සංරක්ෂණය කර ඇතැයි නොසිතිය යුතුය.
mikeserv

ikmikeserv: ඔව්, (1) මම සින්ටැක්සර් දෝෂය උපුටා දක්වමි, (2) මම කීවේ මා පුදුමයට පත්වූ බවය. මම සිතුවේ, යමක් කියවීමට-ලිවීමට හැකි නම් එය එසේ වනු ඇති බවයි /tmp.
ස්කොට්

හොඳයි, සින්ටැක්සෙරර් පැවසූ දෙය දෙගුණයක් අමුතුයි, මන්ද මම සිතන පරිදි dashඋබුන්ටු හි පෙරනිමි ප්‍රතිසාධන කවචය වනු ඇති අතර එය <<<මිථ්‍යාදෘෂ්ටියක් තේරුම් නොගන්නවා පමණක් නොව, එය <<පාරම්පරික ලේඛන සඳහා නිර්නාමික පයිප්ප ලබා ගන්නා අතර ඒ සඳහා පටලවා නොගනී ${TMPDIR:-/tmp}. අරමුණ කිසිසේත් නැත. මෙහි ලේඛන හැසිරවීම පිළිබඳ නිරූපණ සඳහා මෙය හෝ මෙය බලන්න . ඇයි ද නිමැවුම් සමාන හෝ ඊට අඩු අනතුරු ඇඟවීමක්?
mikeserv

ikmikeserv: හොඳයි, dd … conv=notruncසහ 1<>පිළිතුරු කිසි විටෙකත් ප්‍රතිදාන ගොනුව කප්පාදු නොකරයි, එබැවින්, විධානයේ ප්‍රතිදානය ආදානයට වඩා අඩු නම් (උදා. grep), ගොනුවේ අවසානයේ ඉතිරිව ඇති මුල් බයිට් කිහිපයක් තිබේ. හා, ප්රතිදානය ආදාන (උදා, වඩා විශාල නම් cat -n, nlහෝ (හැකි) grep -n), ඔබ එය කියවා පෙර පැරණි දත්ත මත ලියන්නේ අවදානමක් තියෙනවා.
ස්කොට්

30

පිළිබඳ වැඩි නිරීක්ෂණ ;, &, (හා)

  • ටර්ඩන්ගේ පිළිතුරෙහි ඇති සමහර විධානයන් අහෝසි විය හැකි බව සලකන්න. උදාහරණයක් ලෙස, ඔබට පැවසිය හැකිය

    command1 ;

    (නැත command2). මෙය සමාන වේ

    command1

    (එනම්, එය හුදෙක් command1පෙරබිමෙහි ධාවනය වන අතර එය සම්පූර්ණ වන තෙක් බලා සිටී. සංසන්දනාත්මකව,

    command1 &

    (නැත command2) command1පසුබිමේ දියත් කර වහාම වෙනත් ෂෙල් විමසුමක් නිකුත් කරයි.

  • ඊට වෙනස් ලෙස, command1 &&, command1 ||, හා command1 |කිසිදු අර්ථයක් නැහැ. ඔබ මේවායින් එකක් ටයිප් කළහොත්, විධානය වෙනත් පේළියකට අඛණ්ඩව ඉදිරියට ගෙන යනු ඇතැයි කවචය (බොහෝ විට) උපකල්පනය කරයි. එය සාමාන්‍යයෙන් සකසා ඇති ද්විතීයික (අඛණ්ඩ) ෂෙල් විමසුම ප්‍රදර්ශනය කර >දිගටම කියවනු ඇත. ෂෙල් පිටපතක, එය ඊළඟ පේළිය කියවා එය දැනටමත් කියවා ඇති දේට එකතු කරයි. (පරෙස්සම් වන්න: මෙය ඔබට සිදුවිය යුතු දේ නොවිය හැකිය.)

    සටහන: සමහර කවච වල සමහර අනුවාදයන් එවැනි අසම්පූර්ණ විධානයන් දෝෂ ලෙස සලකයි. එවැනි අවස්ථාවන්හිදී (හෝ, ඇත්ත වශයෙන්ම, ඔබට දිගු විධානයක් ඇති ඕනෑම අවස්ථාවක), ඔබට \පේළියක අවසානයේ බැක්ස්ලෑෂ් ( ) දැමිය හැකිය, වෙනත් පේළියක විධානය දිගටම කියවීමට කවචයට කියන්න:

    command1  &&  \
    command2

    හෝ

    find starting-directory -mindepth 3 -maxdepth 5 -iname "*.some_extension" -type f \
                            -newer some_existing_file -user fred -readable -print
  • Terdon ලෙස පවසයි, (හා )කණ්ඩායම් විධාන කිරීම සඳහා භාවිතා කල හැක. එම සාකච්ඡාවට ඒවා “සැබවින්ම අදාළ නොවේ” යන ප්‍රකාශය විවාදාත්මක ය. ටර්ඩන්ගේ පිළිතුරෙහි ඇති සමහර විධානයන් විධාන කණ්ඩායම් විය හැකිය . උදාහරණයක් වශයෙන්,

    ( command1 ; command2 )  &&  ( command3; command4 )

    මෙය කරයි:

    • දුව command1ගොස් එය අවසන් වන තෙක් බලා සිටින්න.
    • ඉන්පසු, එම පළමු විධානය ක්‍රියාත්මක කිරීමේ ප්‍රති result ලය කුමක් වුවත්, ධාවනය command2කර එය අවසන් වන තෙක් බලා සිටින්න.
    • command2සාර්ථක වුවහොත් ,

      • දුව command3ගොස් එය අවසන් වන තෙක් බලා සිටින්න.
      • ඉන්පසු, එම විධානය ක්‍රියාත්මක කිරීමේ ප්‍රති result ලය කුමක් වුවත්, ධාවනය command4කර එය අවසන් වන තෙක් බලා සිටින්න.

      command2අසමත් වුවහොත් , විධාන රේඛාව සැකසීම නවත්වන්න.

  • වරහන් |වර්‍ගයෙන් පිටත ඉතා තදින් බැඳ තබයි

    command1 | command2 || command3

    සමාන වේ

    ( command1 | command2 )  ||  command3

    හා &&හා ||බඳින්න වඩා දැඩි වූ ;නිසා,

    command1 && command2 ; command3

    සමාන වේ

    ( command1 && command2 ) ;  command3

    එනම්, command3නොතකා, පිටවීම තත්ත්වය ක්රියාත්මක වනු ඇත command1සහ / හෝ command2.


පරිපූර්ණයි, +1! එතරම් විස්තරාත්මකව බැලීමට මට අවශ්‍ය නැති නිසා ඒවා අදාළ නොවන බව මම කීවෙමි. විවිධ විධානයන් අවසානයේ ඇති අමුතුම විකාර මොනවාදැයි කල්පනා කරන නවකයින් සඳහා ඉක්මන් වංචා පත්‍රිකාවක් ලෙස ක්‍රියා කළ හැකි පිළිතුරක් මට අවශ්‍ය විය. ඒවා ප්‍රයෝජනවත් නොවන බව ඇඟවීමට මම අදහස් නොකළෙමි. මේ සියල්ල එකතු කිරීම ගැන ස්තූතියි.
terdon

1
"විවේචනාත්මක ස්කන්ධ" ගැටළුව ගැන මම සැලකිලිමත් වෙමි - ෂෙල් වෙඩි ගැන අපට පැවසිය හැකි සෑම දෙයක්ම අපි පළ කළහොත් , අපි අපේම ටීඑල්; බාෂ් යොමු අත්පොතේ ඩීආර් අනුවාදය සමඟ අවසන් කරමු .
ජී-මෑන් පවසන්නේ 'මොනිකා නැවත

සඳහන් කිරීම වටී: සී පවුලේ භාෂාවන් මෙන් නොව, ;තනිවම (හෝ ඊට පෙර විධානයක් නොමැතිව) සින්ටැක්ස් දෝෂයක් මිස හිස් ප්‍රකාශයක් නොවේ. මේ අනුව ; ;දෝෂයකි. (නව පරිශීලකයින් සඳහා පොදු අනතුරක්, IMHO). එසේම: ප්‍රකාශ ;;සඳහා විශේෂ පරිසීමකය case.
මුරු

1
ur මුරු: හොඳ කරුණක්, නමුත් අපි එය සාමාන්‍යකරණය කරමු. ඕනෑම විධාන අතර ඇති විය හැකි බව පාලනය ක්රියාකරුවන්: ;, &&, ||, &, හා |, ඔවුන් පෙර කිසිවක් සමග පෙනී නම් වැරදි ය. ටර්ඩන් ;;සිය පිළිතුරෙන් (කෙටියෙන්) ආමන්ත්‍රණය කළේය.
ජී-මෑන් පවසන්නේ 'මොනිකා නැවත

1
Ild විල්ඩ්කාඩ්: හරි, ඔබ පැමිණෙන්නේ කොහෙන්දැයි මට පෙනේ. ප්රධාන වචනය "මැයි"; මා කියා සිටියේ සියලුම ෂෙල් වෙඩි එවැනි ඉදිකිරීම් (එනම් YMMV) භාර ගන්නා බවට මා සහතික නොවන බවයි. නිසැකවම මම ලිව්වේ linebreakපොසික්ස් ෂෙල් ව්‍යාකරණයේ ටෝකනය භාවිතා කිරීම ගැන දැන ගැනීමට පෙරය . එබැවින් සමහර පොසික්ස් අනුකූල ෂෙල් වෙඩි ඒවා පිළිගනු ඇතැයි පැවසීම ආරක්ෂිත ය. මගේ ප්‍රකාශය සාමාන්‍ය වියාචකයෙකු ලෙස මම පෙනී සිටිමි. සත්‍ය බෝර්න් කවචයක් හෝ ඊට වඩා පැරණි පැරණි POSIX කවචයක් ඔබ සොයා ගන්නේ නම්, සියලු ඔට්ටු අක්‍රීයයි.
ජී-මෑන් පවසන්නේ 'මොනිකා නැවත
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.