যখনই কোনও ফাইল পরিবর্তন হয় তখন কীভাবে একটি কমান্ড চালানো যায়?


434

আমি যখনই কোনও ফাইল পরিবর্তন করে একটি কমান্ড কার্যকর করার একটি দ্রুত এবং সহজ উপায় চাই। আমি খুব সাধারণ কিছু চাই, এমন কিছু যা আমি টার্মিনালে চালিয়ে যাব এবং যখনই আমি এই ফাইলটির সাথে কাজ শেষ করব তখন এটি বন্ধ করব।

বর্তমানে, আমি এটি ব্যবহার করছি:

while read; do ./myfile.py ; done

এবং তারপরে আমাকে সেই টার্মিনালে যেতে হবে এবং Enterযখনই আমি এই ফাইলটি আমার সম্পাদকে সংরক্ষণ করি তখন টিপতে হবে। আমি যা চাই তা হ'ল এরকম কিছু:

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

বা যে কোনও সহজ সমাধান হিসাবে সহজ।

বিটিডাব্লু: আমি ভিম ব্যবহার করছি, এবং আমি জানি বুফরাইটে কিছু চালানোর জন্য আমি একটি স্বায়ত্তশক্তি যোগ করতে পারি, তবে আমি এখন যে ধরণের সমাধান চাই তা এটি নয়।

আপডেট: আমি সাধারণ কিছু চাই, সম্ভব হলে বাতিলযোগ্য। আরও কী, আমি টার্মিনালটিতে কিছু চালাতে চাই কারণ আমি প্রোগ্রামটি আউটপুট দেখতে চাই (আমি ত্রুটির বার্তা দেখতে চাই)।

উত্তর সম্পর্কে: আপনার সমস্ত উত্তরের জন্য ধন্যবাদ! এগুলির সবগুলি খুব ভাল, এবং প্রত্যেকে একে অপরের থেকে খুব আলাদা দৃষ্টিভঙ্গি গ্রহণ করে। যেহেতু আমার কেবল একটি গ্রহণ করা প্রয়োজন, আমি এটি ব্যবহার করছি যা আমি আসলে ব্যবহার করেছি (এটি সহজ, দ্রুত এবং সহজে মনে রাখা সহজ ছিল), যদিও আমি জানি এটি সবচেয়ে মার্জিত নয়।


এর সম্ভাব্য ক্রস সাইটের সদৃশ: স্ট্যাকওভারফ্লো / প্রশ্ন / 297272765/… (যদিও এটি এখানে বিষয় =))
সিওরো সান্তিলি ti 改造 中心 法轮功 六四 事件

আমি ক্রস সাইটের সদৃশ হওয়ার আগে উল্লেখ করেছি এবং এটি অস্বীকার করা হয়েছিল: এস;)
ফ্রান্সিসকো তপিয়া

4
জোনাথন হার্টলির সমাধানটি এখানে অন্যান্য সমাধানগুলির উপর ভিত্তি করে তৈরি করে এবং শীর্ষ-ভোটের উত্তরগুলির মধ্যে রয়েছে এমন বড় সমস্যাগুলি সমাধান করে: কিছু পরিবর্তন অনুপস্থিত এবং অদক্ষ। দয়া করে তার গ্রহণযোগ্য উত্তরটি পরিবর্তন করুন, যা github.com/tartley/rerun2 (বা সেই ত্রুটিগুলি ছাড়াই অন্য কোনও সমাধানে)
গিথুবতেও

উত্তর:


404

