Bash shell භාවිතා කරමින් විධානයක් කිහිප වතාවක් ධාවනය කරන්නේ කෙසේද?


170

විධානයක් (උදා ps aux|grep someprocess) n වාරයක් ධාවනය කිරීමට ක්‍රමයක් තිබේද?

වැනි දෙයක්:

run -n 10  'ps aux|grep someprocess'

මට එය අන්තර්ක්‍රියාකාරීව භාවිතා කිරීමට අවශ්‍යයි, කරුණාකර ස්ක්‍රිප්ට් පළ නොකරන්න.

යාවත්කාලීන කිරීම: මම මෙය විමසීමට හේතුව, මම යන්ත්‍ර රාශියක වැඩ කරන අතර සෑම යන්ත්‍රයක් තුළම එකම ක්‍රියාකාරීත්වයක් ලබා ගැනීම සඳහා මගේ අනුවර්තනය කරන ලද ස්ක්‍රිප්ට් ආදිය සෑම පෙට්ටියකටම ආනයනය කිරීමට මට අවශ්‍ය නැත.


Answers:


224

මේ සඳහා විධානයක් හෝ ෂෙල් බිල්ඩින් එකක් ඇතැයි මම නොසිතමි, එය බෝර්න් ෂෙල් forලූපය සඳහා නිර්මාණය කර ඇති දේවල සුළු උප කුලකයක් වන අතර මේ ආකාරයටම විධානයක් ක්‍රියාත්මක කිරීම තරමක් සරල ය.

ආරම්භකයින් සඳහා ඔබට ව්‍යාජ forලූපයක් භාවිතා කළ හැකිය :

for i in `seq 10`; do command; done

හෝ සමානව ජිම්බිගේ යෝජනාවට අනුව, අනුක්‍රම උත්පාදනය සඳහා Bash buildin භාවිතා කිරීම:

for i in {1..10}; do command; done

මෙය commandසෑම වාරයක්ම දස වතාවක් ක්‍රියාත්මක කරයි - එය පයිප්පයක් හෝ විධාන මාලාවක් ;හෝ වෙන් කළ &&හැකිය. ඔබ සිටින්නේ $iකුමන අනුක්‍රමයදැයි දැන ගැනීමට ඔබට විචල්‍යය භාවිතා කළ හැකිය .

ඔබ මෙම එක්-ලයිනර් පිටපතක් ලෙස සලකන්නේ නම් සහ නිශ්චිතව දක්වා නොමැති (නමුත් සමහර විට වලංගු) හේතුවක් නිසා ඔබට එය විධානයක් ලෙස ක්‍රියාත්මක කළ හැකිය.

#function run
run() {
    number=$1
    shift
    for i in `seq $number`; do
      $@
    done
}

භාවිතය:

run 10 command

උදාහරණයක්:

run 5 echo 'Hello World!'

16
hatmahatmanich, ලූපයක් යනු පිටපතක් නොවේ. අන්තර්ක්‍රියාකාරී පර්යන්තයක ... භාවිතා කිරීම වලක්වන කිසිවක් නැත.
සෝරඩේච්

3
හොඳයි, ඉහත එක් ලයිනර් එය කළ යුතු සම්මත ක්‍රමය වන අතර එය තරමක් සරල ය. එය ඔබට හොඳ නොවන්නේ ඇයි? සමහර විට ඔබ අසන්නේ වැරදි ප්‍රශ්නයද? ඔබගේ ස්ක්‍රිප්ට් වල ප්‍රධාන ඉලක්කය කුමක්ද හෝ ඒවා කිහිප වතාවක් පුනරාවර්තනය කිරීමට ඔබට අවශ්‍ය ඔබේ ක්‍රියාව කුමක්ද? සමහර විට අපි ගැටලුව වෙනත් ආකාරයකින් තැබුවහොත් වඩා හොඳ විසඳුමක් ඇත.
පැට්කොස් සීසාබා

6
@mahatmanich - for නැවත සැකසීම සඳහා සාදන ලද බෑෂ් වේ .
ජිම්බි

