ফাঁদ কি একটি সাব-শেল দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত?


14

আমি নিম্নলিখিত স্ক্রিপ্ট চেষ্টা করেছি:

#!/bin/bash
trap 'echo "touching a file" && touch $FILE' EXIT

foo1(){
        echo "foo1"
}
foo(){
        echo "foo"
        export FILE=${FILE:-/tmp/file1}
}
(foo1)
foo

উপরের স্ক্রিপ্টের আউটপুটটি ছিল:

[root@usr1 my_tests]# ./test.sh
foo1
foo
touching a file

তবে আমি প্রত্যাশা করছিলাম ফাঁদটিও প্রস্থান করার সময় থেকে বাইরে বেরোনোর ​​জন্য কল করা হবে foo1, যা একটি সাবশেলের মাধ্যমে বলা হয়।

  • এটি কি প্রত্যাশিত?
  • হয় trapএকটি subshell দ্বারা উত্তরাধিকারসূত্রে?
  • যদি হ্যাঁ, তবে কোন ক্ষেত্রে trapসাবসেলের দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত?

উত্তর:


10

ট্র্যাপ হ্যান্ডলারগুলি সাব-শেলগুলির মাধ্যমে কখনই উত্তরাধিকার সূত্রে প্রাপ্ত হয় না। এটি পসিএক্স দ্বারা নির্দিষ্ট করা হয়েছে :

যখন একটি সাবশেল প্রবেশ করানো হয়, সেই ফাঁদগুলিকে অগ্রাহ্য করা হবে না যেগুলি ডিফল্ট ক্রিয়ায় সেট করা থাকে।

নোট করুন যে উপেক্ষা করা সংকেতগুলি ( trap '' SIGFOO) সাব-শেলের (এবং শেল দ্বারা চালিত বাহ্যিক প্রোগ্রামগুলিতে) অবহেলিত থাকবে।


3
ব্যাশে আপনি set -Eসাবস্কেলগুলি উত্তরাধিকারসূত্রে ফাঁদ পেতে পারেন তবে সঠিকভাবে পেতে (এটি আমার অভিজ্ঞতাতে অন্তত) সত্যই জটিল।
— ড্রাগন 788

আমি জানি না যে এটি সমস্ত ফাঁদগুলির জন্য কাজ করে। আমি জানি এটি ইআরআর
— জোসেফ্রো

4

trapসাবসেলগুলিতে প্রস্তাবিত নয় তবে কিছু উপায়ে সাব-শেলকে প্যারেন্ট শেলটির ফাঁদগুলি রিপোর্ট করার অনুমতি দেয় এবং অন্যরা তা করে না। আমি বাশ দিয়ে ম্যাকোসে কিছু পরীক্ষা করেছি।

জিএনইউ বাশ, সংস্করণ 4.4.12 (1) -রেলিজ (x86_64-আপেল-ডারউইন 16.3.0):

trap 'echo hello' EXIT
trap # trap -- 'echo hello' EXIT
echo "$(trap)" # trap -- 'echo hello' EXIT
trap | cat # trap -- 'echo hello' EXIT
(trap) | cat # trap -- 'echo hello' EXIT
cat < <(trap) # empty
cat <<< "$(trap)" # empty
bash -c 'trap' # empty
trap & # trap -- 'echo hello' EXIT

জিএনইউ বাশ, সংস্করণ 3.2.57 (1) -রিলেজ (x86_64-আপেল-ডারউইন 16):

trap 'echo hello' EXIT
trap # trap -- 'echo hello' EXIT
echo "$(trap)" # trap -- 'echo hello' EXIT
trap > >(cat) # trap -- 'echo hello' EXIT
trap | cat # empty
(trap) | cat # empty
cat < <(trap) # empty
cat <<< "$(trap)" # empty
bash -c 'trap' # empty
trap & # empty

এটি জেনে রাখা ভাল যে trap_output="$(trap)"ট্র্যাপ আউটপুট ক্যাপচারে কাজ করবে। আমি এটি করার কোনও অন্য trap >trap_output_fileউপায়ের কথা ভাবতে পারি না যদি এটি কোনও ফাইলে আউটপুট দেওয়ার কাজ না করে (ফিফো কাজ করবে না bash 3.2.57) এবং এরপরে আবার পড়তে হবেtrap_output="$(<trap_output_file)"

ফিফো কাজ করবে না bash 3.2.57কারণ trap &খালি bash 3.2.57তবে এটি নয়bash 4.4.12

জিএনইউ বাশ, সংস্করণ 4.4.12 (1) -রেলিজ (x86_64-আপেল-ডারউইন 16.3.0):

mkfifo /tmp/fifo; trap >/tmp/fifo & trap_output=$(</tmp/fifo); rm -f /tmp/fifo; echo "$trap_output"
# trap -- 'echo hello' EXIT

mkfifo /tmp/fifo; trap_output=$(</tmp/fifo) & trap >/tmp/fifo; rm -f /tmp/fifo; echo "$trap_output"
# empty because trap_output=$(</tmp/fifo) sets the variable in a subshell

জিএনইউ বাশ, সংস্করণ 3.2.57 (1) -রিলেজ (x86_64-আপেল-ডারউইন 16):

mkfifo /tmp/fifo; trap >/tmp/fifo & trap_output=$(</tmp/fifo); rm -f /tmp/fifo; echo "$trap_output"
# empty because trap >/tmp/fifo & is empty since it uses trap &

mkfifo /tmp/fifo; trap_output=$(</tmp/fifo) & trap >/tmp/fifo; rm -f /tmp/fifo; echo "$trap_output"
# empty because trap_output=$(</tmp/fifo) sets the variable in a subshell

2

trap সংজ্ঞাগুলি সাব-শেলগুলিতে প্রচারিত হয় না।

দ্বারা যাচাই করুন:

trap "echo bla" 1 2 3"

(trap)


2
অনেকগুলি শেল (trap)একটি বিশেষ কেস হিসাবে হ্যান্ডেল করে , যাতে সাব-শেল প্যারেন্ট শেলের ফাঁদগুলি রিপোর্ট করতে পারে (তবে আসলে ব্যবহার করে না) can সুতরাং যে পরীক্ষা সবসময় নির্ভরযোগ্য হয় না।
— জিগলিগা

এটা তোলে বোর্ন শেল সঙ্গে কাজ করে এবং এটি derivates আছে: ksh88, bosh(schily বোর্ন শেল) এবং heirloom-sh। আপনি সঠিক: ksh93ভিন্ন আচরণ করে।
— শিখর

এটি ব্যাশে কাজ করে না, যা প্রশ্নে স্ক্রিপ্ট ব্যবহার করে।
— জিগ্লিনাগা

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