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


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.