3
Ud එඩ්වාඩෝ ඉවානෙක්seq{1..10}
එෆ්වයිඅයි, බාෂ්

1
ඉන්බිල්ට් වරහන අනුක්‍රමය විචල්ය ආදේශනයට සහාය නොදක්වන බව පෙනේ ( stackoverflow.com/a/3737773/713554 බලන්න ). හුවමාරු කර ගත හැකි .bashrcනම්, ඔබ ලබා දුන් ශ්‍රිතය පරිපූර්ණව ක්‍රියා කරයි . {1..$number} `seq $number`
ලියෝ

32

ps aux | grep someprocessවැඩසටහනක වෙනස්කම් ස්ථාවර කාලයක් නැරඹීමට ඔබට අවශ්‍ය බව පෙනේ. එඩ්වාඩෝ ඔබේ ප්‍රශ්නයට හරියටම පිළිතුරු සපයන පිළිතුරක් ලබා දුන් නමුත් විකල්පයක් ඇත watch:

watch 'ps aux | grep someprocess'

කවචය "run watch ps aux" ලෙස අර්ථ නිරූපණය කිරීමෙන් වලක්වා ගැනීම සඳහා මම විධානය තනි උපුටා දැක්වීම් වලට දමා ඇති අතර ප්‍රති result ලය නල මාර්ගයෙන් ලබා ගන්න grep someprocess. පෙර විධානය කිරීමට තවත් ක්‍රමයක් වනුයේ:

watch ps aux \| grep someprocess

පෙරනිමියෙන්, watchසෑම තත්පර දෙකකට වරක් නැවුම් කරයි, එය -nවිකල්පය භාවිතා කර වෙනස් කළ හැකිය. උදාහරණයක් ලෙස, තත්පර 1 ක පරතරයක් අවශ්‍ය නම්:

watch -n 1 'ps aux | grep someprocess'

25

විනෝදය සඳහා පමණි

pgrep ssh ;!!;!!;!!;!!;!!;!!

කරුණාකර යමෙකුට මෙය පැහැදිලි කළ හැකිද? ඉතා කුතුහලය දනවන පෙනුමක්.
ඩැනියෙල් වර්ටනොව්

4
; විධාන බෙදුම්කරු පමණි. !! අන්තිම විධානය bash වලින් නැවත ධාවනය කරන්න. එබැවින් මෙය 'pgrep ssh' ධාවනය කර 6 වතාවක් නැවත ධාවනය කරන්න.
පියොට් කුකියෙල්කා

එය උපදේශාත්මක වන අතර එය බුද්ධිමත් නොවේ. එක් ලයිනර් forහොඳම ක්‍රමය ලෙස පෙනේ. කෙසේ හෝ පිළිතුරට ස්තූතියි.
m3nda

2
cmd ;!!එක් පේළියක වත්මන් රේඛාවට පෙර ඇතුළත් කළ විධානය නැවත නොකරන්නේද ? එය වෙනම historyඇතුළත් කිරීම් දෙකක් විය යුතුය .
ජොයෙල් පුර

1
වෙනුවට ;සමග &&පළමු අසමත් වීම නතර.
user881300

16

පෙර පිළිතුරු වලට සමාන නමුත් ලූප සඳහා අවශ්‍ය නොවේ:

seq 10 | xargs -I -- echo "hello"

තර්ක හෝ විකල්ප නොමැතිව seq සිට xargs දක්වා නල ප්‍රතිදානය


2
මෙය එක් ක්‍රියාත්මක කිරීමක් පමණක් කරනු ඇත echo "hello" 1 2 3 4 5 6 7 8 9 10. -n 1එක් එක් ආදානය (අංකය) සඳහා එක් ක්‍රියාවලියක් සඳහා සහ -P 10සමාන්තරව ක්‍රියාත්මක කිරීම සඳහා (සමාන්තර ක්‍රියාවලි 10 ක් ) සමඟ ඔබ xargs ධාවනය කළ යුතුය . සමඟ අවසන් කිරීම seq 10 | xargs -n 1 -P 10 echo.
ඇලෙක්සැන්ඩර් ක්ලිමෙට්ෂෙක්

16

