বাশ স্ক্রিপ্টটি সোর্সিং - প্রস্থানের পরিবর্তে ত্রুটিটি ফিরুন?


17

আমি টার্মিনালে একটি বাশ স্ক্রিপ্ট উত্সাহিত করছি , তাই ত্রুটির সাথে প্রস্থান করে

set -o errexit

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

এখনও অবধি, ব্যবহার করছি

command || return

স্ক্রিপ্টে লাইনগুলি, আমি যা চাই ঠিক তাই করছে

set -o errexit

করতে ... তবে আমি এটি পুরো স্ক্রিপ্টের জন্যই করতে চাই; শুধু একটি লাইন / কমান্ড নয়

সাইট স্থাপনের জন্য আমার কাছে একটি কমান্ড পূর্ণ ফাইল রয়েছে এবং আমি কমান্ডটি করব না || প্রত্যাবর্তন

ফাইলের প্রতিটি এক লাইনের জন্য

অন্য সেট বিকল্প আছে, বা অন্য কিছু যা টার্মিনালটি থেকে বেরিয়ে আসার পরিবর্তে "ফিরে" আসবে?

- কেবল স্পষ্টতার জন্য , আমি স্ক্রিপ্টটি মেরে ফেলতে চাই এবং টার্মিনালটিকে একই অবস্থায় ছেড়ে দিতে চাই যে টার্মিনালে চলমান কোনও পরিষেবা হ্রাস করতে সিটিআরএল + সি টিপুন। command || returnএটা করে তবে আমি || returnফাইলের প্রতিটি লাইন ধরে রাখতে চাই না। সুতরাং আমি অনুরূপ কিছু সন্ধান করছি set -o errexit, এটি টার্মিনালটি বন্ধ করে দেয় না

--- দ্রষ্টব্য: এতে দুটি লাইন দিয়ে একটি বোবা স্ক্রিপ্ট তৈরি করা হচ্ছে (সুপার.শ):

create_path=~/Desktop/site_builder/create.sh
source $create_path blah

এবং set -o errexitcreate.sh এর শীর্ষে স্থাপন করা,

আমি যেমনটি আশা করি ঠিক তেমন কাজ করে। যাইহোক, এটি দুটি বাইন দিয়ে একটি ফাইল তৈরি করতে সত্যিই বোকা, কেবল টার্মিনাল থেকে কল করার পরিবর্তে অন্য একটি বাশ স্ক্রিপ্ট কল করতে। Ugghhh

এখানে কিছু উদাহরণ:

সুপার.শ

#!/bin/bash

create_path=~/Desktop/site_builder/create.sh
source $create_path blah

create.sh এ

#!/bin/bash
set -o errexit
#line below this is a line that fails and will cause the script to stop and return to the terminal as expected 
sed "s/@@SITE_NAME@@/$dirname" 
~/Desktop/site_builder/template_files/base.html > ~/Desktop/$dirname/templates/base.html # a line with a stupid error

টার্মিনালে:

 $ bash super.sh

আশানুরূপ আউটপুট:

my-mac$

এইটা কাজ করে. কি বিরক্তিকর সমাধান।

আমি চাই , আদর্শভাবে, টার্মিনাল থেকে বোকা সুপার.শ ফাইলের মধ্যে যা চালানো হয়, সুপার.শ ফাইল নয়: ডি, টার্মিনালটি আমার উপর বন্ধ না করেই। আমি যা করার চেষ্টা করছি তার সাথে এটি ঘটে:

টার্মিনাল কমান্ড:

my-mac$ source $create_path blah

আমার এখনও আছে set -o errexit

টার্মিনালে আউটপুট এখানে

    sed: 1: "s/@@SITE_NAME@@/blah": unterminated substitute in regular expression
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[Process completed]

এবং তারপরে টার্মিনাল হিমশীতল। Ctrl + C কাজ করে না, Ctrl + Dও করে না

এর পরিবর্তে set -o errexit, যদি আমি কেবল command || returncreate.sh ফাইলে সর্বত্র বিবৃতি ব্যবহার করি , তবে আমি সরাসরি টার্মিনালে সুপারসার.শ লাইনে (টার্মিনাল থেকে সুপার.শ কল করার পরিবর্তে) লাস্টগুলি সম্পাদন করার সময় যা চাই তা ঠিক পাই। তবে এটি ব্যবহারিক সমাধানও নয়।

দ্রষ্টব্য: আমি কেবলমাত্র একটি শিশু শেল তৈরির বিষয়ে @ অ্যারডনের জবাব পছন্দ করেছি তাই আমি টার্মিনালের পরিবর্তে স্ক্রিপ্টের মাধ্যমে কেবল একটি সাব শেল তৈরি করেছি, যেমন তিনি ( )পুরো স্ক্রিপ্টের চারপাশে ব্রেস ব্যবহার করে তার উত্তরে দেখিয়েছিলেন .. তাঁর উত্তর খুব কাজ করে।


আপনি কি এটি কোনও স্ক্রিপ্টে করছেন বা ম্যানুয়ালি?
টেরডন

