চলমান অবস্থায় শেল স্ক্রিপ্ট সম্পাদনা করুন


96

শেল স্ক্রিপ্ট চলার সময় আপনি কী সম্পাদনা করতে পারবেন এবং পরিবর্তনগুলি চলমান স্ক্রিপ্টকে প্রভাবিত করতে পারে?

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

যদি সম্ভব না হয়, এমন কোনও শেল বা ব্যাচ-প্রক্রিয়া আছে যা আমাকে এটি করার অনুমতি দেয়?

অবশ্যই আমি এটি চেষ্টা করেছি, তবে এটি কাজ করে কি না তা দেখার কয়েক ঘন্টা আগেই হবে এবং পর্দার আড়ালে কী ঘটছে বা কী ঘটছে তা সম্পর্কে আমি আগ্রহী।


4
একটি চলমান স্ক্রিপ্টের জন্য স্ক্রিপ্ট ফাইল সম্পাদনা করার দুটি ফল আমি দেখেছি: 1) পরিবর্তনগুলি এমনভাবে উপেক্ষা করা হয় যেন এটি মেমরিতে পুরো জিনিসটি পড়েছিল বা 2) স্ক্রিপ্টটি একটি ত্রুটির সাথে ক্র্যাশ করেছে যেন এটি কমান্ডের কিছু অংশ পড়েছে। আমি জানি না যে এটি স্ক্রিপ্টের আকারের উপর নির্ভরশীল কিনা। যেভাবেই হোক, আমি এটি চেষ্টা করব না।
পল টমলিন

সংক্ষেপে: না, যদি না এটি স্ব-রেফারেন্সিয়াল / ডেকে আনা হয়, সেক্ষেত্রে মূল স্ক্রিপ্টটি এখনও পুরানো হবে।
রিক্কেন

এখানে দুটি গুরুত্বপূর্ণ প্রশ্ন রয়েছে। 1) আমি কীভাবে সঠিকভাবে এবং নিরাপদে একটি চলমান স্ক্রিপ্টে কমান্ড যুক্ত করতে পারি? 2) আমি যখন একটি চলমান স্ক্রিপ্ট পরিবর্তন করব তখন কী হবে?
ক্রিস কুইনলে

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

উত্তর:


-69

স্ক্রিপ্টগুলি সেভাবে কাজ করে না; এক্সিকিউটিভ কপিটি আপনি সম্পাদনা করছেন এমন উত্স ফাইল থেকে স্বতন্ত্র। পরের বার স্ক্রিপ্টটি চালানো হবে, এটি উত্স ফাইলটির সর্বাধিক সংরক্ষিত সংস্করণের ভিত্তিতে তৈরি হবে।

এই স্ক্রিপ্টটি একাধিক ফাইলে বিভক্ত করা এবং স্বতন্ত্রভাবে চালানো বুদ্ধিমানের কাজ হতে পারে। এটি কার্যকর করার সময়টিকে ব্যর্থতায় কমিয়ে দেবে। (অর্থাত্, ব্যাচটিকে একটি বিল্ড ফ্লেভার স্ক্রিপ্টগুলিতে বিভক্ত করুন, প্রত্যেকে স্বতন্ত্রভাবে চালাচ্ছেন যে কোনটি সমস্যা সৃষ্টি করছে তা দেখতে)।


68
আমি বিপরীত পর্যবেক্ষণ করেছি। সম্পাদনা করা বাশ স্ক্রিপ্টগুলি চালানো চলমান স্ক্রিপ্টটি ক্র্যাশ করতে পারে কারণ ফাইলটি ব্যাশের স্ক্রিপ্টের পড়া ফাইল অবস্থানের অধীনে চলেছে বলে মনে হচ্ছে।
তিলমান ভোগেল

10
একাধিক সিস্টেমে আমার অভিজ্ঞতায় এক্সিকিউটিভ কপিটি ডিস্ক ফাইল থেকে স্বতন্ত্র নয়, এজন্য শেল স্ক্রিপ্ট প্রোগ্রামিংয়ে এই বিষয়টি এত অবাক এবং গুরুত্বপূর্ণ।
ক্রিস কোনেল