সরল, ইনোটাইফয়েট ব্যবহার করে (আপনার বিতরণের 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 (এমন একটি সরঞ্জাম যা লিনাক্সের ইনোটিফাইটির প্রতিটি ভেরিয়েন্টের অ্যানালগ ব্যবহার করে অন্যান্য অনেক ইউনিক্স রূপে কাজ করে)।


46
আমি এই সবগুলি (বেশ কয়েকটি ব্যাশ কৌশল সহ) একটি সহজ-ব্যবহারযোগ্য sleep_until_modified.shস্ক্রিপ্টে ক্যাপসলেট করেছি
স্মল_স্ক্রিপ্টস

14
while sleep_until_modified.sh derivation.tex ; do latexmk -pdf derivation.tex ; doneচমৎকার. ধন্যবাদ.
Rhys Ulerich

5
inotifywait -e delete_selfআমার জন্য ভাল কাজ করছে বলে মনে হচ্ছে।
কোস

3
এটি সহজ তবে দুটি গুরুত্বপূর্ণ সমস্যা রয়েছে: ইভেন্টগুলি মিস হয়ে যেতে পারে (লুপের সমস্ত ইভেন্ট) এবং ইনোটিফাইয়েটের সূচনা প্রতিবার সম্পন্ন করা হয় যা বড় পুনরাবৃত্ত ফোল্ডারগুলির জন্য এই সমাধানটি ধীর করে তোলে।
ওয়ার্নাইট

6
কিছু কারণে while inotifywait -e close_write myfile.py; do ./myfile.py; doneসর্বদা কমান্ড (বাশ এবং zsh) না চালিয়ে প্রস্থান করা হয়। এটি কাজ করার জন্য আমাকে যুক্ত করতে হবে || true, যেমন: while inotifywait -e close_write myfile.py || true; do ./myfile.py; done
ধারণাগুলি 42

166

এনট্রি ( http://entrproject.org/ ) ইনোটিফাই করার জন্য আরও বন্ধুত্বপূর্ণ ইন্টারফেস সরবরাহ করে (এবং * বিএসডি এবং ম্যাক ওএস এক্সকে সমর্থন করে)।

এটি দেখার জন্য একাধিক ফাইল নির্দিষ্ট করা খুব সহজ করে (কেবলমাত্র এর মাধ্যমে সীমাবদ্ধ 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
@ ওয়ার্নাইট - 7th ই মে ২০১৪ অবধি নতুন -dপতাকা রয়েছে; এটি কিছুটা বেশি দীর্ঘ-বায়ুযুক্ত, তবে আপনি while sleep 1 ; do find . -name '*.py' | entr -d ./myfile.py ; doneনতুন ফাইলগুলি মোকাবেলা করতে পারেন ।
পল ফেনি

1
কমপক্ষে ডেবিয়ান জেসি / ৮.২ অন থেকে ডেবিয়ান রেপোগুলিতেও এন্ট্রি পাওয়া যায় ...
পিটার ভি।

5
ওএস এক্স-এ আমি খুঁজে পেয়েছি সেরাটি। fswatch অনেক মজাদার ঘটনা দখল করে এবং কেন সময় বের করতে চাই না
ডিসি

5
এটি লক্ষণীয় যে এন্টারটি হোমব্রিউতে পাওয়া যায়, সুতরাং brew install entrপ্রত্যাশার মতো কাজ করবে
jmarceli

108

আমি ঠিক যখন একে পরিবর্তিত হিসাবে ডাকা একটি পাইথন প্রোগ্রাম লিখেছিলাম ।

ব্যবহার সহজ:

when-changed FILE COMMAND...

বা একাধিক ফাইল দেখতে:

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

FILEডিরেক্টরি হতে পারে। পুনরাবৃত্তির সাথে দেখুন -r%fকমান্ডে ফাইলের নামটি ব্যবহার করতে ব্যবহার করুন ।


1
@ সাইংকোক হ্যাঁ, কোডটির সর্বশেষ সংস্করণে এটি করেন :)
জো

4
এখন "পরিবর্তিত হলে পাইপ ইনস্টল" থেকে পাওয়া যায়। তবুও সুন্দরভাবে কাজ করে। ধন্যবাদ।
AL ফ্লানাগান

2
প্রথমে স্ক্রিনটি সাফ করতে আপনি ব্যবহার করতে পারেন when-changed FILE 'clear; COMMAND'
ডেভ জেমস মিলার

1
এই উত্তরটি আরও ভাল কারণ আমি এটি উইন্ডোতেও করতে পারি। এবং এই লোকটি আসলে উত্তর পাওয়ার জন্য একটি প্রোগ্রাম লিখেছিল।
ওল্ফপ্যাক'08

4
সবাইকে সুখবর! when-changedএখন ক্রস প্ল্যাটফর্ম! সর্বশেষতম ০.০.০ প্রকাশটি :) দেখুন
জো

52

এই স্ক্রিপ্টটি কেমন? এটি 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

2
করবে না stat-ing পরিবর্তিত সময় ভালো হতে "যখনই কোনো ফাইল পরিবর্তন" উত্তর?
Xen2050

1
প্রতি সেকেন্ডে স্ট্যাটাস চালিয়ে যাওয়ার কারণে অনেকগুলি ডিস্কে পড়ে? অথবা fstat সিস্টেম কল স্বয়ংক্রিয়ভাবে কোনওভাবে এই প্রতিক্রিয়াগুলিকে ক্যাশে করবে? আমি যখনই পরিবর্তন করি আমার সি কোডটি সংকলন করতে এক প্রকার 'গ্রান্ট ওয়াচ' লেখার চেষ্টা করছি
ওসকেনসো কাশি

যদি আপনি ফাইলের নামটি আগে থেকে দেখতে পেলেন তবে এটি ভাল। স্ক্রিপ্টে ফাইলের নামটি উত্তরণ করা ভাল। আপনি অনেকগুলি ফাইল নাম পাস করতে পারলে আরও ভাল হয় (উদা। "মাইওয়াচ * .পি")। আরও ভাল হবে যদি এটি সাবডিয়ারগুলিতে ফাইলগুলিতেও পুনরাবৃত্তভাবে কাজ করতে পারে তবে অন্যান্য সমাধানগুলির মধ্যে কিছু এটি করে।
জোনাথন হার্টলি

5
কেউ যদি ভারী পড়ার বিষয়ে ভাবছেন, আমি এই স্ক্রিপ্টটি উবুন্টু ১ 17.০৪-তে 0.05 এর ঘুম সহ এবং vmstat -dডিস্ক অ্যাক্সেসের জন্য দেখেছি tested দেখে মনে হচ্ছে এই ধরণের
জিনিসটিকে

"COMMAND" তে টাইপ রয়েছে, আমি সংশোধন করার চেষ্টা করছিলাম, তবে এসও বলে "সম্পাদনাটি 6 টির চেয়ে কম বর্ণের হওয়া উচিত নয়"
ব্যবহারকারী 337085

30

ভিম ব্যবহার করে সমাধান:

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

তবে আমি এই সমাধানটি চাই না কারণ এটি টাইপ করতে বিরক্তিকর, ঠিক কী টাইপ করতে হবে তা মনে রাখা কিছুটা শক্ত এবং এর প্রভাবগুলি পূর্বাভাস করা কিছুটা কঠিন (চালানো দরকার :au! BufWritePost myfile.py)। তদাতিরিক্ত, এই সমাধানটি কমল কার্যকর করা শেষ না হওয়া অবধি Vim কে অবরুদ্ধ করে।

আমি এই সমাধানটি এখানে কেবলমাত্র সম্পূর্ণতার জন্য যুক্ত করেছি, কারণ এটি অন্যান্য লোকেদের সহায়তা করতে পারে।

প্রোগ্রাম আউটপুট প্রদর্শন করতে (এবং আপনার সম্পাদনা প্রবাহকে সম্পূর্ণরূপে ব্যাহত করে, যেমন আউটপুট আপনার সম্পাদককে কয়েক সেকেন্ডের জন্য লিখবে, যতক্ষণ না আপনি এন্টার টিপেন), :silentকমান্ডটি সরিয়ে ফেলুন ।


1
entr(নীচে দেখুন) এর সাথে একত্রিত হয়ে এটি বেশ সুন্দর হতে পারে - কেবলমাত্র ভিআরএম একটি ডামি ফাইল যা স্পর্শ করতে দেখছে তা স্পর্শ করুন এবং এন্টারটি ব্যাকগ্রাউন্ডে রেখে দিন ... বা tmux send-keysআপনি যদি এমন পরিবেশে থেকে থাকেন তবে :)
পল ফেনি

