ගොනුවක් වෙනස් වන සෑම විටම විධානයක් ක්‍රියාත්මක කරන්නේ කෙසේද?


469

ගොනුවක් වෙනස් වන සෑම විටම විධානයක් ක්‍රියාත්මක කිරීමට මට ඉක්මන් හා සරල ක්‍රමයක් අවශ්‍යයි. මට ඉතා සරල දෙයක් අවශ්‍යයි, මම ටර්මිනලය මත ධාවනය කර එම ගොනුව සමඟ වැඩ අවසන් වූ සෑම විටම එය වසා දමමි.

දැනට, මම මෙය භාවිතා කරමි:

while read; do ./myfile.py ; done

ඊට පස්සෙ මට ඒ පර්යන්තයට ගිහින් Enterමගේ ගොනුව මගේ සංස්කාරකයේ සුරකින සෑම විටම ඔබන්න . මට අවශ්‍ය දේ මේ වගේ දෙයක්:

while sleep_until_file_has_changed myfile.py ; do ./myfile.py ; done

නැතිනම් වෙනත් විසඳුමක් තරම් පහසුය.

BTW: මම Vim භාවිතා කරන අතර, BufWrite හි යමක් ධාවනය කිරීම සඳහා මට ස්වයංක්‍රීය විධානයක් එක් කළ හැකි බව මම දනිමි, නමුත් මෙය මට දැන් අවශ්‍ය ආකාරයේ විසඳුමක් නොවේ.

යාවත්කාලීන කිරීම: මට හැකි නම් සරල, ඉවත දැමිය හැකි යමක් අවශ්‍යයි. එපමණක්ද නොව, මට වැඩසටහන් ප්‍රතිදානය දැකීමට අවශ්‍ය නිසා ටර්මිනලය තුළ යමක් ධාවනය කිරීමට මට අවශ්‍යය (මට වැරදි පණිවිඩ දැකීමට අවශ්‍යය).

පිළිතුරු ගැන: ඔබගේ සියලු පිළිතුරු වලට ස්තූතියි! ඒවා සියල්ලම ඉතා හොඳයි, සෑම කෙනෙකුම අනෙක් ඒවාට වඩා වෙනස් ප්රවේශයක් ගනී. මට එකක් පමණක් පිළිගැනීමට අවශ්‍ය බැවින්, මම සැබවින්ම භාවිතා කළ දෙය පිළිගනිමි (එය සරල, ඉක්මන් හා පහසුවෙන් මතක තබා ගත හැකි විය), එය වඩාත් අලංකාර නොවන බව මා දැන සිටියත්.


විය හැකි හරස් අඩවි අනුපිටපත: stackoverflow.com/questions/2972765/… (මෙහි එය මාතෘකාව මත වුවද =))
සිරෝ සැන්ටිලි 冠状 病毒 审查 六四

මම හරස් අඩවි අනුපිටපතකට පෙර යොමු කර ඇති අතර එය ප්‍රතික්ෂේප කරන ලදි: එස්;)
ෆ්‍රැන්සිස්කෝ ටැපියා

4
ජොනතන් හාර්ට්ලිගේ විසඳුම මෙහි වෙනත් විසඳුම් මත ගොඩනඟා ඇති අතර ඉහළ ඡන්දය දුන් පිළිතුරු වලට ඇති විශාල ගැටලු විසඳයි: සමහර වෙනස් කිරීම් අතපසු වීම සහ අකාර්යක්ෂම වීම. කරුණාකර ඔහුගේ පිළිගත් පිළිතුර වෙනස් කරන්න, එය github.com/tartley/rerun2 හි (හෝ එම අඩුපාඩු නොමැතිව වෙනත් විසඳුමකට) නඩත්තු කෙරෙමින් පවතී
nealmcb

Answers:


445

Inotifywait භාවිතා කිරීම සරලයි (ඔබේ බෙදාහැරීමේ inotify-toolsපැකේජය ස්ථාපනය කරන්න ):

while inotifywait -e close_write myfile.py; do ./myfile.py; done

හෝ

inotifywait -q -m -e close_write myfile.py |
while read -r filename event; do
  ./myfile.py         # or "./$filename"
done

පළමු ස්නිපටය වඩා සරල ය, නමුත් එය සැලකිය යුතු අවාසියක් ඇත: එය inotifywaitක්‍රියාත්මක නොවන අතරතුර සිදු කරන ලද වෙනස්කම් මග හැරෙනු ඇත (විශේෂයෙන් myfileක්‍රියාත්මක වන අතරතුර ). දෙවන ස්නිපටයට මෙම අඩුපාඩුවක් නොමැත. කෙසේ වෙතත්, ගොනුවේ නම හිස් අවකාශයක් නොමැති බව උපකල්පනය කරන බවට පරිස්සම් වන්න. එය ගැටළුවක් නම්, --formatගොනුවේ නම ඇතුළත් නොකිරීමට ප්‍රතිදානය වෙනස් කිරීමට විකල්පය භාවිතා කරන්න :

inotifywait -q -m -e close_write --format %e myfile.py |
while read events; do
  ./myfile.py
done

කොහොම උනත්, සීමාවක් නැත: සමහර වැඩ විස්ථාපනය නම් myfile.pyවෙනස් ගොනු සමග, වඩා පවතින වෙත ලිඛිතව myfile, inotifywaitමිය යනු ඇත. බොහෝ කතුවරුන් ඒ ආකාරයෙන් වැඩ කරති.

මෙම සීමාව මඟහරවා ගැනීම සඳහා inotifywait, නාමාවලියෙහි භාවිතා කරන්න:

inotifywait -e close_write,moved_to,create -m . |
while read -r directory events filename; do
  if [ "$filename" = "myfile.py" ]; then
    ./myfile.py
  fi
done

විකල්පයක් ලෙස, ඉන්ක්‍රොන් (ගොනුවක් වෙනස් කළ විට සිදුවීම් ලියාපදිංචි කිරීමට ඔබට ඉඩ සලසයි) හෝ fswatch ( ලිනක්ස්ගේ ඉනෝටිෆයි හි එක් එක් ප්‍රභේදයේ ඇනලොග් භාවිතා කරමින් වෙනත් බොහෝ යුනික්ස් ප්‍රභේදවල ද ක්‍රියා කරන මෙවලමක් ) වැනි එකම යටින් පවතින ක්‍රියාකාරිත්වය භාවිතා කරන තවත් මෙවලමක් භාවිතා කරන්න .