6
এটি অবশ্যই অন ​​ডিস্ক ফাইল থেকে স্বাধীন নয় । শেলটি সাধারণত ব্লকগুলির স্ক্রিপ্টগুলি সাধারণত উদাহরণস্বরূপ, 128 বাইট বা 4096 বাইট বা 16384 বাইট পড়ে এবং কেবল যখন নতুন ইনপুট প্রয়োজন তখন কেবল পরবর্তী ব্লকটি পড়ে। (আপনি কোনও স্ক্রিপ্ট চালানো শেলের উপর লসফের মতো কাজগুলি করতে পারেন এবং দেখুন এটি ফাইলটি এখনও খোলা আছে))
মীরাবিলোস

4
না। আসলে আপনি যদি কোনও স্ক্রিপ্ট সম্পাদনা করেন তবে এটি প্রক্রিয়াটিকে ব্যর্থ করে দেয়।
এরিক অ্যারোনস্টি

8
আপনি সঠিক না। এটি বাস্তবায়নের উপর নির্ভর করে এবং স্ক্রিপ্টে প্রকৃত কমান্ড ডেকে আনা হচ্ছে, stdout কোনও ফাইলে পুনর্নির্দেশ করা হয়েছে কিনা, অনেকগুলি কারণ রয়েছে এবং আপনার উত্তরটি কেবল সঠিক নয়।
GL2014

52

এটি আমার পরিবেশে কমপক্ষে বাশকে প্রভাবিত করে তবে খুব অপ্রীতিকর উপায়ে । এই কোডগুলি দেখুন। প্রথম a.sh:

#!/bin/sh

echo "First echo"
read y

echo "$y"

echo "That's all."

b.sh:

#!/bin/sh

echo "First echo"
read y

echo "Inserted"

echo "$y"

# echo "That's all."

কর

$ cp a.sh run.sh
$ ./run.sh
$ # open another terminal
$ cp b.sh run.sh  # while 'read' is in effect
$ # Then type "hello."

আমার ক্ষেত্রে, আউটপুট সর্বদা:

হ্যালো
হ্যালো
এখানেই শেষ.
এখানেই শেষ.

(অবশ্যই এটি স্বয়ংক্রিয়ভাবে চালানো আরও অনেক ভাল, তবে উপরের উদাহরণটি পাঠযোগ্য)

[সম্পাদনা] এটি অনির্দেশ্য, এইভাবে বিপজ্জনক। সেরা কার্যসংক্রান্ত নেই , যেমন এখানে বর্ণিত একটি বক্রবন্ধনী সমস্ত করা, এবং ক্লোজিং বক্রবন্ধনী আগে, "প্রস্থান" করা । সমস্যাগুলি এড়াতে লিঙ্কযুক্ত উত্তরটি ভালভাবে পড়ুন

[যুক্ত] সঠিক আচরণটি একটি অতিরিক্ত নিউলাইন, এবং সম্ভবত আপনার ইউনিক্স গন্ধ, ফাইল সিস্টেম ইত্যাদির উপরও নির্ভর করে যদি আপনি কিছু প্রভাব দেখতে চান তবে খালি b.sh এর আগে এবং / অথবা পরে "ইকো foo / বার" যুক্ত করুন "পড়ুন" লাইন।


4
মিঃ আমি স্নেহ দেখছি না। আমি কিছু অনুপস্থিত করছি?
ব্যবহারকারী অজানা