আমি টার্মিনালের উত্স সহ ফাইলটি কল করছি। যেমনটি রয়েছে: source $file_path argumentস্ক্রিপ্টটি একই শেলটিতে কার্যকর করা হচ্ছে যা থেকে আমি এটিকে ফোন করেছি (কী sourceকরে, আমাকে বলা হয়েছে ... এবং এর মতো কাজ করে) command || returnবিবৃতিগুলি টার্মিনালে আমি সম্পাদন করছি যে ফাইলটিতে রয়েছে

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

আমি মূল পোস্টে একটি নোট যুক্ত করেছি যা এতে সাহায্য করতে পারে। আপনার পরামর্শ অনুসারে আমিও তা করব।

উত্তর:


5

কেবলমাত্র একটি ব্যর্থ সাফের সাহায্যে ফাইলটি উত্স করুন:

source the-source-file || true

... তাহলে সামগ্রিক কমান্ড ব্যর্থ হবে না, এমনকি যদি source


আসলে, আমি ভেবেছিলাম এটিই আমি চেয়েছিলাম, তবে আমার টার্মিনালটি স্লো হচ্ছে ... source file || true এটি করবেন না, source file || return আমি যখন টার্মিনালে এটি টাইপ করি তখনও হয় না ...

ফাইল সোর্সিং আপনাকে শেল প্রম্পটে ফিরিয়ে দেয় না ??
জেফ শ্যাচলার

এটি আমার টার্মিনালে যা রয়েছে: Jills-MBP:~ jillr$ source ~/Desktop/site_builder/create.sh blah || trueএটি স্ক্রিপ্টের পরবর্তী অংশটি ব্যর্থভাবে কার্যকর করে, তাই সত্যের পরিবর্তে ফিরে আসে। একমাত্র যে কাজটি করেছে তা হ'ল command || returnসমস্ত কমান্ডের আসল ফাইলের বিবৃতি, যা নির্বোধ। আমি জানি না যদি এটি কোনও ফাংশনে ফেলে দেওয়া হয় তবে function || returnফাইলটির শেষে কল করা কোনও উপকার করতে পারে।

ঠিক আছে, যদি আপনি স্পষ্টভাবে || returnকোনও কমান্ডটি প্রয়োগ করেন যা ব্যর্থ হয় তবে হ্যাঁ, এটি ফিরে আসবে। আমি ভেবেছিলাম আমরা আপনার মূল / পিতামাতার শেলটি প্রস্থান করা থেকে বাঁচানোর চেষ্টা করছি?
জেফ শ্যাচলার

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

3

এটিই কেবল আমার কাজটি করার জন্য কাজ করে (ভার্চুয়াল পরিবেশ তৈরি করে এটি সক্রিয় করে, তারপরে ব্যাশ স্ক্রিপ্ট থেকে প্রয়োজনীয়তা ইনস্টল করে):

স্ক্রিপ্ট থেকে একটি সাব-শেল / চাইল্ড শেল তৈরি করুন, যেমন:

stupid_file.sh

(
set -o errexit
#bunch of commands
#one line fails
)

বোকা_ফায়াল ব্যবহার করে চালান:

source stupid_file.sh <file arguments here> || true

শেষ।

** একটি ধনুক নেয় **

(ক্রেডিট জেফ এবং টেরডনের কাছে যায়)


1
এটি কেবলমাত্র স্ক্রিপ্টটি উত্সাহিত করার পরিবর্তে কার্যকর করার চেয়ে আলাদা নয়।
চিপনার

নিবন্ধন করুন কুল। আমাকে কেবল কল করার চেষ্টা করতে হবে bash $create_path blahএবং দেখতে হবে যে এটি এখনও বাইরে চলেছে কি না এবং একইভাবে কার্যকর করে এবং এখনও আমার ভার্চুয়াল পরিবেশে স্টাফগুলি সঠিকভাবে ইনস্টল করে। এখন সময়ের বাইরে।

আমি আপনার সময় সাশ্রয় করব: এটি (যদি "স্টাফ ইনস্টল করে" বোঝায় আপনি আপনার বর্তমান শেলটিতে পরিবেশের ভেরিয়েবল সেট করেন), এবং উভয়ই হবে না (...), কারণ প্রথম বন্ধনীগুলির সমস্ত অ্যাসাইনমেন্টগুলি কেবল এই সাবশেলের উপর প্রভাব ফেলে। foo=3; (foo=5); echo "$foo"ইচ্ছা আউটপুট 3, না 5.
chepner

পছন্দ করুন আমি source fileটার্মিনাল থেকে কল করতে এবং একই ফলাফল আশা করতে পারি না । কারণ এটি কখনই কাজ করেনি। আমি যখন একই ফলাফলটি পাই তখনই আমি টার্মিনালের মাধ্যমে বা স্ক্রিপ্ট থেকে স্পষ্টভাবে একটি সাব শেল তৈরি করি। আমি তবে স্ক্রিপ্টটি bashsource

