আপনি প্রসারিত হয়ে পুনঃনির্দেশের কারণ ঘটতে না পারার কারণটি "$HideErrors"
হ'ল প্যারামিটার বিস্তৃতি>
দ্বারা উত্পাদিত হওয়ার পরে যেমন প্রতীকগুলি বিশেষভাবে চিকিত্সা করা হয় না । এটি প্রকৃতপক্ষে খুব ভাল, কারণ এই জাতীয় চিহ্নগুলি পাঠ্যে প্রদর্শিত হবে যা আপনি আক্ষরিকভাবে প্রসারিত করতে এবং ব্যবহার করতে চাইতে পারেন।
এটি আপনার উদ্ধৃতি কিনা তা ধরে রাখে $HideErrors
। প্যারামিটার প্রসারণের ফলাফলটি শব্দ বিভাজন এবং গ্লোব্বিংয়ের সাপেক্ষে যখন সম্প্রসারণটি অব্যক্ত থাকে, তবে এটি।
এটি সম্পর্কে কী করা উচিত, শর্তসাপেক্ষে পুনঃনির্দেশটি অর্জনের অসংখ্য উপায় রয়েছে। খুব সাধারণ কমান্ডের জন্য, পুরো কমান্ডটি দু'বার লিখতে যুক্তিযুক্ত হতে পারে, একবার case
বা if
- else
কনস্ট্রাক্টের প্রতিটি শাখায় একবার । এটি শীঘ্রই বোঝা হয়ে ওঠে, এবং আপনি যে আদেশটি দেখিয়েছেন তা অবশ্যই এমন একটি ঘটনা যেখানে এটি আদর্শ হবে না।
আপনার নিজের পুনরাবৃত্তি এড়াতে দেয় এমন পদ্ধতির মধ্যে দুটি বিশেষত আমি বিশেষ করে সুপারিশ করি কারণ এগুলি বেশ পরিষ্কার এবং সঠিকভাবে পাওয়া সহজ। আপনি একই কমান্ড এবং পুনঃনির্দেশের জন্য একবারে নয়, এর মধ্যে একটিরও ব্যবহার করতে চান।
পুনর্নির্দেশের পরিবর্তে কমান্ডটি সঞ্চয় করুন। পুনঃনির্দেশটি একটি ভেরিয়েলেলে সংরক্ষণ করার চেষ্টা করার পরিবর্তে এবং পরামিতি প্রসারণ প্রয়োগ করার পরিবর্তে শেল ফাংশনে কমান্ডটি সংরক্ষণ করুন । তারপরে একটি case
বা if
- লিখুন else
, যাতে ফাংশনটি একটি শাখায় পুনর্নির্দেশের সাথে এবং অন্যটিতে ছাড়াই ডাকা হয়।
আপনি যদি আপনার কমান্ডটি কোড হিসাবে কল্পনা করেন যা আপনি একবার লিখতে চান তবে একাধিক পরিস্থিতিতে চালিত হন, তবে একটি ফাংশন হ'ল প্রাকৃতিক সমাধান। আমি সাধারণত এটিই করি। এটা তন্ন তন্ন একটি প্রয়োজন সুবিধা রয়েছে subshell কিংবা ম্যানুয়াল স্টোরেজ এবং রাষ্ট্র রিসেট।
আপনার কোড সহ:
launch() {
google-chrome --headless --disable-gpu --dump-dom \
"$RobWebAddress" > "$DownloadName"
}
case $fCron in
true) launch 2>/dev/null;;
*) launch;; # Get silly error messages when running from terminal
esac
আপনার পছন্দসই ফাঁকা জায়গাগুলি আপনি প্রয়োগ করতে পারেন বা if
- এর else
পরিবর্তে আপনি যদি পছন্দ করেন তবে। নোট করুন যে launch
কলার RobWebAddress
এবং DownloadName
ভেরিয়েবলগুলি স্বয়ংক্রিয়ভাবে তারা স্থানীয় ভেরিয়েবলগুলি ব্যবহার করে, কারণ বাশ গতিশীলভাবে স্কোপযুক্ত , বেশিরভাগ প্রোগ্রামিং ভাষার থেকে ভিন্ন যা লাক্ষিকভাবে স্কোপযুক্ত।
কমান্ডটি একটি সাব-শেলের মধ্যে চালান এবং শর্তসাপেক্ষে পুনঃনির্দেশটি প্রয়োগ করুন exec
। এই কি সম্পর্কে মন্তব্য করেছে steeldriver কিন্তু ভিতরে (
)
প্রভাব স্থানীয় রাখার । যখন builtin কোন যুক্তি দিয়ে চালানো হয়, এটি একটি নতুন প্রক্রিয়ার সঙ্গে বর্তমান শেল প্রতিস্থাপন করে না, কিন্তু এর পরিবর্তে বর্তমান শেল তার পুনঃনির্দেশগুলি কোন প্রযোজ্য।exec
(স্ট্যান্ডার্ড ত্রুটিটি কী ছিল তা ট্র্যাক করে রাখা এবং এটি পুনরুদ্ধার করা সম্ভব, সাবসেল ব্যবহার না করে এবং এইভাবে বর্তমান শেলের পরিবেশ পরিবর্তন করার ক্ষমতাকে ত্যাগ না করে I'll
আপনার কোড সহ:
(
# Suppress silly error messages unless running from terminal
case $fCron in true) exec 2>/dev/null;; esac
google-chrome --headless --disable-gpu --dump-dom \
"$RobWebAddress" > "$DownloadName"
)
সমাপ্তির পরে )
, স্ট্যান্ডার্ড ত্রুটি কার্যকরভাবে যা ছিল তা আগেরটিতে পুনঃস্থাপন করা হয়েছে, কারণ এটি কেবল সত্যিকারের সাবহেলে পুনর্নির্দেশ করা হচ্ছে, প্যারেন্ট শেলের ক্ষেত্রে নয়। এটি, বিদ্যমান শেল ভেরিয়েবলগুলির সাথেও দুর্দান্ত কাজ করে, যেহেতু সাব-শেলগুলি সেগুলির একটি অনুলিপি পায়। যদিও আমি শেল ফাংশনটি ব্যবহার করতে পছন্দ করি, আমি স্বীকার করি এই পদ্ধতিতে কম কোডের প্রয়োজন হতে পারে।
যে ফাইল বা ডিভাইসের স্ট্যান্ডার্ড ত্রুটি শুরু হয় তা নির্বিশেষে উভয় পদ্ধতিই কাজ করে, শর্ত ফাংশনগুলিতে প্রয়োগ হওয়া পুনর্নির্দেশগুলির ক্ষেত্রে যেমন শর্তযুক্ত আচরণ রয়েছে এমন কোডকে কল করে, সেই ক্ষেত্রে (আপনার সম্পাদনায় উল্লেখ করা হয়েছে) যেখানে স্ট্যান্ডার্ড ত্রুটি রয়েছে পুরো স্ক্রিপ্টটি ইতিমধ্যে কোনও পূর্ববর্তী বা দ্বারা পুনঃনির্দেশিত হয়েছে । প্রক্রিয়া প্রতিস্থাপন দ্বারা যে পথটি তৈরি হয়েছিল তা কোনও সমস্যা নয়।exec 2>&fd
exec 2> path
[[ $fCron == true ]] && exec 2>/dev/null
পরিবর্তে চেষ্টা করতে পারেন