সঠিক আচরণটি একটি অতিরিক্ত নতুনলাইন এবং সম্ভবত ইউনিক্স ফ্লেভার, ফাইলসিস্টেম ইত্যাদির উপরও নির্ভর করে বলে মনে করে যে এটি ঠিক নয়। আপনি যদি কোনও প্রভাব দেখতে চান তবে কেবল b.shইকো ফু / বার / বাজ 10 লাইন যুক্ত করে বাড়ান। Dave4220 এবং আমার উত্তরগুলির সংক্ষিপ্তসারটি হল এর প্রভাবটি পূর্বাভাস দেওয়া সহজ নয়। (
বিটিডাব্লু

হ্যাঁ, এটি খুব ভেঙে গেছে আমার একটি সমাধান রয়েছে (নীচে)। এর চেয়েও মারাত্মক আর কী তা হল এসএনএন /
আরএসএনসি

40

এটি ব্যবহার করে দেখুন ... একটি ফাইল তৈরি করুন bash-is-odd.sh:

#!/bin/bash
echo "echo yes i do odd things" >> bash-is-odd.sh

এটি প্রমাণ করে যে বাশ প্রকৃতপক্ষে "আপনি যেমন যান" স্ক্রিপ্টটির ব্যাখ্যা করছেন। প্রকৃতপক্ষে, একটি দীর্ঘ-চলমান স্ক্রিপ্ট সম্পাদনা করার অপ্রত্যাশিত ফলাফল রয়েছে, এলোমেলো অক্ষর serোকানো ইত্যাদি কেন? কারণ বাশ শেষ বাইট অবস্থান থেকে পড়ে, তাই সম্পাদনাটি বর্তমান চরিত্রের অবস্থানটি স্থানান্তরিত করে।

এই "বৈশিষ্ট্য" এর কারণে বাশ এক কথায় খুব খুব নিরাপদ। এসএনএন এবং rsyncযখন ব্যাশ স্ক্রিপ্টগুলি ব্যবহার করা হয় তখন বিশেষত উদ্বেগ হয় কারণ ডিফল্টরূপে তারা ফলাফলগুলিকে "মার্জ" করে দেয় ... জায়গায় সম্পাদনা করে। rsyncএকটি মোড আছে যা এটি স্থির করে। এসএনএন এবং গিট না।

আমি একটি সমাধান উপস্থাপন। নামক একটি ফাইল তৈরি করুন /bin/bashx:

#!/bin/bash
source "$1"

এখন #!/bin/bashxআপনার স্ক্রিপ্টগুলিতে ব্যবহার করুন এবং সর্বদা এর bashxপরিবর্তে এগুলি চালান bash। এটি সমস্যার সমাধান করে - আপনি rsyncআপনার স্ক্রিপ্টগুলি নিরাপদে রাখতে পারেন ।

@ AF7 দ্বারা বিকল্প (ইন-লাইন) সমাধান প্রস্তাবিত / পরীক্ষিত:

{
   # your script
} 
exit $?

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


4
বিটিডব্লিউ; বিয়োগটি মোকাবেলার জন্য এখানে একটি প্লাস এবং কারণ আপনার সম্পাদিত উত্তরটি আমার পছন্দ হয়েছে।
অ্যান্ড্রু বারবার

4
আমি এটি সুপারিশ করতে পারি না। এই কর্মপরীক্ষায়, অবস্থানগত পরামিতিগুলি একে একে স্থানান্তরিত হয়। এছাড়াও মনে রাখবেন যে আপনি $ 0 এ কোনও মান নির্ধারণ করতে পারবেন না। এর অর্থ যদি আপনি কেবল "/ bin / bash" "" / bin / bashx "তে পরিবর্তন করেন তবে অনেকগুলি স্ক্রিপ্ট ব্যর্থ হয়।
টিকা কাজুরা

4
দয়া করে আমাকে বলুন যে ইতিমধ্যে ইতিমধ্যে একটি বিকল্প কার্যকর করা হয়েছে!
এএফ 7

10
একটি সহজ সমাধান, আমার বন্ধু জিউলিওর দ্বারা প্রস্তাবিত (ক্রেডিটগুলি যেখানে দিতে হবে) the শুরুতে এবং sc স্ক্রিপ্টের শেষে toোকাতে হবে। বাশ বাধ্য হয়ে স্মৃতিতে সমস্ত কিছু পড়তে বাধ্য।
এএফ 7

4
@ এফ 7 আপনার বন্ধুর সমাধানে উন্নতি করছে: _ আপনার_কোড; & & প্রস্থান; শেষের সাথে যুক্ত লাইনগুলিকেও কার্যকর করা থেকে আটকাবে।
কর্কম্যান

17

আপনার স্ক্রিপ্টটি ফাংশনে বিভক্ত করুন এবং প্রতিবার কোনও ফাংশন আপনাকে sourceআলাদা ফাইল থেকে ডেকে আনে। তারপরে আপনি যে কোনও সময় ফাইলগুলি সম্পাদনা করতে পারবেন এবং আপনার চলমান স্ক্রিপ্টটি পরের বার এটি উত্সাহিত হওয়ার পরে পরিবর্তনগুলি গ্রহণ করবে।

foo() {
  source foo.sh
}
foo

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

3

ভাল প্রশ্ন! আশা করি এই সহজ স্ক্রিপ্টটি সাহায্য করবে

#!/bin/sh
echo "Waiting..."
echo "echo \"Success! Edits to a .sh while it executes do affect the executing script! I added this line to myself during execution\"  " >> ${0}
sleep 5
echo "When I was run, this was the last line"

এটি লিনাক্সের নীচে দেখে মনে হচ্ছে যে এক্সিকিউটিভ .sh এ পরিবর্তনগুলি কার্যকর করা স্ক্রিপ্ট দ্বারা প্রণীত হয়েছে, যদি আপনি যথেষ্ট দ্রুত টাইপ করতে পারেন!


2

একটি আকর্ষণীয় পার্শ্ব নোট - আপনি যদি পাইথন স্ক্রিপ্টটি চালাচ্ছেন তবে এটি পরিবর্তন হয় না। (শেল কীভাবে পাইথন স্ক্রিপ্টগুলি চালায় তা যে কেউ বুঝতে পারেন এটি সম্ভবত স্পষ্টভাবে স্পষ্ট, তবে ভেবেছিলেন যে এই কার্যকারিতাটি অনুসন্ধান করার জন্য এটি কোনও দরকারী অনুস্মারক হতে পারে))