48
මම මේ සියල්ලම ( sleep_until_modified.sh
බාෂ්

14
while sleep_until_modified.sh derivation.tex ; do latexmk -pdf derivation.tex ; doneනියමයි. ඔබට ස්තුතියි.
රයිස් උලරිච්

6
inotifywait -e delete_selfමට හොඳින් වැඩ කරන බවක් පෙනේ.
කොස්

3
එය සරල නමුත් වැදගත් කාරණා දෙකක් ඇත: සිදුවීම් මඟ හැරිය හැක (ලූපයේ ඇති සියලුම සිදුවීම්) සහ ඉනෝටිෆයිට් ආරම්භ කිරීම සෑම අවස්ථාවකම සිදු කරනු ලබන අතර එමඟින් විශාල පුනරාවර්තන ෆෝල්ඩර සඳහා මෙම විසඳුම මන්දගාමී වේ.
වර්නයිට්

7
කිසියම් හේතුවක් නිසා while inotifywait -e close_write myfile.py; do ./myfile.py; doneසෑම විටම විධානය ක්‍රියාත්මක නොකර පිටවෙයි (bash සහ zsh). මෙය ක්‍රියාත්මක කිරීම සඳහා මට එකතු කිරීමට අවශ්‍ය විය || true, උදා: while inotifywait -e close_write myfile.py || true; do ./myfile.py; done
ideasman42

185

entr ( http://entrproject.org/ ) inotify සඳහා වඩාත් මිත්‍රශීලී අතුරු මුහුණතක් සපයයි (තවද * BSD & Mac OS X සඳහා සහය දක්වයි).

එය නැරඹීමට බහු ලිපිගොනු නියම කිරීම ඉතා පහසු කරයි (සීමා කර ඇත්තේ ulimit -n)

$ find . -name '*.py' | entr ./myfile.py

මා දැනට වෙනස් කරන කේතය සඳහා ඒකක පරීක්ෂණ ක්‍රියාත්මක කිරීම සඳහා මම එය මගේ සම්පූර්ණ ව්‍යාපෘති ප්‍රභව ගසෙහි භාවිතා කර ඇති අතර එය දැනටමත් මගේ කාර්ය ප්‍රවාහයට විශාල රුකුලක් වී තිබේ.

-c(ධාවකයන් අතර තිරය -dඉවත් කරන්න ) සහ (අධීක්ෂණය කරන ලද නාමාවලියකට නව ගොනුවක් එක් කළ විට පිටවීම ) වැනි ධජ ඊටත් වඩා නම්‍යශීලී බවක් එක් කරයි, උදාහරණයක් ලෙස ඔබට කළ හැකිය:

$ while sleep 1 ; do find . -name '*.py' | entr -d ./myfile.py ; done

2018 මුල් භාගය වන විට එය තවමත් ක්‍රියාකාරී සංවර්ධනයක පවතින අතර එය ඩේබියන් සහ උබුන්ටු ( apt install entr); කතුවරයාගේ ගබඩාවෙන් ගොඩනැගීම ඕනෑම අවස්ථාවක වේදනා රහිත විය.


3
නව ලිපිගොනු සහ ඒවායේ වෙනස් කිරීම් හසුරුවන්නේ නැත.
වර්නයිට්

2
Ern වර්නයිට් - 2014 මැයි 7 වන විට නව -dධජය එන්ටර් සතුව ඇත ; එය තරමක් දිගු සුළං සහිත ය, නමුත් ඔබට while sleep 1 ; do find . -name '*.py' | entr -d ./myfile.py ; doneනව ලිපිගොනු සමඟ කටයුතු කිරීමට කළ හැකිය .
පෝල් ෆෙනී

1
අවම වශයෙන් ඩෙබියන් ජෙසී / 8.2 සිට ඩෙබියන් ගබඩාවලින් ද එන්ටර් ලබා ගත හැකිය ...
පීටර් වී. මාර්ච්

5
OS X හි මා සොයාගත් හොඳම එක නිසැකවම. fswatch බොහෝ විනෝදජනක සිදුවීම් අල්ලා ගන්නා අතර එයට හේතුව සොයා ගැනීමට මට කාලය ගත කිරීමට අවශ්‍ය නැත
dtc

5
හෝම්බ rew හි එන්ටර් ලබා ගත හැකි බව සඳහන් කිරීම වටී , එබැවින් brew install entrඅපේක්ෂිත පරිදි ක්‍රියාත්මක වනු ඇත
jmarceli

113

වෙනස් වූ විට එය හරියටම කිරීමට මම පයිතන් වැඩසටහනක් ලිව්වෙමි .

භාවිතය සරලයි:

when-changed FILE COMMAND...

හෝ බහු ගොනු බැලීමට:

when-changed FILE [FILE ...] -c COMMAND

FILEනාමාවලියක් විය හැකිය. සමඟ පුනරාවර්තනයෙන් නරඹන්න -r. %fගොනු නාමය විධානයට යැවීමට භාවිතා කරන්න .


1
@ysangkok ඔව් එය කේතයේ නවතම අනුවාදයේ ඇත :)
joh

5
දැන් "වෙනස් කළ විට නල ස්ථාපනය" වෙතින් ලබා ගත හැකිය. තවමත් හොඳින් ක්‍රියාත්මක වේ. ස්තූතියි.
ඒඑල් ෆ්ලැනගන්

2
පළමුව තිරය ඉවත් කිරීමට ඔබට භාවිතා කළ හැකිය when-changed FILE 'clear; COMMAND'.
ඩේව් ජේම්ස් මිලර්

1
වින්ඩෝස් වලද මට එය කළ හැකි නිසා මෙම පිළිතුර වඩා හොඳය. මේ මිනිහා ඇත්තටම පිළිතුරක් ලබා ගැනීමට වැඩසටහනක් ලිව්වා.
වුල්ෆ් පැක්'08

4
හැමෝටම සුභ ආරංචියක්! when-changedදැන් හරස් වේදිකාවක්! නවතම 0.3.0 නිකුතුව බලන්න :)
joh

54

මෙම පිටපත ගැන කුමක් කිව හැකිද? එය statගොනුවකට ප්‍රවේශ වීමේ වේලාව ලබා ගැනීම සඳහා විධානය භාවිතා කරන අතර ප්‍රවේශ වේලාවේ වෙනසක් සිදු වූ විට (ගොනුවට ප්‍රවේශ වන සෑම අවස්ථාවකම) විධානයක් ක්‍රියාත්මක කරයි.

#!/bin/bash

### Set initial time of file
LTIME=`stat -c %Z /path/to/the/file.txt`

while true    
do
   ATIME=`stat -c %Z /path/to/the/file.txt`

   if [[ "$ATIME" != "$LTIME" ]]
   then    
       echo "RUN COMMAND"
       LTIME=$ATIME
   fi
   sleep 5
done

3
කැමතිද statවිකරිත කාලය වඩා හොඳ විය පිළිතුර "ගොනුව වෙනස් සෑම අවස්ථාවකදීම" -ing?
Xen2050

1
සංඛ්‍යා ලේඛන තත්පරයට බොහෝ වාරයක් ධාවනය කිරීමෙන් බොහෝ දෙනෙක් තැටියට කියවිය හැකිද? නැතහොත් fstat පද්ධති ඇමතුම ස්වයංක්‍රීයව මෙම ප්‍රතිචාර කෙසේ හෝ හැඹිලිගත කරයිද? මම වෙනස්කම් සිදුකරන සෑම අවස්ථාවකම මගේ සී කේතය සම්පාදනය කිරීම සඳහා යම් ආකාරයක 'ග්‍රන්ට් ඔරලෝසුවක්' ලිවීමට උත්සාහ කරමි
ඔස්කෙන්සෝ කාෂි

කල්තියා නැරඹිය යුතු ගොනු නාමය ඔබ දන්නේ නම් මෙය හොඳයි. ගොනු නාමය ස්ක්‍රිප්ටයට යැවීම වඩා හොඳය. ඔබට බොහෝ ගොනු නාමයන් සමත් කළ හැකි නම් වඩා හොඳ වනු ඇත (උදා: "mywatch * .py"). තවත් සමහර විසඳුම් මගින් උප ඩයිඩර්වල ඇති ලිපිගොනු වල පුනරාවර්තන ලෙස ක්‍රියා කළ හැකි නම් වඩා හොඳය.
ජොනතන් හාර්ට්ලි

5
යමෙකු අධික කියවීම් ගැන කල්පනා කරන්නේ නම්, මම මෙම පිටපත උබුන්ටු 17.04 හි 0.05s නින්දකින් සහ vmstat -dතැටි ප්‍රවේශය සඳහා පරීක්ෂා කර බැලුවෙමි . මේ ආකාරයේ
හැඹිලිගත කිරීමේදී


30

Vim භාවිතා කරමින් විසඳුම:

:au BufWritePost myfile.py :silent !./myfile.py

නමුත් මට මෙම විසඳුම අවශ්‍ය නොවන්නේ එය ටයිප් කිරීම තරමක් කරදරකාරී නිසා, ටයිප් කළ යුතු දේ මතක තබා ගැනීම ටිකක් අමාරුයි, හරියටම, සහ එහි බලපෑම් අහෝසි කිරීම ටිකක් අපහසුයි (ධාවනය කිරීමට අවශ්‍යයි :au! BufWritePost myfile.py). ඊට අමතරව, විධානය ක්‍රියාත්මක වන තුරු මෙම විසඳුම Vim අවහිර කරයි.

මම මෙම විසඳුම සම්පුර්ණත්වය සඳහා මෙහි එකතු කර ඇත්තෙමි, එය අනෙක් අයට උපකාරී වනු ඇත.

