ব্যাশ স্ক্রিপ্ট সাইনআপ দেখছে না?


11

আমি নিম্নলিখিত স্ক্রিপ্ট পেয়েছি:

#!/bin/bash
echo "We are $$"
trap "echo HUP" SIGHUP
cat    # wait indefinitely

আমি যখন প্রেরণ করি SIGHUP(ব্যবহার করে kill -HUP pid) তখন কিছুই হয় না।

আমি যদি স্ক্রিপ্টটি কিছুটা পরিবর্তন করি:

#!/bin/bash
echo "We are $$"
trap "kill -- -$BASHPID" EXIT    # add this
trap "echo HUP" SIGHUP
cat    # wait indefinitely

... তারপরে স্ক্রিপ্টটি echo HUPজিনিসটি ঠিকঠাকভাবে বেরিয়ে আসে (যখন আমি Ctrl + C টিপবো):

roger@roger-pc:~ $ ./hupper.sh 
We are 6233
^CHUP

কি হচ্ছে? SIGHUPএই স্ক্রিপ্টে আমার কীভাবে সংকেত পাঠানো উচিত (এটি আবশ্যকভাবে হওয়ার দরকার নেই )?


4
catপ্রক্রিয়া শেষ হলে সংকেত সরবরাহ করা হবে এবং সিগন্যাল হ্যান্ডলার কার্যকর করা হবে । প্রক্রিয়াটি প্রস্থান Ctrl+Dকরার জন্য আপনার মূল স্ক্রিপ্টটি টিপুন এবং টিপুন cat। যদিও catপ্রক্রিয়া ফোরগ্রাউন্ড হয়, HUPসংকেত সে অনুপাতে কাজ করা হয় না। catপ্রতিস্থাপন read(একটি শেল বিল্ট-ইন) দিয়ে আবার চেষ্টা করুন ।
কুসালানন্দ

পারফেক্ট। কেউ কি অভিনব একটি উত্তর এটি পরিণত?
রজার লিপসক্বে

আমি জানি যে এটি সেভাবেই কাজ করে তবে আমি যে কাউকে আমার চেয়ে আরও অন্তর্দৃষ্টি আছে তার মধ্যে হ্যাঁ এবং কারণেই উত্তর দিতে দেব।
কুসালানন্দ

আমি while true; do read; doneশেষ পর্যন্ত ব্যবহার করেছি , অন্যথায় পাঠ্য প্রবেশ করানো এটির পাশাপাশি বন্ধ হয়ে যায় এবং আমি এটি Ctrl + C এ ছেড়ে দিতে চাই।
রজার

উত্তর:


21

বাশ ম্যানুয়ালটিতে বলা হয়েছে:

যদি বাশ কোনও কমান্ডটি সম্পন্ন হওয়ার অপেক্ষায় থাকে এবং একটি সিগন্যাল পায় যার জন্য একটি ফাঁদ সেট করা হয়েছে, কমান্ডটি শেষ না হওয়া পর্যন্ত ট্র্যাপটি কার্যকর করা হবে না।

এর অর্থ এই যে bashআপনি যখন এটি পাঠাবেন তখনই সংকেতটি পাওয়া সত্ত্বেও, SIGHUP এ আপনার ফাঁদটি কেবল তখনই catশেষ হবে।

যদি এই আচরণটি অনাকাঙ্ক্ষিত হয়, তবে হয় bashবিল্টিনগুলি ব্যবহার করুন (উদাহরণস্বরূপ read+ printfএর পরিবর্তে একটি লুপে cat) বা ব্যাকগ্রাউন্ড জব ব্যবহার করুন (স্টাফেনের উত্তর দেখুন )।


9

@ শিহেন ইতিমধ্যে ব্যাখ্যা করেছেন কেন , তবে আপনি যদি সরাসরি সিগন্যালটি ব্যবহার করতে চান (এবং স্ক্রিপ্ট থেকে প্রস্থান না করেন), আপনি নিজের কোডটি এতে পরিবর্তন করতে পারেন:

#! /bin/bash -
interrupted=true
trap 'interrupted=true; echo HUP' HUP

{ cat <&3 3<&- & pid=$!; } 3<&0

while
  wait "$pid"
  ret=$?
  "$interrupted"
do
  interrupted=false
done
exit "$ret"

ফাইল বর্ণনাকারীদের সাথে ছোট্ট নাচটি ব্যাকগ্রাউন্ডে প্রবর্তিত কমান্ডগুলির জন্য bashস্টিডিনকে পুনঃনির্দেশ করে around/dev/null


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