আমি তৈরি করেছি:

#!/usr/bin/env python3
import time
print('Starts')
time.sleep(10)
print('Finishes unchanged')

তারপরে অন্য শেলের মধ্যে, যখন এটি ঘুমাচ্ছে, শেষ লাইনটি সম্পাদনা করুন। যখন এটি সম্পূর্ণ হয় এটি আনল্টার্ড লাইনটি প্রদর্শন করে, সম্ভবত এটি কারণ এটি চলছে .pyc? উবুন্টু এবং ম্যাকোজে একই ঘটনা ঘটে।


1

আমি সিএস ইনস্টল করা নেই, কিন্তু

#!/bin/sh
echo Waiting...
sleep 60
echo Change didn't happen

এটি চালান, দ্রুত পড়ার জন্য শেষ লাইনটি সম্পাদনা করুন

echo Change happened

আউটপুট হয়

Waiting...
/home/dave/tmp/change.sh: 4: Syntax error: Unterminated quoted string

হার্ফ

আমার ধারণা শেল স্ক্রিপ্টগুলিতে সম্পাদনাগুলি পুনরায় চালু না হওয়া পর্যন্ত কার্যকর হবে না।


4
উদ্ধৃতিতে আপনি যে স্ট্রিংটি প্রদর্শন করতে চান তা আপনার করা উচিত।
ব্যবহারকারী 1463308

4
প্রকৃতপক্ষে, এটি প্রমাণ করে যে আপনার সম্পাদক যেভাবে মনে করেন সেভাবে কাজ করে না। অনেকগুলি, অনেক সম্পাদক (ভিএম, ইমাস সহ) একটি "টিএমপি" ফাইলটিতে পরিচালনা করেন, এবং লাইভ ফাইলটি নয়। Vi / emacs এর পরিবর্তে "প্রতিধ্বনি 'ইকো আহ ওহ >> >> myshell.sh" ব্যবহার করার চেষ্টা করুন ... এবং এটি নতুন স্টাফের ফলাফল হিসাবে দেখুন। আরও খারাপ ... এসএনএন এবং আরএসএনসিও এইভাবে সম্পাদনা করুন!
এরিক অ্যারোনস্টি

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