ක්‍රමලේඛ ප්‍රතිදානය ප්‍රදර්ශනය කිරීම සඳහා (සහ ඔබේ සංස්කරණ ප්‍රවාහය සම්පූර්ණයෙන්ම කඩාකප්පල් කරන්න, ප්‍රතිදානය තත්පර කිහිපයක් සඳහා ඔබේ සංස්කාරකයට ඉහලින් ලියනු ඇත, ඔබ Enter ඔබන්න තෙක්), :silentවිධානය ඉවත් කරන්න .


1
entr(පහත බලන්න) සමඟ සංයෝජනය වන විට මෙය තරමක් හොඳ විය හැකිය - එන්ටර් නරඹමින් සිටින ව්‍යාජ ගොනුවක් ස්පර්ශ කර, ඉතිරි කොටස පසුබිමේ කිරීමට ඉඩ දෙන්න ... නැතහොත් tmux send-keysඔබ එවැනි පරිසරයක සිටියහොත් :)
පෝල් ෆෙනී

හොඳයි! ඔබේ .vimrcගොනුව සඳහා ඔබට
සාර්වයක් සෑදිය හැකිය

23

ඔබ npmස්ථාපනය කර ඇත්නම්, nodemonආරම්භ කිරීමට ඇති පහසුම ක්‍රමය, විශේෂයෙන් OS X මත, පෙනෙන ආකාරයට inotify මෙවලම් නොමැත. ෆෝල්ඩරයක් වෙනස් වූ විට එය විධානයක් ක්‍රියාත්මක කිරීමට සහාය වේ.


5
කෙසේ වෙතත්, එය නරඹන්නේ .js සහ .coffee ගොනු පමණි.
zelk

6
වත්මන් අනුවාදය ඕනෑම විධානයකට සහය දක්වන බව පෙනේ, උදාහරණයක් ලෙස: nodemon -x "bundle exec rspec" spec/models/model_spec.rb -w app/models -w spec/models
kek

1
මට තවත් තොරතුරු තිබිය යුතු යැයි මම ප්‍රාර්ථනා කරමි, නමුත් osx හි වෙනස්කම් සොයා ගැනීමට ක්‍රමයක් ඇත, fsevents
ConstantineK

1
OS X හි ඔබට මගේ සබැඳියේ පෙන්වා ඇති පරිදි යතුරක් සමඟ දියත් ඩීමන්ස් භාවිතා කළ හැකිය WatchPaths.
ඇඩම් ජෝන්ස්

22

inotify-toolsමා වැනි ස්ථාපනය කළ නොහැකි අයට මෙය ප්‍රයෝජනවත් විය යුතුය:

watch -d -t -g ls -lR

ප්‍රතිදානය වෙනස් වූ විට මෙම විධානය පිටව ls -lRයනු ඇත, සෑම ගොනුවක්ම සහ නාමාවලියක්ම එහි ප්‍රමාණය හා දිනයන් සමඟ ලැයිස්තුගත කරයි, එබැවින් ගොනුවක් වෙනස් වුවහොත් එය මිනිසා පවසන පරිදි විධානයෙන් පිටවිය යුතුය:

-g, --chgexit
          Exit when the output of command changes.

මෙම පිළිතුර කිසිවෙකු විසින් කියවා නොතිබිය හැකි බව මම දනිමි, නමුත් යමෙකු එයට ළඟා වනු ඇතැයි මම බලාපොරොත්තු වෙමි.

විධාන රේඛා උදාහරණය:

~ $ cd /tmp
~ $ watch -d -t -g ls -lR && echo "1,2,3"

වෙනත් පර්යන්තයක් විවෘත කරන්න:

~ $ echo "testing" > /tmp/test

දැන් පළමු පර්යන්තය ප්‍රතිදානය කරයි 1,2,3

සරල ස්ක්‍රිප්ට් උදාහරණය:

#!/bin/bash
DIR_TO_WATCH=${1}
COMMAND=${2}

watch -d -t -g ls -lR ${DIR_TO_WATCH} && ${COMMAND}

5
නියම හැක්. මම පරීක්‍ෂා කළ අතර ලැයිස්තුගත කිරීම දිගු වන විට සහ වෙනස් කළ ගොනුව තිරයෙන් පිටත වැටෙන විට එය ගැටළුවක් ඇති බව පෙනේ. කුඩා වෙනස් කිරීමක් මේ වගේ දෙයක් විය හැකිය: watch -d -t -g "ls -lR tmp | sha1sum"
Atle

3
ඔබ සෑම තත්පරයකදීම ඔබේ විසඳුම නරඹන්නේ නම්, එය සදහටම ක්‍රියාත්මක වන අතර සමහර ගොනු වෙනස් වුවහොත් පමණක් MY_COMMAND ධාවනය කරන්න: watch -n1 "watch -d -t -g ls -lR && MY_COMMAND"
mnesarco

මගේ ඔරලෝසුවේ අනුවාදය (ලිනක්ස් මත watch from procps-ng 3.3.10) එහි පරතරය සඳහා පාවෙන තත්පර භාර ගනී, එබැවින් watch -n0.2 ...සෑම තත්පරයෙන් පහෙන් පංගුවක් ඡන්දය දෙනු ඇත. සෞඛ්‍ය සම්පන්න උප මිලි තත්පර පරීක්ෂණ සඳහා හොඳයි.
ජොනතන් හාර්ට්ලි

18

rerun2( github මත ) යනු පෝරමයේ පේළි 10 ක බෑෂ් පිටපතකි:

#!/usr/bin/env bash

function execute() {
    clear
    echo "$@"
    eval "$@"
}

execute "$@"

inotifywait --quiet --recursive --monitor --event modify --format "%w%f" . \
| while read change; do
    execute "$@"
done

ඔබගේ PATH හි 'නැවත ධාවනය' ලෙස ගිතුබ් අනුවාදය සුරකින්න, එය භාවිතා කර එය භාවිතා කරන්න:

rerun COMMAND

ඔබගේ වර්තමාන නාමාවලිය තුළ ගොනු පද්ධති වෙනස් කිරීමේ සිදුවීමක් ඇති සෑම අවස්ථාවකම එය COMMAND ධාවනය කරයි (පුනරාවර්තන.)

ඒ සඳහා යමෙකු කැමති විය හැකි දේවල්:

  • එය inotify භාවිතා කරයි, එබැවින් ඡන්ද විමසීමට වඩා ප්‍රතිචාර දක්වයි. ඔබ 'සුරකින්න' පහර දෙන සෑම අවස්ථාවකම උප මිලි තත්පර පරීක්ෂණ ක්‍රියාත්මක කිරීම හෝ ග්‍රැෆ්විස් තිත් ගොනු විදහා දැක්වීම සඳහා විශිෂ්ටයි.
  • එය ඉතා වේගවත් බැවින්, කාර්ය සාධන හේතූන් මත විශාල උපසිරැසි (node_modules වැනි) නොසලකා හැරීමට ඔබට එය කරදර විය යුතු නැත.
  • එය අතිරේක සුපිරි ප්‍රතිචාරාත්මක වේ, මන්ද එය ආරම්භයේදී එය ක්‍රියාත්මක කිරීම වෙනුවට එක් වරක් පමණක් inotifywait ලෙස හඳුන්වන අතර සෑම නැවතීමේ ක්‍රියාවලියකදීම ඔරලෝසු පිහිටුවීමේ මිල අධික පහරක් එල්ල කරයි.
  • එය බාෂ්ගේ පේළි 12 ක් පමණි
  • එය Bash නිසා, එය ඔබ විසින් සම්මත කරන ලද විධානයන් හරියටම Bash විමසුමේදී ටයිප් කළ ආකාරයටම අර්ථ නිරූපණය කරයි. (ඔබ වෙනත් කවචයක් භාවිතා කරන්නේ නම් මෙය සිසිල් නොවේ.)
  • මෙම පිටුවේ ඇති අනෙකුත් බොහෝ inotify විසඳුම් මෙන් නොව, COMMAND ක්‍රියාත්මක වන විට සිදුවන සිදුවීම් නැති නොවේ.
  • පළමු සිදුවීමේදී, එය තත්පර 0.15 ක් සඳහා 'මළ කාල පරිච්ඡේදයකට' ඇතුල් වන අතර, අනෙක් සිදුවීම් නොසලකා හරිනු ලැබේ, COMMAND හරියටම එක් වරක් ක්‍රියාත්මක වීමට පෙර. මෙය එසේ වන්නේ බෆරයක් සුරකින විට Vi හෝ Emacs විසින් නිර්මාණය කරන-ලිවීමේ-චලනය වන නර්තනය නිසා ඇති වන සිදුවීම්වල වේගවත් බව නිසා මන්දගාමී පරීක්ෂණ කට්ටලයක් බහු වෙහෙසකාරී utions ාතන සිදු නොවේ. COMMAND ක්‍රියාත්මක වන විට සිදුවන ඕනෑම සිදුවීමක් නොසලකා හරිනු නොලැබේ - ඒවා දෙවන මළ කාල පරිච්ඡේදයක් හා පසුව ක්‍රියාත්මක කිරීමට හේතු වේ.