চমৎকার! আপনি আপনার .vimrcফাইলটির জন্য ম্যাক্রো তৈরি করতে পারেন
এরিচবিএসচুল্জ

23

আপনি যদি npmইনস্টল nodemonকরে দেখে থাকেন তবে শুরু করার সম্ভবত এটি সবচেয়ে সহজ উপায়, বিশেষত ওএস এক্সে, যা স্পষ্টতই ইনোটিফাইয়ের সরঞ্জামগুলি নেই। ফোল্ডার পরিবর্তিত হলে এটি একটি কমান্ড চালানো সমর্থন করে।


5
তবে এটি কেবল .js এবং। কফি ফাইলগুলি দেখে।
zelk

6
বর্তমান সংস্করণটি কোনও কমান্ডকে সমর্থন করে বলে মনে হচ্ছে, উদাহরণস্বরূপ: nodemon -x "bundle exec rspec" spec/models/model_spec.rb -w app/models -w spec/models
কেক

1
আমি আশা করি আমার আরও তথ্য থাকত তবে ওএসএক্সের পরিবর্তনগুলি, ফসেন্টস ট্র্যাক করার একটি পদ্ধতি রয়েছে
কনস্টান্টাইনেকে

1
ওএস এক্স-এ আপনি আমার লিঙ্কে প্রদর্শিত একটি কী সহ লঞ্চ ডেমোনসও ব্যবহার করতে পারেন WatchPaths
অ্যাডাম জনস

19

যারা 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"
এটেল

3
আপনি যদি প্রতি সেকেন্ডে আপনার সমাধানটি দেখেন, এটি চিরতরে কাজ করে এবং কেবলমাত্র কিছু ফাইল পরিবর্তিত হলে MY_COMMAND চালায়: দেখুন -n1 "ঘড়ির -d -t -g ls -lR&&MY_COMMAND"
মেনসার্কো

আমার ঘড়ির সংস্করণ (লিনাক্সে, watch from procps-ng 3.3.10) এর বিরতিটির জন্য ভাসমান সেকেন্ড গ্রহণ watch -n0.2 ...করে , অতএব প্রতি সেকেন্ডের প্রতিটি পঞ্চম অংশে এটি পোল হবে। স্বাস্থ্যকর সাব-মিলিসেকেন্ড ইউনিট পরীক্ষার জন্য ভাল।
জনাথন হার্টলি

15

rerun2( গিথুব-এ ) ফর্মটির একটি 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

আপনার পাথের গিথুব সংস্করণটিকে 'রিরুন' হিসাবে সংরক্ষণ করুন এবং এটি ব্যবহার করে প্রার্থনা করুন:

rerun COMMAND

এটি প্রতিবার আপনার বর্তমান ডিরেক্টরিতে কোনও ফাইল সিস্টেম সংশোধিত ইভেন্ট ঘটায় কম্যান্ড চালায় (পুনরাবৃত্ত))

