Sau khi đọc câu trả lời của @ DennisWilliamson, có một số vấn đề, xem bên dưới:
Khi câu hỏi này đại diện cho ksh và bash, có một phần khác trong câu trả lời này liên quan đến ksh... xem bên dưới.
Đơn giản bash đường
[ "$0" = "$BASH_SOURCE" ]
Hãy thử (nhanh chóng vì bash đó có thể ;-):
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)
Tôi sử dụng sourcethay vì tắt .để dễ đọc (như .là một bí danh 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)
Lưu ý rằng số quy trình không thay đổi trong khi quy trình vẫn có nguồn gốc :
echo $$
29301
Tại sao không sử dụng $_ == $0so sánh
Để đảm bảo nhiều trường hợp, tôi bắt đầu viết một kịch bản thực sự :
#!/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)"
Sao chép này vào một tệp có tên testscript:
cat >testscript
chmod +x testscript
Bây giờ chúng tôi có thể kiểm tra:
./testscript
proc: 25758[ppid:24890] is own (DW purpose: subshell)
Vậy là được rồi.
. ./testscript
proc: 24890[ppid:24885] is sourced (DW purpose: sourced)
source ./testscript
proc: 24890[ppid:24885] is sourced (DW purpose: sourced)
Vậy là được rồi.
Nhưng, để kiểm tra tập lệnh trước khi thêm -xcờ:
bash ./testscript
proc: 25776[ppid:24890] is own (DW purpose: sourced)
Hoặc để sử dụng các biến được xác định trước:
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)
Điều này sẽ không làm việc nữa.
Chuyển nhận xét từ dòng thứ 5 sang thứ 6 sẽ cho câu trả lời dễ đọc hơn:
./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
Khó hơn: ksh hiện nay...
Vì tôi không dùng ksh Rất nhiều, sau khi một số đọc trên trang người đàn ông, có cố gắng của tôi:
#!/bin/ksh
set >/tmp/ksh-$$.log
Sao chép này trong một testfile.ksh:
cat >testfile.ksh
chmod +x testfile.ksh
Hơn hai lần chạy nó:
./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
và nhìn thấy:
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
Có một số biến được di truyền trong một hoạt động có nguồn gốc , nhưng không có gì thực sự liên quan ...
Bạn thậm chí có thể kiểm tra $SECONDSgần 0.000, nhưng điều đó chỉ đảm bảo các trường hợp có nguồn gốc thủ công ...
Bạn thậm chí có thể thử để kiểm tra những gì cha mẹ là:
Đặt cái này vào testfile.ksh:
ps $PPID
Hơn:
./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
hoặc ps ho cmd $PPID, nhưng công việc này chỉ dành cho một cấp độ ...
Xin lỗi, tôi không thể tìm thấy một cách đáng tin cậy để làm điều đó, dưới ksh.