යමෙකුට අකමැති විය හැකි දේවල්:

  • එය inotify භාවිතා කරයි, එබැවින් ලිනක්ස්ලන්ඩ් වලින් පිටත ක්‍රියා නොකරනු ඇත.
  • එය inotify භාවිතා කරන හෙයින්, උපරිම පරිශීලක inotify ඔරලෝසු සංඛ්‍යාවට වඩා වැඩි ලිපිගොනු අඩංගු නාමාවලි නැරඹීමට එය බාධා කරයි. පෙරනිමියෙන්, මෙය මා භාවිතා කරන විවිධ යන්ත්‍ර මත 5,000 සිට 8,000 දක්වා සකසා ඇති බව පෙනේ, නමුත් වැඩි කිරීමට පහසුය. Https://unix.stackexchange.com/questions/13751/kernel-inotify-watch-limit-reached බලන්න
  • Bash අන්වර්ථයන් අඩංගු විධාන ක්‍රියාත්මක කිරීමට එය අසමත් වේ. මට දිවුරන්න පුළුවන් මේක වැඩ කළා කියලා. ප්‍රතිපත්තිමය වශයෙන්, මෙය බාෂ් වන අතර, කොමාන්ඩ් උපසිරැසියකින් ක්‍රියාත්මක නොකිරීම නිසා, මෙය ක්‍රියාත්මක වනු ඇතැයි මම අපේක්ෂා කරමි. මම අහන්න කැමතියි එය එසේ නොවන්නේ මන්දැයි යමෙකු දන්නේ නම්. මෙම පිටුවේ ඇති වෙනත් බොහෝ විසඳුම් වලට එවැනි විධානයන් ක්‍රියාත්මක කළ නොහැක.
  • පුද්ගලිකව මම ප්‍රාර්ථනා කරන්නේ එය ක්‍රියාත්මක වන පර්යන්තයේ යතුරක් එබීමට මට හැකි වූ බවයි. මට මෙය කෙසේ හෝ එකතු කළ හැකිද? සමගාමීව ක්‍රියාත්මක වන 'කියවන අතරතුර -n1' ලූපය ක්‍රියාත්මක වන ලෙසද හඳුන්වයි?
  • මේ මොහොතේ මම එය කේතනය කර ඇත්තේ පර්යන්තය ඉවත් කර ක්‍රියාත්මක කරන ලද COMMAND මුද්‍රණය කිරීමට ය. සමහර අය මේ වගේ දේවල් අක්‍රිය කිරීම සඳහා විධාන රේඛා කොඩි එක් කිරීමට කැමති විය හැකිය. නමුත් මෙය ප්‍රමාණය හා සංකීර්ණත්වය බොහෝ ගුණයකින් වැඩි කරයි.

මෙය @ cychoi's anwer හි ශෝධනයකි.


2
අවකාශයන් අඩංගු තර්ක සමඟ නිසියාකාරව වැඩ කිරීම සඳහා ඔබ "$@"ඒ වෙනුවට භාවිතා කළ යුතු යැයි මම විශ්වාස කරමි $@. නමුත් ඔබ භාවිතා evalකරන අතරම, නැවත ධාවනය කිරීමේ පරිශීලකයා උපුටා දැක්වීමේදී අමතර ප්‍රවේශම් වීමට බල කරයි.
ඩෙනිල්සන් එස් මායා

ස්තූතියි ඩෙනිල්සන්. උපුටා දැක්වීම් පරිස්සමින් කළ යුතු තැන පිළිබඳ උදාහරණයක් ඔබට දිය හැකිද? මම පසුගිය පැය 24 පුරාම එය භාවිතා කර ඇති අතර මේ වන විට අවකාශයන් පිළිබඳ කිසිදු ගැටළුවක් දැක නැත, කිසිවක් ප්‍රවේශමෙන් උපුටා දක්වා නැත rerun 'command'. ඔබ කියන්නේ මම "$ @" භාවිතා කළහොත් පරිශීලකයාට rerun command(උපුටා දැක්වීම් නොමැතිව) ආයාචනා කළ හැකි බවයි. එය මට එතරම් ප්‍රයෝජනවත් නොවන බව පෙනේ: සාමාන්‍යයෙන් බාෂ් එය සම්මත කිරීමට පෙර කිසිදු විධානයක් සැකසීමට මා කැමති නැත. නැවත ධාවනය කිරීමට. උදා: විධානයෙහි "echo $ myvar" අඩංගු වේ නම්, එක් එක් නැවතීමේ දී myvar හි නව අගයන් දැකීමට මට අවශ්‍ය වනු ඇත.
ජොනතන් හාර්ට්ලි

1
වගේ rerun foo "Some File"දෙයක් කැඩෙන්න පුළුවන්. නමුත් ඔබ භාවිතා කරන evalබැවින් එය නැවත ලිවිය හැකිය rerun 'foo "Some File". සමහර විට මාර්ග ප්‍රසාරණය අවකාශයන් හඳුන්වා දිය හැකි බව සලකන්න: rerun touch *.fooබොහෝ විට බිඳී යනු ඇති අතර භාවිතයට rerun 'touch *.foo'තරමක් වෙනස් අර්ථකථන ඇත (මාර්ග ප්‍රසාරණය සිදුවන්නේ එක් වරක් හෝ කිහිප වතාවක් පමණි).
ඩෙනිල්සන් එස් මායා

උදව්වට ස්තූතියි. ඔව්: rerun ls "some file"අවකාශය නිසා කැඩී යයි. rerun touch *.foo*සාමාන්‍යයෙන් හොඳින් ක්‍රියා කරයි, නමුත් * .foo හා ගැලපෙන ගොනු නාමයන් අවකාශයන් අඩංගු නම් අසමත් වේ. rerun 'touch *.foo'විවිධ අර්ථකථන ඇති ආකාරය බැලීමට මට උදව් කිරීම ගැන ස්තූතියි , නමුත් තනි උපුටා දැක්වීම් සහිත අනුවාදය මට අවශ්‍ය අර්ථකථනය යැයි මම සැක කරමි: නැවත ක්‍රියාත්මක කිරීමේ සෑම ක්‍රියාවලියක්ම මම නැවත විධානය ටයිප් කළ ආකාරයට ක්‍රියා කිරීමට මට අවශ්‍යය - එබැවින් *.fooඑක් එක් නැවතීමේ ක්‍රියාවලිය පුළුල් කිරීමට මට අවශ්‍යය . ඒවායේ බලපෑම් පරීක්ෂා කිරීමට මම ඔබේ යෝජනා උත්සාහ කරමි ...
ජොනතන් හාර්ට්ලි

මෙම PR ( github.com/tartley/rerun2/pull/1 ) සහ වෙනත් අය පිළිබඳ වැඩි සාකච්ඡාවක් .
ජොනතන් හාර්ට්ලි

12