এটি সম্পর্কে যেগুলি পছন্দ করতে পারে তা:

  • এটি ইনোটাইফাই ব্যবহার করে, তাই ভোটদানের চেয়ে প্রতিক্রিয়াশীল। সাব-মিলিসেকেন্ড ইউনিট পরীক্ষা চালানোর জন্য দুর্দান্ত, বা প্রতিবার গ্রাভভিজ ডট ফাইলগুলি রেন্ডারিংয়ের জন্য, যখন আপনি 'সেভ করুন' চাপবেন।
  • এটি এত তাড়াতাড়ি হওয়ার কারণে, আপনাকে কেবল পারফরম্যান্সের কারণে বড় সাবডিয়ারগুলি (নোড_মডিউলগুলির মতো) উপেক্ষা করতে বলার দরকার নেই।
  • এটি অতিরিক্ত সুপার প্রতিক্রিয়াযুক্ত, কারণ এটি একবার চালানোর পরিবর্তে একবারেই ইনোটেফেইট কল করে এবং প্রতিটি পুনরাবৃত্তির উপর ঘড়ি স্থাপনের ব্যয়বহুল হিট দেয়।
  • এটি বাশের মাত্র 12 লাইন
  • কারণ এটি বাশ, এটি আদেশগুলি ব্যাখ্যা করে যাতে আপনি এটি পাস করার অনুরূপ হন যেমন আপনি কোনও বাশ প্রম্পটে টাইপ করেছেন। (সম্ভবত আপনি যদি অন্য শেল ব্যবহার করেন তবে এটি কম শীতল))
  • COMMAND সম্পাদন করার সময় ঘটে যাওয়া ঘটনাগুলি হারাবে না, এই পৃষ্ঠায় থাকা অন্যান্য বেশিরভাগ সমাধানের বিপরীতে।
  • প্রথম ইভেন্টে এটি 0.15 সেকেন্ডের জন্য একটি 'মৃত পিরিয়ড' প্রবেশ করে, অন্য সময় ইভেন্টগুলি উপেক্ষা করা হয়, ঠিক একবার COMMAND চালানোর আগে। এটি এমন যে ক্রাই-রাইটিং-মুভ ডান্সের কারণে ঘটে যাওয়া ইভেন্টগুলির ঝকঝকে ঘটনা বা ভাইরাস বা ইমকরা যখন বাফারটি সংরক্ষণ করে তখন সম্ভবত ধীর-চলমান টেস্ট স্যুটের একাধিক শ্রমসাধ্য মৃত্যুর কারণ না ঘটে। COMMAND সম্পাদন করার সময় ঘটে যাওয়া কোনও ইভেন্ট এড়ানো হবে না - এগুলি দ্বিতীয় মৃত পিরিয়ড এবং পরবর্তী মৃত্যুদন্ড কার্যকর করবে।

এটি সম্পর্কে যে বিষয়গুলি অপছন্দ করতে পারে তা:

  • এটি ইনোটাইফাই ব্যবহার করে, তাই লিনাক্সল্যান্ডের বাইরে কাজ করবে না।
  • যেহেতু এটি ইনোটাইফাই ব্যবহার করে, এটি ব্যবহারকারীর ইনোটিফাই ঘড়ির সর্বাধিক সংখ্যার চেয়ে বেশি ফাইল যুক্ত ডিরেক্টরি দেখার চেষ্টা করে বাধা দেয়। ডিফল্টরূপে, আমি ব্যবহার করি বিভিন্ন মেশিনে এটি প্রায় 5,000 থেকে 8,000 এ সেট করা আছে বলে মনে হয় তবে এটি বাড়ানো সহজ। Https://unix.stackexchange.com/questions/13751/kernel-inotify-watch-limit-reach দেখুন
  • এটি বাশ এলিয়াসযুক্ত কমান্ড কার্যকর করতে ব্যর্থ। আমি শপথ করতে পারি যে এটি কাজ করে। নীতিগতভাবে, কারণ এটি বাশ, একটি সাবশেলে কম্যান্ড কার্যকর করছে না, আমি এটি কাজ করবে আশা করি। আমি শুনতে ভাল লাগবে যদি কেউ জানে না কেন এটি হয় না। এই পৃষ্ঠার অন্যান্য সমাধানগুলির অনেকগুলিও এই জাতীয় আদেশগুলি কার্যকর করতে পারে না।
  • ব্যক্তিগতভাবে আমি কামনা করি যে ম্যানুয়ালি কম্যান্ডের একটি অতিরিক্ত মৃত্যুদন্ড কার্যকর করার জন্য এটি যে টার্মিনালটিতে চলছে তাতে একটি কী চাপতে সক্ষম হয়েছি। আমি কি এইভাবে কোনওভাবে যোগ করতে পারি? একযোগে চলছে 'যখন পড়ুন -n1' লুপ যা এক্সিকিউটিভকেও ডাকে?
  • এই মুহূর্তে আমি টার্মিনালটি সাফ করার জন্য এবং প্রতিটি পুনরাবৃত্তির উপর চালিত কম্যান্ডের মুদ্রণ করতে এটিকে কোড করেছি। কিছু লোকেরা এ জাতীয় জিনিসগুলি বন্ধ করতে কমান্ড-লাইন পতাকা যুক্ত করতে পছন্দ করতে পারে etc. তবে এটি আকার এবং জটিলতা বহুগুণে বাড়িয়ে তুলবে।

এটি @ সাইচোইয়ের অ্যাওয়ারের একটি সংশোধন।


2
আমি বিশ্বাস করি যে স্থানগুলি যুক্ত যুক্তিগুলির সাথে সঠিকভাবে কাজ করার জন্য আপনার "$@"পরিবর্তে ব্যবহার করা উচিত $@। তবে একই সময়ে আপনি ব্যবহার করেন evalযা উদ্ধৃতি দেওয়ার সময় পুনরায় ব্যবহারকারীকে অতিরিক্ত সতর্কতা অবলম্বন করতে বাধ্য করে।
ডেনিলসন সা মিয়া