ইনস্টল স্টাফ দ্বারা চেকনার, আমার অর্থ আসলে ভার্চুয়াল পরিবেশ তৈরি করা, সেই ভার্চুয়াল পরিবেশটি সক্রিয় করুন এবং তারপরে pip install -r $apath/requirements.txtসেই সক্রিয় পরিবেশের মধ্যেই কার্যকর করুন । এই কারণেই আমি স্ক্রিপ্টটি কল করার জন্য প্রথম স্থানে উত্সটি ব্যবহার করেছি

1

একটি সাধারণ কাজ হিসাবে আপনি নিজের বর্তমান শেল এবং উত্সটিতে একটি শেল চালাতে পারেন। কিছুটা এইরকম:

  1. একটি নতুন টার্মিনাল খুলুন এবং আপনার পছন্দ মতো সবকিছু সেট করুন। আপনি কিছু পরিবেশের পরিবর্তনশীল এবং এর মতো উল্লেখ করেছেন। তাদের এখানে সেট আপ করুন।

  2. সেই টার্মিনালে, একটি নতুন শেল শুরু করুন। উদাহরণস্বরূপ bash,।

  3. আপনার জিনিস করতে. আপনার স্ক্রিপ্ট উত্স। যদি এটি প্রস্থান করে, আপনি কেবল প্রথম শেলের মধ্যে ফেলে দিয়েছেন এবং সবকিছু এখনও সেট আপ করা আছে। কেবল bashআবার চালান এবং আপনি আবার ব্যবসায়ে ফিরে এসেছেন।

উদাহরণস্বরূপ, আমি এই স্ক্রিপ্টটি তৈরি করেছি যা আপনি এটি উত্স করার চেষ্টা করলে ব্যর্থ হবে:

$ cat /home/terdon/scripts/bar.sh
set -o errexit
var='bar

দেখি যদি আমি একটি নেস্টেড শেল সেশন শুরু এবং তারপর উৎস কী ঘটবে যাক (নোট যে আমি পোর্টেবল নাম ব্যবহার করছি sourceকমান্ড .; sourceএকটি bashism হয়):

parent-shell $ bash      ## start a new shell
child-shell $ . ~/scripts/bar.sh
bash: /home/terdon/scripts/bar.sh: line 2: unexpected EOF while looking for matching `''
parent-shell $ 

যেমন আপনি দেখতে পাচ্ছেন, সিনট্যাক্স ত্রুটির কারণে সর্স স্ক্রিপ্টটি প্রস্থান হয়ে গেছে যার ফলস্বরূপ আমার শেল সেশনটি প্রস্থান করল কিন্তু যেহেতু এটি একটি নেস্টেড সেশন ছিল, যা আমাকে ঠিক মূলটিতে ফিরে এসেছে, সমস্ত ভেরিয়েবল সহ প্যারেন্ট শেলটি এখনও সেট আপ হয়েছে up । এখন, আবার একটি নতুন শেল চালান এবং আপনি আপনার স্ক্রিপ্টটি সোর্সিংয়ে ফিরে যেতে পারেন।


আমি এটি সত্যিই দ্রুত চেষ্টা করতে যাচ্ছি

এর উদ্দেশ্যসই প্রভাব রয়েছে ... খারাপ দিকটি হ'ল আমি প্যারেন্ট শেলটির জন্য যে ভেরিয়েবলগুলি তৈরি করি তা চাইল্ড শেলটিতে অ্যাক্সেসযোগ্য হয় না, যার মধ্যে চাইল্ড শেলটিতে আমার কার্যকর করার জন্য প্রয়োজনীয় একটি ভেরিয়েবল থাকে। আমি যে ফাইলটি চালাচ্ছি তার থেকে সাবসেল স্পোন করার কোনও উপায় আছে? এইভাবে, আমি এখনও পিতামাতার শেলের মধ্যে স্ক্রিপ্টটি কল করতে পারি এবং এখনও আমার প্রয়োজনীয় ভেরিয়েবলগুলি অ্যাক্সেস করতে পারি? আমি আক্ষরিক অর্থে create_path=~/Desktop/site_builder/create.sh প্যারেন্ট শেল এ সেট করছি কারণ আমি প্রায়শই এটি করি। এবং আমার স্ক্রিপ্টটি সম্পাদন করার জন্য উত্স - ক্রিয়েটিপথ [যুক্তি] কল করা দরকার।

1
@ জিলরাসেক যদি ভেরিয়েবলগুলি শিশু শেলের কাছে না পৌঁছে দেয় তবে আপনি সেগুলি ইঙ্গিত করছেন না export। তবে আপনি যা বর্ণনা করেছেন তা খুব সামান্যই বোধগম্য। এটি XY সমস্যার মতো আরও বেশি শোনাচ্ছে । আপনার শেষ উদ্দেশ্যটি কী তা বোঝাতে আপনি একটি নতুন প্রশ্ন পোস্ট করতে চাইতে পারেন। আমি বাজি ধরছি আমরা আপনাকে আরও ভাল সমাধান দিতে পারি যা এই সমস্ত অদ্ভুত উত্সাদন।
টেরডন

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

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