මෙන්න සරල කවචයක් බෝර්න් ෂෙල් පිටපත:

  1. තර්ක දෙකක් ගනී: අධීක්ෂණය කළ යුතු ගොනුව සහ විධානයක් (අවශ්‍ය නම් තර්ක සමඟ)
  2. ඔබ අධීක්ෂණය කරන ගොනුව / tmp නාමාවලියට පිටපත් කරයි
  3. ඔබ අධීක්ෂණය කරන ගොනුව පිටපතට වඩා අළුත් දැයි බැලීමට සෑම තත්පර දෙකකට වරක් පරීක්ෂා කරයි
  4. එය අළුත් නම් එය පිටපත අළුත් මුල් පිටපත සමඟ නැවත ලියන අතර විධානය ක්‍රියාත්මක කරයි
  5. ඔබ Ctr-C එබූ විට එය පිරිසිදු කරයි

    #!/bin/sh  
    f=$1  
    shift  
    cmd=$*  
    tmpf="`mktemp /tmp/onchange.XXXXX`"  
    cp "$f" "$tmpf"  
    trap "rm $tmpf; exit 1" 2  
    while : ; do  
        if [ "$f" -nt "$tmpf" ]; then  
            cp "$f" "$tmpf"  
            $cmd  
        fi  
        sleep 2  
    done  
    

මෙය FreeBSD මත ක්‍රියා කරයි. මට සිතිය හැකි එකම අතේ ගෙන යා හැකි ගැටලුව වන්නේ වෙනත් යුනික්ස් වලට mktemp (1) විධානය නොමැති නම්, නමුත් එවැනි අවස්ථාවක ඔබට තාවකාලික ගොනු නාමය තදින් කේත කළ හැකිය.


9
ඡන්දය ප්‍රකාශ කිරීම එකම අතේ ගෙන යා හැකි ක්‍රමයයි, නමුත් බොහෝ පද්ධතිවල ගොනු වෙනස් කිරීමේ දැනුම්දීමේ යාන්ත්‍රණයක් ඇත (ලිනක්ස් මත inotify, FreeBSD හි kqueue, ...). ඔබ එසේ කරන විට ඔබට දැඩි උපුටා දැක්වීමේ ගැටලුවක් ඇත $cmd, නමුත් වාසනාවකට එය පහසුවෙන් නිවැරදි කළ හැකිය: cmdවිචල්‍යය ඉවත් කර ක්‍රියාත්මක කරන්න "$@". ඔබගේ ස්ක්‍රිප්ට් විශාල ගොනුවක් අධීක්ෂණය කිරීම සඳහා සුදුසු නොවේ, නමුත් එය ප්‍රතිස්ථාපනය cpකිරීමෙන් නිවැරදි කළ හැකිය touch -r(ඔබට අවශ්‍ය වන්නේ දිනය පමණි, අන්තර්ගතය නොවේ). අතේ ගෙන යා හැකි ලෙස, -ntපරීක්ෂණයට bash, ksh හෝ zsh අවශ්‍ය වේ.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

8

Incron දෙස බලන්න . එය ක්‍රෝන් වලට සමාන ය, නමුත් කාලය වෙනුවට inotify සිදුවීම් භාවිතා කරයි.


මෙය වැඩ කිරීමට හැකි නමුත් මෙම පිටුවේ ඇති වෙනත් විසඳුම් හා සසඳන විට අක්‍රමිකතා ඇතුළත් කිරීමක් සෑදීම ශ්‍රම දායක ක්‍රියාවලියකි.
ජොනතන් හාර්ට්ලි

8

ඔබ නෝඩ්මන් ස්ථාපනය කර ඇත්නම්, ඔබට මෙය කළ හැකිය:

nodemon -w <watch directory> -x "<shell command>" -e ".html"

මගේ නඩුවේදී මම දේශීයව html සංස්කරණය කර ගොනුවක් වෙනස් වූ විට එය මගේ දුරස්ථ සේවාදායකයට යවනු ලැබේ.

nodemon -w <watch directory> -x "scp filename jaym@jay-remote.com:/var/www" -e ".html"

6

NodeJs සමඟ තවත් විසඳුමක්, fsmonitor :

  1. ස්ථාපනය කරන්න

    sudo npm install -g fsmonitor
    
  2. විධාන රේඛාවෙන් (උදාහරණයක් ලෙස, එක් ලොග් ගොනුවක් වෙනස් වුවහොත් ලොග් අධීක්ෂණය සහ "සිල්ලර")

    fsmonitor -s -p '+*.log' sh -c "clear; tail -q *.log"
    

පැති සටහන: උදාහරණය මගින් විසඳිය හැකිය tail -F -q *.log, මම සිතමි.
වොල්කර් සීගල්

එය උදාහරණයක් දීමට පමණි , පර්යන්තය tail -fනොවේ clear.
ආටිකා

6

විශේෂයෙන් මෙම ප්ලගිනය සමඟ ආරක්ෂකයා දෙස බලන්න:

https://github.com/hawx/guard-shell

ඔබේ ව්‍යාපෘතියේ නාමාවලියෙහි ඇති ඕනෑම රටා ගණනක් බැලීමට ඔබට එය සැකසිය හැකි අතර වෙනස්කම් සිදු වූ විට විධාන ක්‍රියාත්මක කරන්න. ඔබ මුලින් කිරීමට උත්සාහ කරන දේ සඳහා ප්ලගිනයක් තිබීම හොඳ අවස්ථාවක්.


5

ලිනක්ස් යටතේ:

man watch

watch -n 2 your_command_to_run

සෑම තත්පර 2 කට වරක් විධානය ක්‍රියාත්මක කරයි.

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


එය තරමක් සරල ය, තරමක් නාස්තියක් වුවද, මෝස්තර වලට සජීවී වෙනස්කම් කිරීම වැනි සංවර්ධන කාර්යයන් සඳහා පහසුය.
Xeoncross

2
විධානය ක්‍රියාත්මක වීමට තත්පර දෙකකට වඩා ගත වූ විට කුමක් සිදුවේද?
තිස්වෙනි වර්‍ගය

@thirtythreeforty උබුන්ටු පිළිබඳ ඉක්මන් අත්හදා බැලීමකින් පෙන්නුම් කරන්නේ විධානය ක්‍රියාත්මක වීමට කොපමණ කාලයක් ගත වුවද ඔරලෝසුව තත්පර දෙකේ සම්පූර්ණ කාලයක් බලා සිටින බවයි. FWIW, නින්දේ කාලය '-n' සමඟ නියම කළ හැකිය, අවම වශයෙන් තත්පර 0.1 දක්වා.
ජොනතන් හාර්ට්ලි

මෙය ප්‍රශ්නයට පිළිතුරු නොදෙන අතර වරින් වර වැඩසටහනක් ක්‍රියාත්මක කරයි.
dirdi

5

වොච්ඩෝග් යනු පයිතන් ව්‍යාපෘතියක් වන අතර එය ඔබ සොයන දේ පමණක් විය හැකිය:

සහාය දක්වන වේදිකා

  • ලිනක්ස් 2.6 (inotify)
  • මැක් ඕඑස් එක්ස් (FSEvents, kqueue)
  • FreeBSD / BSD (kqueue)
  • වින්ඩෝස් (I / O සම්පුර්ණ කරන ලද වරායන් සහිත ReadDirectoryChangesW; ReadDirectoryChangesW සේවක නූල්)
  • ඕඑස්-ස්වාධීන (ඩිරෙක්ටරි ස්නැප්ෂොට් සඳහා තැටිය ඡන්දය දීම සහ වරින් වර සංසන්දනය කිරීම; මන්දගාමී සහ නිර්දේශ නොකරයි)

ඒ සඳහා විධාන රේඛා එතුමක් ලියා ඇත watchdog_exec:

උදාහරණ ධාවනය වේ

වත්මන් ඩිරෙක්ටරියේ ලිපිගොනු සහ ෆෝල්ඩර සම්බන්ධ වන fs සිද්ධියේදී, echo $src $dstවිධානය ක්‍රියාත්මක කරන්න, එය fs සිද්ධිය වෙනස් නොකළහොත් python $srcවිධානය ක්‍රියාත්මක කරන්න.