ধন্যবাদ ডেনিলসন কোটেশন সাবধানতার সাথে করা দরকার যেখানে আপনি একটি উদাহরণ দিতে পারেন? আমি এটি গত 24 ঘন্টা ব্যবহার করেছি এবং এখন পর্যন্ত স্পেসগুলির সাথে কোনও সমস্যা দেখিনি, বা সাবধানতার সাথে কোনও উদ্ধৃতি দেওয়া হয়নি - কেবলমাত্র অনুরোধ করা হয়েছে rerun 'command'। আপনি কি কেবল বলছেন যে আমি যদি "$ @" ব্যবহার করি তবে ব্যবহারকারীটি rerun command(উদ্ধৃতিবিহীন?) হিসাবে প্রার্থনা করতে পারে তা আমার পক্ষে তেমন কার্যকর বলে মনে হয় না: আমি সাধারণত বাশকে আদেশ দেওয়ার আগে কোনও কমান্ড প্রক্রিয়াজাতকরণ করতে চাই না পুনরায় চালু করা। উদাহরণস্বরূপ যদি কমান্ডটিতে "প্রতিধ্বনি $ মাইভার" থাকে, তবে আমি প্রতিটি পুনরুক্তিতে মাইভারের নতুন মানগুলি দেখতে চাই।
জোনাথন হার্টলি

1
এরকম কিছু rerun foo "Some File"ভেঙে যেতে পারে। আপনি যেহেতু ব্যবহার করছেন তাই evalএটি আবার লিখতে পারেন rerun 'foo "Some File"। মনে রাখবেন যে কখনও কখনও পাথ সম্প্রসারণ শূন্যস্থানগুলির পরিচয় দিতে পারে: rerun touch *.fooসম্ভবত ভেঙে যাবে এবং ব্যবহারের rerun 'touch *.foo'ফলে কিছুটা আলাদা শব্দার্থক শব্দ ব্যবহার করা হবে (পথের সম্প্রসারণ কেবল একবারে বা একাধিকবার ঘটবে )।
ডেনিলসন সা মিয়া

সাহায্যের জন্য ধন্যবাদ. হ্যাঁ: rerun ls "some file"ফাঁকা জায়গাগুলির কারণে বিরতি। rerun touch *.foo*সাধারণত সূক্ষ্মভাবে কাজ করে, তবে * .ফুতে মেলে এমন ফাইলের নামগুলি ফাঁকা রাখলে ব্যর্থ হয়। কীভাবে rerun 'touch *.foo'বিভিন্ন শব্দার্থবিজ্ঞান রয়েছে তা আমাকে দেখার জন্য ধন্যবাদ , তবে আমি সন্দেহ করি যে একক উদ্ধৃতি সহ সংস্করণটি আমি চাই শব্দার্থক: আমি পুনরায় পুনরুত্থানের প্রতিটি পুনরাবৃত্তিটি পুনরায় কমান্ডটি টাইপ করার মতো করে কাজ করতে চাই - তাই আমি প্রতিটি পুনরাবৃত্তির উপর প্রসারিত হতে চাই *.foo । আমি আপনার পরামর্শগুলি তাদের প্রভাবগুলি পরীক্ষা করার জন্য চেষ্টা করব ...
জোনাথন হার্টলে

এই পিআর সম্পর্কে আরও আলোচনা ( github.com/tartley/rerun2/pull/1 ) এবং অন্যান্য।
জোনাথন হার্টলি

12

এখানে একটি সরল শেল বোর্ন শেল স্ক্রিপ্ট রয়েছে যা:

  1. দুটি আর্গুমেন্ট নেয়: ফাইলটি পর্যবেক্ষণ করা হবে এবং একটি আদেশ (প্রয়োজনীয় হলে আর্গুমেন্ট সহ)
  2. আপনি / টিএমপি ডিরেক্টরিতে যে ফাইলটি পর্যবেক্ষণ করছেন তা অনুলিপি করে
  3. আপনি পর্যবেক্ষণ করছেন যে ফাইলটি অনুলিপি চেয়ে নতুন কিনা তা প্রতি দুই সেকেন্ডে পরীক্ষা করে দেখুন
  4. যদি এটি আরও নতুন হয় তবে এটি অনুলিপিটিকে নতুন মূলের সাথে ওভাররাইট করে এবং কমান্ডটি কার্যকর করে
  5. আপনি সিটিআর-সি চাপলে নিজের পরে পরিষ্কার হয়ে যায়

    #!/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  
    

এটি ফ্রিবিএসডি-তে কাজ করে। কেবলমাত্র পোর্টেবিলিটি ইস্যুটি আমি ভাবতে পারি তা যদি অন্য কোনও ইউনিক্সের কাছে এমকেটেম্প (1) কমান্ড না থাকে তবে সেই ক্ষেত্রে আপনি কেবলমাত্র টেম্প ফাইলের নামটি হার্ড কোড করতে পারেন।