මේක උත්සාහ කරන්න:

yes ls | head -n5 | bash

මේ සඳහා විධානය උප කවචයකින් ක්‍රියාත්මක කිරීම අවශ්‍ය වේ. වයි.එම්.එම්.වී. මූලික වශයෙන්, ඔබට "ls" N වාරයක් පුනරාවර්තනය කිරීමට "ඔව්" විධානය ලැබේ; "head -n5" පුඩුවක් පුනරාවර්තන 5 කින් අවසන් කළේය. අවසාන නළය ඔබේ අභිමතය පරිදි කවචය යවයි.

අහඹු සිද්ධියක් csh-like අකුරුමය බිල්ට් ඇති repeatවිධාන. ඔබේ විධානය බාෂ් උප කවචයකින් ක්‍රියාත්මක කිරීමට ඔබට එය භාවිතා කළ හැකිය!


6

POSIX මාර්ගය

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04_01

x=10
while [ $x -gt 0 ]; do
    command
    x=$(($x-1))
done

ඇත්ත වශයෙන්ම එය එක් ලයිනර් බවට පත් කළ හැකිය:

x=10; while [ $x -gt 0 ]; do command; x=$(($x-1)); done

එය වඩාත්ම අතේ ගෙන යා හැකි ක්‍රමයක් ලෙස පෙනේ, එම නිසා ඔබ වැඩසටහන් ස්ථාපනය කිරීමට ඇති ඉඩකඩ අඩුය.

පහත දැක්වෙන්නේ අතේ ගෙන යා හැකි ඒවා නොවේ:

  • වරහන ප්‍රසාරණය {1..10}: විශේෂිත විශේෂිත වන අතර තර්කය විශාල නම් විශාල රේඛාවක් ජනනය කරයි
  • seq: ග්නූ
  • yes: ග්නූ

ඔබ අතේ ගෙන යාහැකි ලෙස වෙහෙසට පත් වන්නේ නම්, GNU සලකා බලන්න parallel:

sudo apt-get install parallel
seq 100 | parallel echo {}

එය සමාන්තරව විධාන ක්‍රියාත්මක කරන අතර බොහෝ සිසිල් විකල්ප ඇත.

මෙයද බලන්න: /programming/169511/how-do-i-iterate-over-a-range-of-numbers-defined-by-variables-in-bash


GNU සමාන්තරය ඉතා අතේ ගෙන යා හැකි පරිදි ඉදිකර ඇත. sh, zsh, ksh, සහ bashසියල්ලම බොහෝ වේදිකාවල හොඳින් සහාය දක්වයි. csh, tcsh, fishයම් සහයක් ඇත. parallel --embedඔබ භාවිතා කිරීමෙන් ග්නූ සමාන්තර ස්ථාපනය කර නොමැති වෙනත් පද්ධතියකට පහසුවෙන් ගෙන යා හැකි ස්ක්‍රිප්ටයක් සෑදිය හැකිය.
ඔලේ ටැන්ජ්

2

ඉහත @ එඩ්වාඩෝ-ඉවානෙක්ගේ runක්‍රියාකාරිත්වය මාළු කවචයක් ක්‍රියාත්මක කිරීම

function run
  set number $argv[1]
  for i in (seq $number)
    eval $argv[2..-1]
  end
end

0

එය 'ඔරලෝසුව' වනු ඇත - මුක්කු භාවිතා කරන සෑම යුනික්ස් පද්ධතියකම පාහේ විය යුතුය

පද්ධතියක් තුළ ඔබට fs වෙනස්කම් හෝ වෙනත් ආකාරයකින් සිත්ගන්නාසුලු චලනයන් දැකිය හැකිය. උදාහරණයක් වශයෙන්,

watch "df -hP | grep /tmp" 

ඔබේ විධාන තර්කයක් ලෙස තබන්න (බලන්න man watch)


ඔරලෝසුව සමඟ දැනටමත් පිළිතුරක් ඇත ... පහත බලන්න ...
mahatmanich

0

MacOS හි ඔබට repeatවිධානය භාවිතා කළ හැකිය .

repeat 10 ps aux | grep someprocess
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.