python -m watchdog_exec . --execute echo --modified python

කෙටි තර්ක භාවිතා කිරීම, සහ සිදුවීම් " ප්‍රධාන .py" සම්බන්ධ වූ විට පමණක් ක්‍රියාත්මක කිරීමට සීමා කිරීම :

python -m watchdog_exec . -e echo -a echo -s __main__.py

සංස්කරණය කරන්න: වොච්ඩෝග් වෙත නිල සීඑල්අයි නමින් ඇමතුමක් ලැබී ඇති watchmedoබැවින් එයද පරීක්ෂා කරන්න.


4

ඔබේ වැඩසටහන මඟින් යම් ආකාරයක ලොග් / ප්‍රතිදානයක් ජනනය කරන්නේ නම්, ඔබේ ස්ක්‍රිප්ට් එක මත රඳා පවතින එම ලොග් / ප්‍රතිදානය සඳහා රීතියක් සහිත මේක්ෆයිල් එකක් සාදාගත හැකිය.

while true; do make -s my_target; sleep 1; done

විකල්පයක් ලෙස, ඔබට ව්‍යාජ ඉලක්කයක් නිර්මාණය කළ හැකි අතර ඒ සඳහා රීතිය ඔබේ ස්ක්‍රිප්ට් අමතා ව්‍යාජ ඉලක්කය ස්පර්ශ කරන්න (තවමත් ඔබගේ ස්ක්‍රිප්ට් මත පදනම්ව).


11
while sleep 1 ; do something ; doneවඩා තරමක් හොඳයි while true ; do something ; sleep 1 ; done. Ctrl + C එබීමේදී අවම වශයෙන් එය පහසුවෙන් නතර වේ.
ඩෙනිල්සන් එස් මායා

නින්ද ඉවත් කිරීමෙන් කාර්යබහුල ලූපයක් (CPU තාපය ජනනය කරන අතර ලැප්ටොප් එකක බැටරි ආයු කාලය රිදවයි)?
ස්ටීවන් ලූ

2
Te ස්ටීවන්ලු: නැහැ, නින්ද කාර්යබහුල කාලයක් නොවේ. ගැටළුව වන්නේ නින්ද ශරීරයේ තිබේ නම්, පාලක-සී නින්ද විනාශ කරන අතර ලූපය නැවත ආරම්භ වේ. ලූපය ආරම්භ කිරීමේ බලය භාවිතය සුළුපටු නොවේ. ටර්මිනලය තුළ එය ඔබම උත්සාහ කරන්න. ඔබට ශරීරයේ නින්දක් ඇත්නම් එය ක්‍රියාත්මක වීමට පාලක-සී රඳවා තබා ගත යුතුය.
ජැනස් ට්‍රොල්සන්

හරි. මම හිතන්නේ මට එය මග හැරී ඇති අතර නින්ද තවමත් ලූප් තත්ත්වය ලෙස පවතින බවක් නොපෙනුණි. ඒ කුඩා වෙනස් කිරීම නම් නියමයි.
ස්ටීවන් ලූ

4

2
මෙය විශේෂාංග-ඇසුරුම් 200 පේළි බෑෂ් ස්ක්‍රිප්ට් එකක් statවන අතර එය ලබා දී ඇති ගොනු නාමයන් මත ඡන්දය ප්‍රකාශ කිරීම, md5sumප්‍රතිදානය මත ධාවනය වීම සහ මෙම අගය වෙනස් වුවහොත් ලබා දී ඇති විධානය නැවත ක්‍රියාත්මක කිරීම. එය Bash නිසා, ඔබ එය Bash විමසුමේදී ටයිප් කළාක් මෙන් දී ඇති විධානය ක්‍රියාත්මක කිරීම හොඳ කාර්යයක් කරයි යැයි මම සැක කරමි. (ඊට වෙනස්ව, මෙහි වෙනත් භාෂාවලින් ලියා ඇති බොහෝ විසඳුම් විධාන ක්‍රියාත්මක කිරීමට අසමත් වනු ඇත, උදාහරණයක් ලෙස, ෂෙල් අන්වර්ථයන් අඩංගු වේ ll)
ජොනතන් හාර්ට්ලි

4

ගිලෙස්ගේ පිළිතුර මත වැඩි දියුණු විය .

මෙම අනුවාදය inotifywaitඑක් වරක් ක්‍රියාත්මක වන අතර modifyඉන් පසුව සිදුවීම් සඳහා අධීක්ෂණය කරයි (.eg :) . එවැනි සෑම සිදුවීමක්ම නැවත ක්‍රියාත්මක කිරීම අවශ්‍ය inotifywait නොවේ .

එය ඉක්මන් හා වේගවත්! (විශාල නාමාවලිය පුනරාවර්තව අධීක්ෂණය කිරීමේදී පවා)

inotifywait --quiet --monitor --event modify FILE | while read; do
    # trim the trailing space from inotifywait output
    REPLY=${REPLY% }
    filename=${REPLY%% *}
    # do whatever you want with the $filename
done

ලිනක්ස් පමණක් භාවිතා කරන්නන් සඳහා පිටුවේ ඇති හොඳම පිළිතුර මෙයයි. ලූපය තුළ ඇති දේවල් 'ක්‍රියාත්මක කරන්න $ with' සමඟ ප්‍රතිස්ථාපනය කරන්න, එවිට පරිශීලකයාට මෙම ස්ක්‍රිප්ට් එක තමන්ගේම විධානයක් මඟින් ක්‍රියාත්මක කිරීමට අමතන්න. ඔබ එය ප්‍රභවයක් නම් ". ස්ක්‍රිප්ට් කොමන්ඩ්" වැනි දෙයක් භාවිතා කරමින් ෂෙල් අන්වර්ථ අඩංගු විධාන සමඟ පවා එය ක්‍රියා කරයි. මෙය තවමත් PATH හි ස්ක්‍රිප්ට් නාමය සොයා ගනු ඇත.
ජොනතන් හාර්ට්ලි

මම හිතන්නේ ඔබ අදහස් කරන්නේ 'පිළිතුරු කියවන අතරතුර' තැබීමටද?
ජොනතන් හාර්ට්ලි

1
පැහැදිලි කිරීම සඳහා ස්තූතියි. එය අදියර කිරීම සඳහා ස්තූතියි! මම එම අදහස් මකා දැමුවෙමි, නමුත් ඇත්ත වශයෙන්ම දැන් මම එසේ නොකරමි.
ජොනතන් හාර්ට්ලි

3

ක්‍රමලේඛන පැත්තෙන් තව ටිකක්, නමුත් ඔබට අවශ්‍ය වන්නේ inotify වැනි දෙයක් . Jnotify සහ pyinotify වැනි බොහෝ භාෂාවල ක්‍රියාත්මක කිරීම් තිබේ .

මෙම පුස්තකාලය මඟින් ඔබට තනි ලිපිගොනු හෝ සම්පූර්ණ නාමාවලි නිරීක්ෂණය කිරීමට ඉඩ ලබා දෙන අතර ක්‍රියාවක් සොයාගත් විට සිදුවීම් නැවත ලබා දේ. ආපසු ලබා දුන් තොරතුරු වලට ගොනුවේ නම, ක්‍රියාව (නිර්මාණය, වෙනස් කිරීම, නැවත නම් කිරීම, මකා දැමීම) සහ ගොනු මාර්ගය ඇතුළු වෙනත් ප්‍රයෝජනවත් තොරතුරු ඇතුළත් වේ.


3

FreeBSD විසඳුමක් සොයන ඔබ සඳහා, මෙන්න වරාය:

/usr/ports/sysutils/wait_on

3

while inotifywait ...; do ...; doneකෙසේ වෙතත් එහි කාරණා දෙකක් ඇති සරල බව මම කැමතියි :

  • do ...;කැමැත්ත අතරතුර සිදුවන ගොනු වෙනස්වීම් මග හැරෙනු ඇත
  • පුනරාවර්තන ප්‍රකාරයේදී භාවිතා කරන විට මන්දගාමී වේ