9
পোলিং একমাত্র পোর্টেবল উপায়, তবে বেশিরভাগ সিস্টেমে একটি ফাইল পরিবর্তন বিজ্ঞপ্তি ব্যবস্থা থাকে (লিনাক্সে স্বীকৃতি প্রদান করুন, ফ্রিবিএসডি-তে কিকিউ, ...)। আপনি যখন করবেন তখন আপনার একটি গুরুতর উদ্ধৃতি সমস্যা রয়েছে $cmdতবে ভাগ্যক্রমে এটি সহজেই স্থিরযোগ্য: cmdভেরিয়েবলটি খনন করে কার্যকর করুন "$@"। আপনার স্ক্রিপ্ট কোনও বৃহত ফাইল নিরীক্ষণের জন্য উপযুক্ত নয়, তবে এটি প্রতিস্থাপনের cpমাধ্যমে স্থির করা যেতে পারে touch -r(আপনার কেবলমাত্র তারিখের প্রয়োজন, সামগ্রীগুলি নয়)। বহনযোগ্যতা অনুসারে, -ntপরীক্ষার জন্য ব্যাশ, ksh বা zsh প্রয়োজন।
গিলস

8

তাকান তাকান । এটি ক্রোনের মতো, তবে সময়ের পরিবর্তে অবিচ্ছিন্ন ইভেন্টগুলি ব্যবহার করে।


এটি কাজ করার জন্য তৈরি করা যেতে পারে তবে এই পৃষ্ঠার অন্যান্য সমাধানগুলির তুলনায় একটি ইনক্রন এন্ট্রি তৈরি করা একটি শ্রম নিবিড় প্রক্রিয়া।
জোনাথন হার্টলি

6

নোডজেস, 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

আপনি আপনার প্রকল্পের ডিরেক্টরিতে যে কোনও ধরণের নিদর্শন দেখতে এটি সেট আপ করতে পারেন, এবং পরিবর্তনগুলি যখন ঘটে তখন আদেশগুলি কার্যকর করতে পারেন। আপনি প্রথম স্থানে যা করার চেষ্টা করছেন তার জন্য একটি প্লাগইন রয়েছে এমনটিও ভাল সুযোগ।


6

যদি আপনি নোডমন ইনস্টল করে থাকেন তবে আপনি এটি করতে পারেন:

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

আমার ক্ষেত্রে আমি স্থানীয়ভাবে এইচটিএমএল সম্পাদনা করি এবং কোনও ফাইল পরিবর্তিত হলে এটি আমার দূরবর্তী সার্ভারে প্রেরণ করি।

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

6

লিনাক্সের অধীনে:

man watch

watch -n 2 your_command_to_run

প্রতি 2 সেকেন্ডে কমান্ডটি চালাবে।

যদি আপনার কমান্ডটি চালাতে 2 সেকেন্ডের বেশি সময় নেয়, আবার এটি করার আগে ঘড়িটি এটি শেষ না হওয়া পর্যন্ত অপেক্ষা করবে।


এটি বেশ সহজ, কিছুটা বর্জ্য হলেও শৈলীতে লাইভ পরিবর্তন করার মতো বিকাশের কাজগুলির পক্ষে এটি সহজ।
Xeoncross

2
কমান্ডটি চালাতে দুই সেকেন্ডের বেশি সময় নেয় কি হবে?
ত্রিশতময়

@ ত্রয়োদশ ত্রিফরফটি উবুন্টুতে একটি দ্রুত পরীক্ষায় দেখা গেছে যে কমান্ডটি চালাতে কতক্ষণ সময় নিবে না কেন ঘড়ি পুরো দুই সেকেন্ড অপেক্ষা করবে। এফডাব্লুআইডাব্লু, ঘুমের সময়কাল '-n' দিয়ে নির্দিষ্ট করে সর্বনিম্ন 0.1 সেকেন্ডে নির্দিষ্ট করা যায়।
জোনাথন হার্টলি

5

ওয়াচডগ একটি পাইথন প্রকল্প, এবং আপনি যা খুঁজছেন ঠিক তা হতে পারে:

