@ ডেনিস উইলিয়ামসনের উত্তরটি পড়ার পরে কিছু সমস্যা রয়েছে, নীচে দেখুন:
এই প্রশ্ন হিসাবে দাঁড়ানো ksh এবং সজোরে আঘাত, এই উত্তর সম্পর্কে আরও একটি অংশ আছে ksh... নিচে দেখ.
[ "$0" = "$BASH_SOURCE" ]
আসুন চেষ্টা করুন (উড়ে যাওয়ার কারণে যে বাশ পারে ;-):
source <(echo $'#!/bin/bash
[ "$0" = "$BASH_SOURCE" ] && v=own || v=sourced;
echo "process $$ is $v ($0, $BASH_SOURCE)" ')
process 29301 is sourced (bash, /dev/fd/63)
bash <(echo $'#!/bin/bash
[ "$0" = "$BASH_SOURCE" ] && v=own || v=sourced;
echo "process $$ is $v ($0, $BASH_SOURCE)" ')
process 16229 is own (/dev/fd/63, /dev/fd/63)
আমি source
পরিবর্তে .
পঠনযোগ্যতার জন্য ব্যবহার করি (যেমন .
একটি উপাধি হিসাবে source
):
. <(echo $'#!/bin/bash
[ "$0" = "$BASH_SOURCE" ] && v=own || v=sourced;
echo "process $$ is $v ($0, $BASH_SOURCE)" ')
process 29301 is sourced (bash, /dev/fd/63)
নোট করুন যে প্রক্রিয়া উত্সাহিত অবস্থায় প্রক্রিয়া নম্বর পরিবর্তন হয় না :
echo $$
29301
$_ == $0
তুলনা কেন ব্যবহার করবেন না
অনেকগুলি ক্ষেত্রে নিশ্চিত হওয়ার জন্য, আমি একটি সত্য স্ক্রিপ্ট লিখতে শুরু করি :
#!/bin/bash
# As $_ could be used only once, uncomment one of two following lines
#printf '_="%s", 0="%s" and BASH_SOURCE="%s"\n' "$_" "$0" "$BASH_SOURCE"
[[ "$_" != "$0" ]] && DW_PURPOSE=sourced || DW_PURPOSE=subshell
[ "$0" = "$BASH_SOURCE" ] && BASH_KIND_ENV=own || BASH_KIND_ENV=sourced;
echo "proc: $$[ppid:$PPID] is $BASH_KIND_ENV (DW purpose: $DW_PURPOSE)"
এটিকে একটি ফাইলটিতে অনুলিপি করুন testscript
:
cat >testscript
chmod +x testscript
এখন আমরা পরীক্ষা করতে পারি:
./testscript
proc: 25758[ppid:24890] is own (DW purpose: subshell)
ঠিক আছে.
. ./testscript
proc: 24890[ppid:24885] is sourced (DW purpose: sourced)
source ./testscript
proc: 24890[ppid:24885] is sourced (DW purpose: sourced)
ঠিক আছে.
তবে -x
পতাকা যুক্ত করার আগে স্ক্রিপ্ট পরীক্ষা করার জন্য :
bash ./testscript
proc: 25776[ppid:24890] is own (DW purpose: sourced)
বা প্রাক-সংজ্ঞায়িত ভেরিয়েবলগুলি ব্যবহার করতে:
env PATH=/tmp/bintemp:$PATH ./testscript
proc: 25948[ppid:24890] is own (DW purpose: sourced)
env SOMETHING=PREDEFINED ./testscript
proc: 25972[ppid:24890] is own (DW purpose: sourced)
এটি আর কাজ করবে না।
5 তম লাইন থেকে 6 তম লাইনে মন্তব্য সরানো আরও পঠনযোগ্য উত্তর দেবে:
./testscript
_="./testscript", 0="./testscript" and BASH_SOURCE="./testscript"
proc: 26256[ppid:24890] is own
. testscript
_="_filedir", 0="bash" and BASH_SOURCE="testscript"
proc: 24890[ppid:24885] is sourced
source testscript
_="_filedir", 0="bash" and BASH_SOURCE="testscript"
proc: 24890[ppid:24885] is sourced
bash testscript
_="/bin/bash", 0="testscript" and BASH_SOURCE="testscript"
proc: 26317[ppid:24890] is own
env FILE=/dev/null ./testscript
_="/usr/bin/env", 0="./testscript" and BASH_SOURCE="./testscript"
proc: 26336[ppid:24890] is own
কঠিনতর: ksh এখন ...
যেমন আমি ব্যবহার করি না ksh অনেকগুলি, ম্যান পৃষ্ঠায় কিছু পড়ার পরে, আমার চেষ্টা রয়েছে:
#!/bin/ksh
set >/tmp/ksh-$$.log
এটিকে অনুলিপি করুন testfile.ksh
:
cat >testfile.ksh
chmod +x testfile.ksh
দুইবার চালানোর চেয়ে:
./testfile.ksh
. ./testfile.ksh
ls -l /tmp/ksh-*.log
-rw-r--r-- 1 user user 2183 avr 11 13:48 /tmp/ksh-9725.log
-rw-r--r-- 1 user user 2140 avr 11 13:48 /tmp/ksh-9781.log
echo $$
9725
এবং দেখো:
diff /tmp/ksh-{9725,9781}.log | grep ^\> # OWN SUBSHELL:
> HISTCMD=0
> PPID=9725
> RANDOM=1626
> SECONDS=0.001
> lineno=0
> SHLVL=3
diff /tmp/ksh-{9725,9781}.log | grep ^\< # SOURCED:
< COLUMNS=152
< HISTCMD=117
< LINES=47
< PPID=9163
< PS1='$ '
< RANDOM=29667
< SECONDS=23.652
< level=1
< lineno=1
< SHLVL=2
একটি উত্সাহিত রান মধ্যে কিছু পরিবর্তনশীল উত্তরাধিকারী আছে , কিন্তু সত্যিই সম্পর্কিত কিছুই ...
এমনকি আপনি এটি পরীক্ষা করে দেখতে পারেন যে এটি $SECONDS
খুব কাছাকাছি রয়েছে 0.000
তবে এটি কেবল ম্যানুয়ালি সোর্স কেসগুলি নিশ্চিত করে ...
এমনকি আপনি পিতামাতা কি তা যাচাই করার চেষ্টা করতে পারেন :
এটি আপনার মধ্যে রাখুন testfile.ksh
:
ps $PPID
চেয়ে:
./testfile.ksh
PID TTY STAT TIME COMMAND
32320 pts/4 Ss 0:00 -ksh
. ./testfile.ksh
PID TTY STAT TIME COMMAND
32319 ? S 0:00 sshd: user@pts/4
বা ps ho cmd $PPID
, কিন্তু এই কাজটি কেবলমাত্র এক স্তরের অধীনতার জন্য ...
দুঃখিত, আমি এটির আধ্যাত্মিক উপায় খুঁজে পাইনি ksh।