එම නිසා මම එම සීමාවන් නොමැතිව inotifywait භාවිතා කරන උපකාරක පිටපතක් සාදන ලදී : inotifyexec

මෙම ස්ක්‍රිප්ට් එක මෙන් ඔබේ මාර්ගයට ඇතුළත් කිරීමට මම යෝජනා කරමි ~/bin/. භාවිතය විස්තර කරන්නේ විධානය ක්‍රියාත්මක කිරීමෙන් පමණි.

උදාහරණයක්: inotifyexec "echo test" -r .


රීජෙක්ස් රටා ගැලපීම සඳහා සහය දැක්වීම සඳහා ස්ක්‍රිප්ට් යාවත්කාලීන කරන ලදි.
වර්නයිට්

"--Monitor" මාදිලියේ inotifywait භාවිතා කිරීමෙන් ගැටළු දෙකම විසඳනු ලැබේ. සයිචෝයිගේ පිළිතුර බලන්න.
ජොනතන් හාර්ට්ලි

3

විධානය සමඟ සෙබස්තියන්ගේ විසඳුම වැඩි දියුණු කිරීම watch:

watch_cmd.sh:

#!/bin/bash
WATCH_COMMAND=${1}
COMMAND=${2}

while true; do
  watch -d -g "${WATCH_COMMAND}"
  ${COMMAND}
  sleep 1     # to allow break script by Ctrl+c
done

උදාහරණය අමතන්න:

watch_cmd.sh "ls -lR /etc/nginx | grep .conf$" "sudo service nginx reload"

එය ක්‍රියාත්මක වන නමුත් ප්‍රවේශම් වන්න: watchවිධානයට දෝෂ තිබේ (මිනිසා බලන්න): එය ප්‍රතික්‍රියා කරන්නේ -g CMDප්‍රතිදානයේ පර්යන්ත කොටස්වල දෘශ්‍යමාන වෙනස්වීම් වලට පමණි .


2

ඔබට ප්‍රතීකයක් උත්සාහ කළ හැකිය .

Reflex යනු ඩිරෙක්ටරියක් නැරඹීමට සහ සමහර ලිපිගොනු වෙනස් වූ විට විධානයක් නැවත ක්‍රියාත්මක කිරීමට කුඩා මෙවලමකි. සම්පාදනය / ලින්ට් / පරීක්ෂණ කාර්යයන් ස්වයංක්‍රීයව ක්‍රියාත්මක කිරීම සහ කේතය වෙනස් වූ විට ඔබගේ යෙදුම නැවත පූරණය කිරීම සඳහා එය විශිෂ්ටයි.

# Rerun make whenever a .c file changes
reflex -r '\.c$' make

ඔබට මෙවලම ගැන ටිකක් උපුටා දැක්වීමට / පැහැදිලි කිරීමට හැකිද? මඟ පෙන්වීම සඳහා මෘදුකාංග නිර්දේශ කරන්නේ කෙසේද යන්න පිළිබඳව ඉක්මණින් කියවන්න .
බර්ටිබ්

1

ලිපිගොනු වෙනසක් නිරීක්ෂණය කිරීමට මම භාවිතා කරන ඔනලයිනර් පිළිතුර:

$ while true ; do NX=`stat -c %Z file` ; [[ $BF != $NX ]] && date >> ~/tmp/fchg && BF=$NX || sleep 2 ; done

පළමු දිනය ආරම්භක වේලාව බව ඔබ දන්නේ නම් ඔබට BF ආරම්භ කිරීමට අවශ්‍ය නොවේ.

මෙය සරල හා අතේ ගෙන යා හැකි ය. ස්ක්‍රිප්ට් එකක් භාවිතා කරමින් එකම උපාය මත පදනම් වූ තවත් පිළිතුරක් මෙහි ඇත. බලන්න.


භාවිතය: මම මෙය නිදොස් කිරීම සහ විමසිල්ලෙන් සිටීම සඳහා භාවිතා කරමි ~/.kde/share/config/plasma-desktop-appletsrc; කිසියම් නොදන්නා හේතුවක් නිසා මගේ ලිහිල් බවSwitchTabsOnHover=false


1

මම එය කිරීමට මෙම ස්ක්‍රිප්ට් භාවිතා කරමි. මම මොනිටරයේ ප්‍රකාරයේදී inotify භාවිතා කරමි

#!/bin/bash
MONDIR=$(dirname $1)
ARQ=$(basename $1)

inotifywait -mr -e close_write $MONDIR | while read base event file 
do
  if (echo $file |grep -i "$ARQ") ; then
    $1
  fi
done

මෙය runatwrite.sh ලෙස සුරකින්න

Usage: runatwrite.sh myfile.sh

එය සෑම ලිවීමකදීම myfile.sh ධාවනය කරයි.


1

OS X භාවිතා කරන්නන් සඳහා, ඔබට LaunchAgent භාවිතා කර වෙනස්කම් සඳහා මාර්ගයක් / ගොනුවක් නැරඹිය හැකි අතර එය සිදු වූ විට යමක් කළ හැකිය. FYI - LaunchControl යනු ඩීමන් / නියෝජිතයන් පහසුවෙන් සෑදීමට / වෙනස් කිරීමට / ඉවත් කිරීමට හොඳ යෙදුමකි.

( උදාහරණය මෙතැනින් ගත් )

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd>
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>test</string>
    <key>ProgramArguments</key>
    <array>
        <string>say</string>
        <string>yy</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>~/Desktop/</string>
    </array>
</dict>
</plist>


1

තවත් කිහිප දෙනෙක් කර ඇති පරිදි, මම මෙය කිරීමට සැහැල්ලු විධාන රේඛා මෙවලමක් ද ලියා ඇත්තෙමි. එය සම්පුර්ණයෙන්ම ලේඛනගත කර, පරීක්ෂා කර මොඩියුලය.

වොච්-කරන්න

ස්ථාපනය

ඔබට මෙය ස්ථාපනය කළ හැකිය (ඔබට Python3 සහ pip තිබේ නම්):

pip3 install git+https://github.com/vimist/watch-do

භාවිතය

ධාවනය කිරීමෙන් එය වහාම භාවිතා කරන්න:

watch-do -w my_file -d 'echo %f changed'

විශේෂාංග දළ විශ්ලේෂණය

  • ගොනු ග්ලෝබින් කිරීම සඳහා සහය දක්වයි (භාවිතා කිරීම -w '*.py'හෝ -w '**/*.py')
  • ගොනු වෙනස් කිරීමක් මත විධාන කිහිපයක් ක්‍රියාත්මක කරන්න ( -dධජය නැවත සඳහන් කරන්න)
  • ග්ලෝබින් භාවිතා කරන්නේ දැයි බැලීමට ගොනු ලැයිස්තුව ගතිකව නඩත්තු කරයි ( -rමෙය සක්‍රිය කිරීමට)
  • ගොනුවක් "නැරඹීම" සඳහා විවිධ ක්‍රම:
    • වෙනස් කිරීමේ කාලය (පෙරනිමි)
    • ගොනු හැෂ්
    • ඔබේම දෑ ක්‍රියාත්මක කිරීමට සුළු දෙයක් (මෙය මෝඩිෆයිම් ටයිම් මුරකරු)
  • මොඩියුලර් නිර්මාණය. ඔබට විධාන ක්‍රියාත්මක කිරීමට අවශ්‍ය නම්, ගොනුවකට ප්‍රවේශ වූ විට, ඔබේම මුරකරු ලිවීම ඉතා සුළු කාරණයකි (ක්‍රියා කරන්නන් ක්‍රියාත්මක කළ යුතුද යන්න තීරණය කරන යාන්ත්‍රණය).

1
මගේ ප්‍රියතම පිළිතුර!
යාන් වීආර්

1

හරියටම මෙය සිදු කිරීම සඳහා මම පයිතන් වැඩසටහනක් ලිව්වෙමි rerun.