4
ত্রুটিটি ঘটেছে তা দেখায় যে সম্পাদনাটির উদ্দেশ্যযুক্ত প্রভাব ছিল না।
danmcardle

কে জানে? হয়তো বাশ সা Change didn'ned
কিরিল বুলিগিন

1

যদি এগুলি সবই একক স্ক্রিপ্টে থাকে তবে এটি কোনও কাজ করবে না। তবে আপনি যদি এটিকে সাব-স্ক্রিপ্টগুলিতে কলকারী ড্রাইভার স্ক্রিপ্ট হিসাবে সেট আপ করেন তবে আপনি একটি সাব-স্ক্রিপ্ট কল করার আগে বা আপনি লুপিংয়ের আগে আবার ডাকার আগে এটি পরিবর্তন করতে সক্ষম হবেন এবং সে ক্ষেত্রে আমি এই পরিবর্তনগুলি বিশ্বাস করি মৃত্যুদন্ড কার্যকর হবে।


0

আমি শুনছি না ... তবে কিছুটা অনুপ্রেরণা নিয়ে কী হবে:

BatchRunner.sh

Command1.sh
Command2.sh

কমান্ড 1.sh

runSomething

কমান্ড 2.sh

runSomethingElse

তাহলে আপনার প্রতিটি কমান্ড ফাইলের বিষয়বস্তুগুলি ব্যাচআর্নার ঠিকমতো পাওয়ার আগেই সম্পাদনা করতে সক্ষম হবেন?

বা

একটি ক্লিনার সংস্করণে ব্যাচআরনারের একটি একক ফাইলে নজর থাকবে যেখানে এটি একযোগে এক লাইন চালিয়ে যাবে run তাহলে প্রথমটি ঠিকঠাক চলাকালীন আপনার দ্বিতীয় ফাইলটি সম্পাদনা করতে সক্ষম হওয়া উচিত?


আমি অবাক হই যে এটি চালানোর জন্য এটি যদি তাদের স্মৃতিতে লোড করে এবং মূল প্রক্রিয়াটি শুরু হওয়ার পরে কোনও পরিবর্তন আসে না ...
এরিক হোডনস্কি

0

আপনার স্ক্রিপ্টিং এর জন্য Zsh ব্যবহার করুন।

এএএএফসিটি, জেডএস এই হতাশাজনক আচরণটি প্রকাশ করে না।


এই কারণেই # 473 টি Zsh কে বাশকে পছন্দ করা উচিত। আমি সম্প্রতি একটি পুরাতন বাশ স্ক্রিপ্টে কাজ করছি যা চালাতে 10 মি লাগে, এবং এটি শেষ হওয়ার অপেক্ষায় আমি এটি সম্পাদনা করতে পারি না!
মিকাহ এলিয়ট

-5

সাধারণত আপনার স্ক্রিপ্টটি চলার সময় সম্পাদনা করা অস্বাভাবিক mon আপনাকে যা করতে হবে তা হ'ল আপনার ক্রিয়াকলাপ নিয়ন্ত্রণের জন্য রাখা। শর্তগুলি পরীক্ষা করার জন্য / অন্য বিবৃতি ব্যবহার করুন। যদি কিছু ব্যর্থ হয়, তবে এটি করুন, অন্যথায় এটি করুন। এটাই যাওয়ার পথ।


ব্যাচ জব মিড মিড অপারেশনটি পরিবর্তনের সিদ্ধান্ত নেওয়ার চেয়ে স্ক্রিপ্টগুলি ব্যর্থ হওয়ার বিষয়ে এটি আসলে কম। IE বুঝতে পেরে আমি আরও কিছু সংকলন করতে চাই, বা আমার কাছে ইতিমধ্যে সারিতে থাকা নির্দিষ্ট কিছু কাজের দরকার নেই।
ack

4
আপনি যদি স্ক্রিপ্টগুলিতে কঠোরভাবে সংযোজন করেন, তবে বাশ আপনার প্রত্যাশা অনুযায়ী করবে!
এরিক অ্যারোনস্টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.