সমর্থিত প্ল্যাটফর্মগুলি

  • লিনাক্স 2.6 (inotify)
  • ম্যাক ওএস এক্স (এফএসইভেন্টস, কোকুই)
  • ফ্রিবিএসডি / বিএসডি (কেকিউ)
  • উইন্ডোজ (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। কমপক্ষে এটি সিআরটিএল + সি চাপলে সহজেই থামে।
ডিলিলসন সা মিয়া

ঘুম মুছে ফেলা কি ব্যস্ত লুপের (সিপিইউ উত্তাপ উত্পন্ন করে এবং একটি ল্যাপটপে ব্যাটারি লাইফকে আঘাত করছে) তৈরি করবে?
স্টিভেন লু

2
@ স্টিভেনলু: না, ঘুম কোনও ব্যস্ত অপেক্ষা নয়। সমস্যাটি হ'ল ঘুম যদি শরীরে থাকে তবে কন্ট্রোল-সি ঘুমকে মেরে ফেলবে এবং লুপটি আবার শুরু হবে। লুপ ওভার শুরু করার ক্ষমতার ব্যবহার তুচ্ছ। একটি টার্মিনাল এ নিজে চেষ্টা করুন। এটির কাজ করার জন্য আপনার কন্ট্রোল-সি রাখা দরকার, যদি আপনার শরীরে ঘুম থাকে।
জানুস ট্রোলসেন

ঠিক। আমি মনে করি আমি এটি মিস করেছি এবং দেখিনি যে ঘুম এখনও লুপের শর্ত হিসাবে উপস্থিত রয়েছে। এই সামান্য ত্বকটি বেশ দুর্দান্ত।
স্টিভেন লু

4

2
এটি একটি বৈশিষ্ট্যযুক্ত 200 লাইনের বাশ স্ক্রিপ্ট যা statপ্রদত্ত ফাইলের নামগুলিতে পোল দেয়, md5sumআউটপুট চালায় এবং যদি এই মানটি পরিবর্তন হয় তবে প্রদত্ত আদেশটি পুনরায় চালায়। কারণ এটি বাশ, আমি সন্দেহ করি যে এটি প্রদত্ত কমান্ডটি ঠিক চালানোর মতো একটি ভাল কাজ করে যেমন আপনি কোনও বাশ প্রম্পটে টাইপ করেছেন। (বিপরীতে, এখানে অন্যান্য ভাষায় লিখিত বেশিরভাগ সমাধান কমান্ড কার্যকর করতে ব্যর্থ হবে যা উদাহরণস্বরূপ, শেল এলিয়াসগুলি ধারণ করে 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

এটি লিনাক্স-কেবল ব্যবহারকারীদের জন্য পৃষ্ঠায় সেরা উত্তর। লুপের ভিতরে থাকা জিনিসগুলিকে 'এক্সিকিউট। @' দিয়ে প্রতিস্থাপন করুন এবং ব্যবহারকারী এই স্ক্রিপ্টটি চালাতে তাদের নিজস্ব কমান্ডে কল করতে পারে। এমনকি "। স্ক্রিপ্টনাম COMMAND" এর মতো কিছু ব্যবহার করে যদি উত্স উত্স করে দেয় তবে শেল এলিয়াস ধারণ করে এমন কমান্ডগুলির সাথে এটি কাজ করে। এটি PATH এ স্ক্রিপ্টের নামটি খুঁজে পাবে।
জোনাথন হার্টলি

আমার মনে হয় আপনি 'রিপ্লাই পড়ার সময়' রেখেছেন?
জোনাথন হার্টলি

1
স্পষ্টতার জন্য ধন্যবাদ। এর পর্যায়ক্রমে কৃতজ্ঞতা! আমি এই মন্তব্যগুলি মুছে ফেলতাম, তবে অবশ্যই এখন আমি তা করব না।
জোনাথন হার্টলি

3

প্রোগ্রামিং সাইডে আরও কিছু, তবে আপনি ইনোটিফাইয়ের মতো কিছু চান । জোনটিফাই এবং পাইনিটিফাইয়ের মতো অনেক ভাষায় বাস্তবায়ন রয়েছে ।

এই গ্রন্থাগারটি আপনাকে একক ফাইল বা সম্পূর্ণ ডিরেক্টরিগুলি পর্যবেক্ষণ করতে দেয় এবং কোনও ক্রম সন্ধানের পরে ইভেন্টগুলি ফেরত দেয়। ফিরিয়ে দেওয়া তথ্যের মধ্যে রয়েছে ফাইলের নাম, ক্রিয়া (তৈরি, সংশোধন, পুনরায় নামকরণ, মুছুন) এবং ফাইলের পথ, অন্যান্য দরকারী তথ্যের মধ্যে।


3

আপনারা যারা ফ্রিবিএসডি সমাধান সন্ধান করছেন তাদের জন্য এখানে বন্দরটি দেওয়া হয়েছে:

/usr/ports/sysutils/wait_on

3

আমি এর সরলতা পছন্দ করি while inotifywait ...; do ...; doneতবে এর দুটি বিষয় রয়েছে:

  • সময় ঘটছে ফাইল পরিবর্তন do ...;করবে মিস করা
  • পুনরাবৃত্ত মোডে ব্যবহার করার সময় ধীর করুন

এর জন্য আমি একটি সহায়ক স্ক্রিপ্ট তৈরি করেছি যা এই সীমাবদ্ধতা ছাড়াই inotifwait ব্যবহার করে : inotifyexec

আমি তোমার মত আপনার পাথ এই স্ক্রিপ্টের করা সুপারিশ ~/bin/। কমান্ডটি চালিয়ে ব্যবহারের বর্ণনা দেওয়া হয়।

উদাহরণ: inotifyexec "echo test" -r .


রেজেক্স প্যাটার্ন মিলটিকে সমর্থন করতে স্ক্রিপ্টটি আপডেট করেছে Updated
ওয়ার্নাইট

"--Monitor" মোডে ইনোটিফাইয়েট ব্যবহার করে উভয় সমস্যার সমাধান করা হয়। সাইচোয়ের উত্তর দেখুন।
জোনাথন হার্টলি

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

আপনি রিফ্লেক্স চেষ্টা করতে পারেন ।

ডিরেক্টরি দেখার জন্য এবং নির্দিষ্ট ফাইলগুলি পরিবর্তিত হলে একটি কমান্ড পুনরায় চালু করার জন্য রিফ্লেক্স একটি ছোট সরঞ্জাম। সংকলন / লিন্ট / পরীক্ষামূলক কাজগুলি স্বয়ংক্রিয়ভাবে চালনার জন্য এবং কোড পরিবর্তন হলে আপনার অ্যাপ্লিকেশনটি পুনরায় লোড করার জন্য এটি দুর্দান্ত।

# 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

আপনার যদি প্রথম তারিখ শুরুর সময় হয় তবে আপনার বিএফ আরম্ভ করার দরকার নেই।

এটি সহজ এবং বহনযোগ্য। এখানে একটি স্ক্রিপ্ট ব্যবহার করে একই কৌশলের ভিত্তিতে আরও একটি উত্তর রয়েছে। একবার দেখুন।


ব্যবহার: আমি এটি ডিবাগ করতে এবং নজর রাখার জন্য ব্যবহার করছি ~/.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

এটি প্রতিটি লেখায় মাইফাইল.শ চলবে।


1

ওএস এক্স ব্যবহারকারীদের জন্য, আপনি পরিবর্তনের জন্য কোনও পাথ / ফাইল দেখতে লঞ্চএজেন্ট ব্যবহার করতে পারেন এবং যখন ঘটে তখন কিছু করতে পারেন। এফওয়াইআই - ডেমোনস / এজেন্টগুলি সহজেই তৈরি / সংশোধন / অপসারণের জন্য লঞ্চকন্ট্রোল একটি ভাল অ্যাপ।

( উদাহরণ এখান থেকে নেওয়া )

<?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>


0

গুগলিং দ্বারা নির্দিষ্ট ফাইলগুলিতে পরিবর্তনের জন্য যারা এটি খুঁজে পান তাদের পক্ষে উত্তরটি খুব সহজ ( গিলসের উত্তর দ্বারা অনুপ্রাণিত ) is

নির্দিষ্ট ফাইল লিখিত হওয়ার পরে যদি আপনি কিছু করতে চান তবে এখানে কীভাবে:

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/প্রারম্ভকালে চালানোর জন্য রাখুন।


গিলসের জবাব নিয়ে সমস্যাটি ভাগ করে দেয় যে এটি প্রতিটি পুনরাবৃত্তির উপর অকারণে চালিত হয়, যা খুব বড় ডিরেক্টরিগুলি পুনরাবৃত্তভাবে দেখার জন্য প্রতিক্রিয়াশীল হতে পারে। এটি ঠিক করার জন্য সাইচোয়ের উত্তর দেখুন।
জোনাথন হার্টলি

0

'ফিডো' সরঞ্জামটি এই প্রয়োজনের জন্য আর একটি বিকল্প হতে পারে। Https://www.joedog.org/fido-home/ দেখুন


দয়া করে পড়ুন আমি কীভাবে কিছু সফ্টওয়্যার প্রস্তাব দিচ্ছি যাতে সফ্টওয়্যারটি সুপারিশ করার বিষয়ে আপনাকে কীভাবে যেতে হবে। আপনার কমপক্ষে একটি লিঙ্ক সরবরাহ করা উচিত, সফ্টওয়্যার নিজেই সম্পর্কে কিছু অতিরিক্ত তথ্য এবং কীভাবে এটি সমস্যার সমাধান করতে ব্যবহার করা যেতে পারে।
ডেভিডপস্টিল

0

অন্য কয়েকজন যেমন করেছেন, আমি এটি করার জন্য একটি লাইটওয়েট কমান্ড লাইন সরঞ্জামও লিখেছি। এটি সম্পূর্ণরূপে নথিভুক্ত, পরীক্ষিত এবং মডুলার।

ওয়াচ করণীয়

স্থাপন

আপনি এটি ব্যবহার করে ইনস্টল করতে পারেন (যদি পাইথন 3 এবং পাইপ থাকে):

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

ব্যবহার

এটি সরাসরি চালিয়ে ব্যবহার করুন:

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

বৈশিষ্ট্য ওভারভিউ

  • ফাইল গ্লোববিং সমর্থন (ব্যবহার -w '*.py'বা -w '**/*.py')
  • ফাইল পরিবর্তনে একাধিক কমান্ড চালান (কেবলমাত্র -dপতাকাটি আবার নির্দিষ্ট করুন )
  • গ্লোববিং ব্যবহৃত হয় কিনা তা দেখার জন্য गतिशीलভাবে ফাইলগুলির তালিকা বজায় রাখে ( -rএটি চালু করার জন্য)
  • কোনও ফাইল "দেখার" একাধিক উপায়:
    • পরিবর্তনের সময় (ডিফল্ট)
    • ফাইল হ্যাশ
    • আপনার নিজের বাস্তবায়নের জন্য তুচ্ছ (এটি হল মডিফিকেশনটাইম প্রহরী)
  • মডুলার নকশা. আপনি যদি কমান্ডগুলি রান করতে চান, যখন কোনও ফাইল অ্যাক্সেস করা হয় তখন আপনার নিজের প্রহরীকে লেখার পক্ষে এটি তুচ্ছ (মেকানিজম এটি নির্ধারণ করে যে ডুয়ারগুলি চালিত করা উচিত কিনা)।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.