යාවත්කාලීන කිරීම: මෙම පිළිතුර පයිතන් පිටපතක් වන අතර එය වෙනස්කම් සඳහා ඡන්දය ප්‍රකාශ කරයි, එය සමහර තත්වයන් සඳහා ප්‍රයෝජනවත් වේ. Inotify භාවිතා කරන ලිනක්ස් පමණක් බාෂ් ස්ක්‍රිප්ට් සඳහා, මගේ අනෙක් පිළිතුර බලන්න, 'නැවත ධාවනය 2' සඳහා මෙම පිටුව සොයන්න.

Python2 හෝ Python3 සඳහා ස්ථාපනය කරන්න:

pip install --user rerun

භාවිතය ඉතා සරල ය:

rerun "COMMAND"

විධානය අපේක්ෂා කරන්නේ තනි ආගයක් ලෙස මිස අවකාශයෙන් වෙන් වූ ආරුක්කු අනුක්‍රමයක් ලෙස නොවේ. එබැවින් පෙන්වා ඇති පරිදි එය උපුටා දක්වන්න, එමඟින් ඔබට එකතු කිරීමට සිදුවන අමතර ගැලවීම අඩු කරයි. ඔබ විධාන රේඛාවේ ටයිප් කළ ආකාරයටම විධානය ටයිප් කරන්න, නමුත් එය උපුටා දැක්වීම් වලින් වට කර ඇත.

පෙරනිමියෙන් එය වත්මන් ඩිරෙක්ටරියේ හෝ ඊට යටින් ඇති සියලුම ලිපිගොනු නරඹයි, දන්නා ප්‍රභව පාලන ඩර්ස්, .git, .svn, වැනි දේ මඟ හැරේ.

විකල්ප ධජ වලට '-i NAME' ඇතුළත් වන අතර එය නම් කරන ලද ලිපිගොනු හෝ නාමාවලි වල වෙනස්කම් නොසලකා හරියි. මෙය කිහිප වතාවක් ලබා දිය හැකිය.

එය පයිතන් ස්ක්‍රිප්ට් එකක් බැවින්, එය විධානය උප ක්‍රියාවලියක් ලෙස ක්‍රියාත්මක කළ යුතු අතර, පරිශීලකයාගේ වත්මන් කවචයේ නව අවස්ථාවක් 'කොමන්ඩ්' අර්ථ නිරූපණය කිරීමට සහ සත්‍ය වශයෙන්ම ක්‍රියාත්මක විය යුතු ක්‍රියාවලිය තීරණය කිරීමට අපි භාවිතා කරමු. කෙසේ වෙතත්, ඔබේ විධානයට ෂෙල් අන්වර්ථයන් සහ .bashrc හි අර්ථ දක්වා ඇති දේ තිබේ නම්, මේවා උප කුලකය මඟින් පටවනු නොලැබේ. මෙය නිවැරදි කිරීම සඳහා, ඔබට නැවත ක්‍රියාත්මක කිරීමට '-I' ධජයක් ලබා දිය හැකිය, අන්තර්ක්‍රියාකාරී (හෝ 'පිවිසුම්') උප-ෂෙල් භාවිතා කරන්න. සාමාන්‍ය කවචයක් ආරම්භ කිරීමට වඩා මෙය මන්දගාමී හා දෝෂ සහිත වේ, එයට හේතුව ඔබේ .bashrc ප්‍රභවයයි.

මම එය පයිතන් 3 සමඟ භාවිතා කරමි, නමුත් අවසන් වරට මා නැවත පරීක්ෂා කළේ තවමත් පයිතන් 2 සමඟ වැඩ කර ඇති බවයි.

ද්විත්ව දාර කඩුව යනු එය inotify වෙනුවට ඡන්දය භාවිතා කිරීමයි. උඩු යටිකුරු කිරීමේදී, එයින් අදහස් වන්නේ එය සෑම මෙහෙයුම් පද්ධතියකම ක්‍රියාත්මක වන බවයි. ප්ලස්, මෙහි දක්වා ඇති වෙනත් විසඳුම් වලට වඩා හොඳය, ලබා දී ඇති විධානය ගොනු පද්ධති වෙනස්වීම් සමූහයක් සඳහා එක් වරක් පමණක් නොව, වෙනස් කරන ලද ගොනුවකට එක් වරක් පමණක් නොව, ඕනෑම ගොනුවක් නැවත වෙනස් වුවහොත් දෙවන වරටත් විධානය ක්‍රියාත්මක කරයි. විධානය ක්‍රියාත්මක වන අතරතුර.

අවාසිය නම්, ඡන්දය දීමෙන් තත්පර 0.0 සිට 1.0 දක්වා ප්‍රමාදයක් ඇති අතර ඇත්ත වශයෙන්ම අතිශය විශාල නාමාවලි නිරීක්ෂණය කිරීම මන්දගාමී වේ. එසේ පැවසීමෙන් පසු, ඔබේ virtualenv සහ node_modules වැනි විශාල දේවල් නොසලකා හැරීමට ඔබ '-i' භාවිතා කරන තාක් කල් මෙය සැලකිය යුතු තරම් විශාල ව්‍යාපෘතියක් මට හමු වී නොමැත.

හ්ම්ම්. rerunවසර ගණනාවක් තිස්සේ මට අත්‍යවශ්‍යයි - මම මූලික වශයෙන් සෑම දිනකම පැය අටක් පරීක්ෂණ ක්‍රියාත්මක කිරීම, තිත් ලිපිගොනු සංස්කරණය කරන විට ඒවා නැවත සකස් කිරීම යනාදිය සඳහා භාවිතා කරමි. නමුත් දැන් මම මෙහි ටයිප් කිරීමට පැමිණ සිටිමි, මට විසඳුමකට මාරු විය යුතු බව පැහැදිලිය එය inotify භාවිතා කරයි (මම තවදුරටත් වින්ඩෝස් හෝ ඕඑස්එක්ස් භාවිතා නොකරමි.) එය බාෂ් හි ලියා ඇත (එබැවින් එය අතිරේක විකාරයකින් තොරව අන්වර්ථයන් සමඟ ක්‍රියා කරයි.)


මෙම පිළිතුර මගේ අනෙක් පිළිතුර තරම් දුරස්ථ නොවේ (නැවත ධාවනය 2)
ජොනතන් හාර්ට්ලි

1
2020 දී මැක් ඕඑස් එක්ස් සඳහා මා උත්සාහ කළ සියලු විසඳුම් වලින් ඕනෑම ව්‍යාපෘතියක් rerunක්‍රියාත්මක make testකිරීම සඳහා හොඳම $ pip3 install rerun $ rerun --verbose --ignore=_build --ignore=deps "make test-unit"
ප්‍රති results ල ලබා දී ඇත

0

විශේෂිත ගොනුවක වෙනස්කම් සඳහා ගූග්ලිං විසින් මෙය සොයා ගන්නා පුද්ගලයින් සඳහා , පිළිතුර වඩාත් සරල ය ( ගිලෙස්ගේ පිළිතුරෙන් දේවානුභාවයෙන් ).

විශේෂිත ගොනුවක් ලිවීමෙන් පසුව ඔබට යමක් කිරීමට අවශ්‍ය නම් , මෙන්න කෙසේද:

while true; do
  inotifywait -e modify /path/to/file
  # Do something *after* a write occurs, e.g. copy the file
  /bin/cp /path/to/file /new/path
done

මෙම සුරකින්න ලෙස, උදාහරණයක් ලෙස, copy_myfile.shසහ දමා .shඇති බවට ගොනු /etc/init.d/එය ආරම්භක මත ධාවනය කිරීමට ෆෝල්ඩරය.


සෑම පුනරාවර්තනයක් තුළම එය inotifywait ධාවනය කරන බවට ගයිල්ස්ගේ පිළිතුර සමඟ ගැටළුව බෙදා ගනී, එය ඉතා විශාල නාමාවලි නැවත නැවත නැරඹීමට ප්‍රතිචාර නොදක්වයි. මෙය නිවැරදි කිරීම සඳහා සයිචෝයිගේ පිළිතුර බලන්න.
ජොනතන් හාර්ට්ලි
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.