উত্সাহিত শেল স্ক্রিপ্টের পথ নির্ধারণ করা


80

স্রোসযুক্ত শেল লিপিটির নিজের পথ খুঁজে বের করার কোনও উপায় আছে কি ? আমি প্রধানত ব্যাশের সাথে উদ্বিগ্ন, যদিও আমার কিছু সহকর্মী আছেন যারা টিসিএস ব্যবহার করেন।

আমি অনুমান করছি যে আমার এখানে অনেক বেশি ভাগ্য নেই, কারণ সোর্সিংয়ের ফলে বর্তমান শেলটিতে কমান্ড কার্যকর করা হয়, $0তবুও বর্তমান শেলের আহ্বান, সোর্স স্ক্রিপ্টটি নয়। আমার সেরা চিন্তাটি এখনই করা source $script $script, যাতে প্রথম অবস্থানের প্যারামিটারে প্রয়োজনীয় তথ্য থাকে। কারও ভাল উপায় আছে?

স্পষ্টতই, আমি স্ক্রিপ্টটি সসার করছি , এটি চালাচ্ছি না:

source foo.bash

: সংশ্লিষ্ট প্রশ্ন 4200+ upvotes আছে stackoverflow.com/q/59895/52074
ট্রেভর বয়েড স্মিথ

উত্তর:


65

ইন tcsh, $_স্ক্রিপ্টের শুরুতে ফাইলটি উত্সাহিত করা হয় এবং $0এটি চালিত থাকলে এটি ধারণ করে থাকে location

#!/bin/tcsh
set sourced=($_)
if ("$sourced" != "") then
    echo "sourced $sourced[2]"
endif
if ("$0" != "tcsh") then
    echo "run $0"
endif

বাশে:

#!/bin/bash
[[ $0 != $BASH_SOURCE ]] && echo "Script is being sourced" || echo "Script is being run"

আমি সবেমাত্র এটি টিসিএসে ব্যবহার করার জন্য উপলক্ষ করেছি এবং লক্ষ্য করেছি যে এটি শেবাং ছাড়া কাজ করে না। আচরণটি পরিবর্তনের জন্য কিছুটা অদ্ভুত বলে মনে হচ্ছে যদি আপনি কেবল এটি টক না দিয়েই চালাচ্ছেন ...
ক্যাসাবেল

Tcsh সংস্করণটিও কাজ করে না বলে মনে হয় যদি স্ক্রিপ্টটি অবিচ্ছিন্নভাবে উত্সাহিত করা হয় (উদাহরণস্বরূপ cshrc থেকে)। সেক্ষেত্রে আমি তথ্য পাওয়ার কোনও উপায় খুঁজে পাচ্ছি বলে মনে হচ্ছে না। কোন চিন্তা?
ক্যাসকেবেল

এটি সোর্সিং শেবাং ছাড়াই আমার পক্ষে কাজ করে। > tcsh --version\n tcsh 6.14.00 (Astron) 2005-03-25 (i486-intel-linux) options wide,nls,dl,al,kan,rh,nd,color,filec। যতক্ষণ না এটি অ-ইন্টারেক্টিভভাবে সোর্সিং করা যায়, উত্স ফাইলটি প্যারেন্ট ফাইলের মধ্যে অন্তর্ভুক্ত করা হয়েছে যেন এটি আসলে এটিরই একটি অংশ (আলাদাভাবে তাই) আপনি নিজের মূল প্রশ্নটিতে উল্লেখ করেছেন। আমি মনে করি আপনার অবস্থানগত পরামিতি ওয়ার্কআরাউন্ড সম্ভবত সেরা পন্থা। যাইহোক, চলিত প্রশ্ন হল এবং উত্তর দিতে স্বাভাবিকের উত্তর "কেন আপনি যে কাজ করতে চান না" "যে কি না - কি এই পরিবর্তে" যেখানে "এই" দোকান থেকে প্রায়ই হয় ...
ডেনিস উইলিয়ামসন

2
@clacke: আমি যে ব্যাশ সমস্ত সংস্করণের যে আমি 4.2.37 থেকে 2.05b থেকে পরীক্ষা 4.1.9 সহ, যে .এবং sourceএ ব্যাপারে অভিন্নরুপে কাজ করেন। নোট করুন যে $_অবশ্যই ফাইলের প্রথম বিবৃতিতে অ্যাক্সেস করতে হবে, অন্যথায় এটি পূর্ববর্তী কমান্ডের শেষ যুক্তিটি ধারণ করবে। আমি আমার নিজস্ব রেফারেন্সের জন্য শেবাংকে অন্তর্ভুক্ত করতে চাই তাই আমি জানি যে এটির জন্য শেলটি এবং সম্পাদকের জন্য অনুমিত হওয়া উচিত যাতে এটি সিনট্যাক্স হাইলাইটিং ব্যবহার করে।
ডেনিস উইলিয়ামসন

1
হা হা। স্পষ্টতই আমি প্রথমে করে source, পরে কর দিয়ে পরীক্ষা করছিলাম .। আমি অক্ষম হওয়ার জন্য ক্ষমা চাইছি। তারা আসলে অভিন্ন। যাইহোক, $BASH_SOURCEকাজ করে।
ক্ল্যাক

30

আমি মনে করি আপনি $BASH_SOURCEপরিবর্তনশীল ব্যবহার করতে পারেন । এটি সম্পাদিত পথে ফেরত দেয়:

pbm@tauri ~ $ /home/pbm/a.sh 
/home/pbm/a.sh
pbm@tauri ~ $ ./a.sh
./a.sh
pbm@tauri ~ $ source /home/pbm/a.sh 
/home/pbm/a.sh
pbm@tauri ~ $ source ./a.sh
./a.sh

সুতরাং পরবর্তী পদক্ষেপে আমাদের পরীক্ষা করা উচিত যে পথটি আপেক্ষিক কিনা। এটি যদি আপেক্ষিক না হয় তবে সবকিছু ঠিক আছে। যদি এটি হয় তবে আমরা এর সাথে পথটি যাচাই করতে পারি এবং pwdসাথে সম্মতি জানাতে পারি ।/$BASH_SOURCE


2
এবং মনে রাখবেন যে প্রদত্ত নামটিতে একটি না থাকলে sourceঅনুসন্ধান $PATHকরে /। অনুসন্ধানের আদেশটি শেল বিকল্পগুলির উপর নির্ভর করে, বিশদগুলির জন্য ম্যানুয়ালটি দেখুন।
গিলস

1
সুতরাং, কিছু mydir="$(cd "$(dirname "$BASH_SOURCE")"; pwd)"কাজ করবে?
কেভিন কেন্টু

ধন্যবাদ, একটি দ্রুত এবং সহায়ক উত্তর। ডেনিস একটি টিসিএস উত্তর দেওয়ার জন্যও সবুজ চেক মার্ক জিতেছে। @ গিলস: ঠিক আছে, আমি ডকুমেন্টেশনে এটি পেয়েছি। সৌভাগ্যক্রমে আমার ব্যবহারের ক্ষেত্রে আমাকে প্রায় অবশ্যই এটি নিয়ে চিন্তা করতে হবে না।
ক্যাস্যাবেল

17

এই সমাধানটি কেবল ব্যাশের ক্ষেত্রে প্রযোজ্য এবং টিসিএস নয়। মনে রাখবেন যে সাধারণভাবে সরবরাহিত উত্তর ${BASH_SOURCE[0]}কাজ করে না যদি আপনি কোনও ফাংশন থেকে পথ খুঁজে বের করার চেষ্টা করেন।

ফাইলটি উত্সাহিত হচ্ছে বা স্ক্রিপ্ট হিসাবে চালানো হচ্ছে তা নির্বিশেষে আমি সর্বদা কাজ করতে এই লাইনটি পেয়েছি।

echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}

আপনি যদি readlinkউপরে উঠে আসেন এমন চিহ্নগুলিকে অনুসরণ করতে চান তবে পুনরাবৃত্তি বা অ-পুনরাবৃত্তভাবে।

এটি চেষ্টা করে দেখতে এবং এটি অন্য প্রস্তাবিত সমাধানগুলির সাথে তুলনা করার জন্য এখানে একটি স্ক্রিপ্ট রয়েছে। এটি হিসাবে source test1/test2/test_script.shবা দাওয়াত bash test1/test2/test_script.sh

#
# Location: test1/test2/test_script.sh
#
echo $0
echo $_
echo ${BASH_SOURCE}
echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}

cur_file="${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}"
cur_dir="$(dirname "${cur_file}")"
source "${cur_dir}/func_def.sh"

function test_within_func_inside {
    echo ${BASH_SOURCE}
    echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}
}

echo "Testing within function inside"
test_within_func_inside

echo "Testing within function outside"
test_within_func_outside

#
# Location: test1/test2/func_def.sh
#
function test_within_func_outside {
    echo ${BASH_SOURCE}
    echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}
}

ওয়ান-লাইনার কাজ করার কারণটি BASH_SOURCEপরিবেশের পরিবর্তনশীল এবং এর সহযোগীর ব্যবহার দ্বারা ব্যাখ্যা করা হয়েছে FUNCNAME

BASH_SOURCE

একটি অ্যারে ভেরিয়েবল যার সদস্যরা উত্স ফাইলের নাম যেখানে FUNCNAME অ্যারে ভেরিয়েবলের সাথে সম্পর্কিত শেল ফাংশন নামগুলি সংজ্ঞায়িত করা হয়। শেল ফাংশন $ UN FUNCNAME [$ i]} ফাইলটিতে সংজ্ঞায়িত করা হয়েছে OUR AS BASH_SOURCE [$ i]} এবং called {BASH_SOURCE [$ i + 1]} থেকে কল করা হয়েছে}

FUNCNAME

এক্সিকিউশন কল স্ট্যাকটিতে বর্তমানে সমস্ত শেল ফাংশনের নাম সম্বলিত একটি অ্যারে ভেরিয়েবল। সূচক 0 সহ উপাদানটি বর্তমানে কার্যকর হওয়া শেল ফাংশনের নাম। নীচের দিকের সর্বাধিক উপাদান (সর্বাধিক সূচকযুক্ত একটি) "প্রধান" main এই পরিবর্তনশীল কেবল তখনই উপস্থিত থাকে যখন শেল ফাংশন কার্যকর হয় exec FUNCNAME এ নিয়োগের কোনও প্রভাব নেই এবং ত্রুটির স্থিতি ফিরে আসে return যদি এফুনসিএনএম সেট না করা থাকে, তবে এটি পরে পুনরায় সেট করা হলেও এটি তার বিশেষ বৈশিষ্ট্যগুলি হারাবে।

এই চলকটি BASH_LINENO এবং BASH_SOURCE এর সাথে ব্যবহার করা যেতে পারে। কল স্ট্যাকটি বর্ণনা করার জন্য FUNCNAME এর প্রতিটি উপাদানের BASH_LINENO এবং BASH_SOURCE এ সম্পর্কিত উপাদান রয়েছে। উদাহরণস্বরূপ, line UN BUNH_SOURCE [$ i + 1] the ফাইল থেকে $ UN FUNCNAME [$ i] called ফাইলটি কল করা হয়েছিল {number BASH_LINENO [$ i]}} কলার অন্তর্নির্মিত এই তথ্য ব্যবহার করে বর্তমান কল স্ট্যাকটি প্রদর্শন করে।

[সূত্র: বাশ ম্যানুয়াল]


এই সমাধানটি আমার পক্ষে কাজ করেছে যখন নির্বাচিত উত্তরটি কেবল মাঝেমধ্যে কাজ করে। আমি কখনই এটির কাজ করি না এবং অন্যদের জন্যও কাজ করি না (সম্ভবত আমি স্যুরসিং শেলের দিকে যথেষ্ট মনোযোগ দিচ্ছিলাম না)।
জিম

17

পুঙ্খানুপুঙ্খতা এবং অনুসন্ধানকারীদের স্বার্থে, এখানে এটি যা করা হয় ... এটি একটি সম্প্রদায়ের উইকি, তাই অন্য শেলের সমপরিমাণ যোগ করতে দ্বিধা বোধ করুন (স্পষ্টতই, AS BASH_SOURCE আলাদা হবে)।

test.sh:

#! /bin/sh
called=$_
echo $called
echo $_
echo $0
echo $BASH_SOURCE

test2.sh:

#! /bin/sh
source ./test.sh

ব্যাশ:

$./test2.sh
./test2.sh
./test2.sh
./test2.sh
./test.sh
$ sh ./test2.sh
/bin/sh
/bin/sh
./test2.sh
./test.sh

হানাহানি

$./test2.sh
./test2.sh
./test2.sh
./test2.sh

$/bin/sh ./test2.sh
/bin/sh
/bin/sh
./test2.sh

$

Zsh

$ ./test2.sh
./test.sh
./test.sh
./test.sh

$ zsh test.sh

echo
test.sh

$

1
আমি বুঝতে পারছি না: কেন called=$_; echo $called; echo $_? এই মুদ্রণ $_দুইবার হবে না ?
সিরো সান্তিলি 新疆 改造 中心 法轮功 六四 事件

5
@CiroSantilli: কোনো সবসময় পড়তে ব্যাশ ম্যানুয়াল উপর $_বিশেষ পরামিতি:। "শেল স্টার্টআপে, পরম পরিবেশ বা যুক্তি তালিকা পাস হিসাবে মৃত্যুদন্ড কার্যকর করা হচ্ছে শেল বা শেল স্ক্রিপ্ট ডাকতাম পথনাম সেট পরবর্তীকালে শেষ বিস্তৃতি পূর্ববর্তী কমান্ডের সাথে যুক্তি, প্রসারণের পরে each প্রতিটি কমান্ড কার্যকর করা এবং সেই আদেশে রফতানি করা পরিবেশে রাখার জন্য ব্যবহৃত পুরো পথের নামটি সেট করুন mail
অ্যাডাম রোজেনফিল্ড

এটির সাথে সমস্যা হ'ল সোর্সযুক্ত ফাইলটির শিরোনাম রয়েছে #! /bin/shযা এটি উত্সকে অকেজো করে তোলে। এটির /bin/shপরিবর্তে কলিং ইনস্ট্যান্টটি অপরিবর্তিত রেখে, ভেরিয়েবলগুলি সেট করার একটি নতুন উদাহরণ শুরু হবে then
জেমস থমাসমুন 1979

2
@ জেমস থমাস মুন ১৯৯৯: আপনি কী সম্পর্কে কথা বলছেন? #শেল স্ক্রিপ্ট দিয়ে যে কোনও কিছু দিয়ে শুরু হওয়া একটি মন্তব্য।  #!(শেবাং) এর কার্যকর অর্থ কেবল কার্যকর হওয়া কোনও স্ক্রিপ্টের প্রথম লাইন হিসাবে থাকে   যে কোনো ফাইল প্রথম লাইন হিসেবে sourced, এটি শুধু একটি মন্তব্য আছে।
স্কট

13

এটি আমার জন্য ব্যাশ, ড্যাশ, কেশ এবং জেডে কাজ করেছে:

if test -n "$BASH" ; then script=$BASH_SOURCE
elif test -n "$TMOUT"; then script=${.sh.file}
elif test -n "$ZSH_NAME" ; then script=${(%):-%x}
elif test ${0##*/} = dash; then x=$(lsof -p $$ -Fn0 | tail -1); script=${x#n}
else script=$0
fi

echo $script

এই শেলগুলির জন্য আউটপুট:

BASH source: ./myscript
ZSH source: ./myscript
KSH source: /home/pbrannan/git/theme/src/theme/web/myscript
DASH source: /home/pbrannan/git/theme/src/theme/web/myscript
BASH: ./myscript
ZSH: ./myscript
KSH: /home/pbrannan/git/theme/src/theme/web/myscript
DASH: ./myscript

আমি এটিকে csh / tcsh এর জন্য কাজ করার চেষ্টা করেছি, তবে এটি খুব শক্ত; আমি পসিক্সের সাথে লেগে আছি


1

আমি সম্প্রদায়ের উইকি উত্তর (শন জে গফের কাছ থেকে) দ্বারা কিছুটা বিভ্রান্ত হয়ে পড়েছিলাম, তাই জিনিসগুলি বাছাই করার জন্য আমি একটি স্ক্রিপ্ট লিখেছিলাম। সম্পর্কে $_, আমি এটি পেয়েছি: একটি পরিবেশে পরিবর্তনশীল হিসাবে ব্যবহার _একটি কমান্ডে প্রেরণ করা হয়েছে । এটি পরিবেশগত পরিবর্তনশীল তাই এর মানটিকে ভুল করে পরীক্ষা করা সহজ।

স্ক্রিপ্টের নীচে, তারপরে এটি আউটপুট। তারাও এই সংক্ষেপে

test-shell-default-variables.sh

#!/bin/bash

# test-shell-default-variables.sh

# Usage examples (you might want to `sudo apt install zsh ksh`):
#
#  ./test-shell-default-variables.sh dash bash
#  ./test-shell-default-variables.sh dash bash zsh ksh
#  ./test-shell-default-variables.sh dash bash zsh ksh | less -R

# `-R` in `less -R` to have less pass escape sequences directly to the terminal
# so we have colors.


# The "invoking with name `sh`" tests are commented because for every shell I
# tested (dash, bash, zsh and ksh), the output was the same as that of dash.

# The `test_expression` function also work with expansion changes. You can try
# lines like `test_expression '{BASH_SOURCE:-$0}'`.

echolor() {
    echo -e "\e[1;36m$@\e[0m"
}

tell_file() {
    echo File \`"$1"\` is:
    echo \`\`\`
    cat "$1"
    echo \`\`\`
    echo
}

SHELL_ARRAY=("$@")

test_command() {
    for shell in "${SHELL_ARRAY[@]}"
    do
        prepare "$shell"
        cmd="$(eval echo $1)"
        # echo "cmd: $cmd"
        printf '%-4s: ' "$shell"
        { env -i $cmd 2>&1 1>&3 | sed 's/^/[err]/'; } 3>&1
        teardown
    done
    echo
}

prepare () {
    shell="$1"
    PATH="$PWD/$shell/sh:$PATH"
}

teardown() {
    PATH="${PATH#*:}"
}


###
### prepare
###
for shell in "${SHELL_ARRAY[@]}"
do
    mkdir "$shell"
    ln -sT "/bin/$shell" "$shell/sh"
done

echo > printer.sh
echo '. ./printer.sh' > sourcer.sh
rm linked.sh &>/dev/null; ln -sT "printer.sh" "linked.sh"

tell_file sourcer.sh

###
### run
###
test_expression() {
    local expr="$1"

    # prepare
    echo "echo $expr" > printer.sh
    tell_file printer.sh

    # run
    cmd='$shell ./printer.sh'
    echolor "\`$cmd\` (simple invocation) ($expr):"
    test_command "$cmd"

    # cmd='sh ./printer.sh'
    # echolor "\`$cmd\` (when executable name is \`sh\`) ($expr):"
    # test_command "$cmd"

    cmd='$shell ./sourcer.sh'
    echolor "\`$cmd\` (via sourcing) ($expr):"
    test_command "$cmd"

    # cmd='sh ./sourcer.sh'
    # echolor "\`$cmd\` (via sourcing, when name is \`sh\`) ($expr):"
    # test_command "$cmd"

    cmd='$shell ./linked.sh'
    echolor "\`$cmd\` (via symlink) ($expr):"
    test_command "$cmd"

    # cmd='sh ./linked.sh'
    # echolor "\`$cmd\` (via symlink, when name is \`sh\`) ($expr):"
    # test_command "$cmd"

    echolor "------------------------------------------"
    echo
}

test_expression '$BASH_SOURCE'
test_expression '$0'
test_expression '$(/bin/true x y; true a b c; echo $_)' # Rq: true is a builtin
test_expression '$_'

###
### teardown
###
for shell in "${SHELL_ARRAY[@]}"
do
    rm "$shell/sh"
    rm -d "$shell"
done

rm sourcer.sh
rm linked.sh
rm printer.sh

আউটপুট ./test-shell-default-variables.sh {da,ba,z,k}sh

File `sourcer.sh` is:
```
. ./printer.sh
```

File `printer.sh` is:
```
echo $BASH_SOURCE
```

`$shell ./printer.sh` (simple invocation) ($BASH_SOURCE):
dash: 
bash: ./printer.sh
zsh : 
ksh : 

`$shell ./sourcer.sh` (via sourcing) ($BASH_SOURCE):
dash: 
bash: ./printer.sh
zsh : 
ksh : 

`$shell ./linked.sh` (via symlink) ($BASH_SOURCE):
dash: 
bash: ./linked.sh
zsh : 
ksh : 

------------------------------------------

File `printer.sh` is:
```
echo $0
```

`$shell ./printer.sh` (simple invocation) ($0):
dash: ./printer.sh
bash: ./printer.sh
zsh : ./printer.sh
ksh : ./printer.sh

`$shell ./sourcer.sh` (via sourcing) ($0):
dash: ./sourcer.sh
bash: ./sourcer.sh
zsh : ./printer.sh
ksh : ./sourcer.sh

`$shell ./linked.sh` (via symlink) ($0):
dash: ./linked.sh
bash: ./linked.sh
zsh : ./linked.sh
ksh : ./linked.sh

------------------------------------------

File `printer.sh` is:
```
echo $(/bin/true x y; true a b c; echo $_)
```

`$shell ./printer.sh` (simple invocation) ($(/bin/true x y; true a b c; echo $_)):
dash: 
bash: c
zsh : c
ksh : 

`$shell ./sourcer.sh` (via sourcing) ($(/bin/true x y; true a b c; echo $_)):
dash: 
bash: c
zsh : c
ksh : 

`$shell ./linked.sh` (via symlink) ($(/bin/true x y; true a b c; echo $_)):
dash: 
bash: c
zsh : c
ksh : 

------------------------------------------

File `printer.sh` is:
```
echo $_
```

`$shell ./printer.sh` (simple invocation) ($_):
dash: 
bash: bash
zsh : 
ksh : 

`$shell ./sourcer.sh` (via sourcing) ($_):
dash: 
bash: bash
zsh : ./printer.sh
ksh : 

`$shell ./linked.sh` (via symlink) ($_):
dash: 
bash: bash
zsh : 
ksh : 

------------------------------------------

আমরা কী শিখলাম?

$BASH_SOURCE

  • $BASH_SOURCE ব্যাশ এবং শুধুমাত্র ব্যাশে কাজ করে।
  • কেবলমাত্র পার্থক্য $0হ'ল যখন বর্তমান ফাইলটি অন্য কোনও ফাইল দ্বারা উত্সাহিত করা হয়েছিল। সেই ক্ষেত্রে, $BASH_PROFILEবরং souring ফাইল যে এর চেয়ে, sourced ফাইলের নাম ধারণ করে।

$0

  • Zsh এ, ব্যাশের $0মতো একই মান রয়েছে $BASH_SOURCE

$_

  • $_ ড্যাশ এবং কেএসএস দ্বারা অচ্ছুত রয়েছে।
  • বাশ এবং জেডে, $_শেষ কলটির শেষ যুক্তির সিদ্ধান্ত নেয়।
  • bash $_"bash" এ আরম্ভ করে।
  • zsh পাতা ছোঁয়াচে $_। (যখন সোর্সিং করা হয়, এটি কেবলমাত্র "শেষ যুক্তি" নিয়মের ফলাফল)।

Symlinks

  • যখন কোনও স্ক্রিপ্টকে একটি সিমলিংকের মাধ্যমে ডাকা হয়, কোনও ভেরিয়েবলের লিঙ্কের গন্তব্যের কোনও উল্লেখ থাকে না, কেবল তার নাম।

ksh

  • এই পরীক্ষাগুলি সম্পর্কে, ksh ড্যাশের মতো আচরণ করে।

SH

  • এই shপরীক্ষাগুলি সম্পর্কিত যখন সিমলিংকের মাধ্যমে বাশ বা জেডএস কল করা হয় তখন এটি ড্যাশের মতো আচরণ করে।


0

আপনার স্ক্রিপ্টটি উভয়ই বাশ- এবং zsh- সামঞ্জস্যপূর্ণ করার পরিবর্তে যদি বিবৃতিগুলি আপনি কেবল লিখতে পারেন তবে তা ব্যবহার করুন ${BASH_SOURCE[0]:-${(%):-%x}}। ফলাফলটি BASH_SOURCE[0]যখন সংজ্ঞায়িত করা হয় তখন থেকে নেওয়া হবে এবং ${(%):-%x}}যখন BASH_SOURCE [0] সংজ্ঞায়িত করা হয় না।


0

TL; ড script=$(readlink -e -- "${BASH_SOURCE}") (জন্য ব্যাশ স্পষ্টত)


$BASH_SOURCE পরীক্ষার কেস

প্রদত্ত ফাইল /tmp/source1.sh

echo '$BASH_SOURCE '"(${BASH_SOURCE})"
echo 'readlink -e $BASH_SOURCE'\
     "($(readlink -e -- "${BASH_SOURCE}"))"

source বিভিন্ন শালীন ফাইল

source থেকে /tmp

$> cd /tmp

$> source source1.sh
$BASH_SOURCE (source1.sh)
readlink -e $BASH_SOURCE (/tmp/source1.sh)

$> source ./source1.sh
$BASH_SOURCE (./source1.sh)
readlink -e $BASH_SOURCE (/tmp/source1.sh)

$> source /tmp/source1.sh
$BASH_SOURCE (/tmp/source1.sh)
readlink -e $BASH_SOURCE (/tmp/source1.sh)

source থেকে /

cd /
$> source /tmp/source1.sh
$0 (bash)
$BASH_SOURCE (/tmp/source1.sh)
readlink -e $BASH_SOURCE (/tmp/source1.sh)

sourceবিভিন্ন আপেক্ষিক পথ থেকে /tmp/aএবং/var

$> cd /tmp/a

$> source ../source1.sh
$BASH_SOURCE (../source1.sh)
readlink -e $BASH_SOURCE (/tmp/source1.sh)

$> cd /var

$> source ../tmp/source1.sh
$BASH_SOURCE (../tmp/source1.sh)
readlink -e $BASH_SOURCE (/tmp/source1.sh)

সংক্রান্ত $0

সমস্ত ক্ষেত্রে, স্ক্রিপ্টে যদি অতিরিক্ত কমান্ড থাকে

echo '$0 '"(${0})"

তারপর sourceস্ক্রিপ্ট সর্বদা মুদ্রিত

$0 (bash)

তবে , স্ক্রিপ্টটি চালানো থাকলে , যেমন

$> bash /tmp/source1.sh

তারপরে $0স্ট্রিংয়ের মান হবে /tmp/source1.sh

$0 (/tmp/source1.sh)
$BASH_SOURCE (/tmp/source1.sh)
readlink -e $BASH_SOURCE (/tmp/source1.sh)

0

এই উত্তরটি বর্ণনা করে যে কীভাবে lsofএবং কিছুটা গ্রেপ ম্যাজিকই কেবল একমাত্র জিনিস যা টিসিএস-এর অধীনে নেস্টেড সর্সযুক্ত ফাইলগুলির জন্য কাজ করার একটি সুযোগ দাঁড়াবে বলে মনে হয়:

/usr/sbin/lsof +p $$ | grep -oE /.\*source_me.tcsh

-2
wdir="$PWD"; [ "$PWD" = "/" ] && wdir=""
case "$0" in
  /*) scriptdir="${0%/*}";;
  *) scriptdir="$wdir/${0#./}"; scriptdir="${scriptdir%/*}";;
esac
echo "$scriptdir"

হতে পারে এটি সিমলিংক বা উত্সযুক্ত ফাইলগুলির সাথে কাজ করবে না তবে সাধারণ ফাইলগুলির জন্য কাজ করবে। রেফারেন্স ফ্রো হিসাবে নেওয়া। @ টেনরব কোনও ধরণের নাম, পাঠ লিঙ্ক, BASH_SOURCE।


1
এটি প্রশ্নের উত্তরে ব্যাখ্যা করা হয়েছিল যে $0আপনাকে বর্তমানে চলমান স্ক্রিপ্ট সম্পর্কে তথ্য পেয়েছে , উত্সাহিত কোনও নয়।
স্কট

-3

আসলে, "dirname $ 0" আপনাকে স্ক্রিপ্টের দিকে পৌঁছে দেবে, তবে আপনাকে এটির কিছুটা ব্যাখ্যা করতে হবে:

$ cat bash0
#!/bin/bash
echo \$0=$0
dirname $0
$ bash0    # "." appears in PATH right now.
$0=./bash0
.
$ ./bash0
$0=./bash0
.
$ $PWD/bash0
$0=/home/00/bediger/src/ksh/bash0
/home/00/bediger/src/ksh
$ $PWD/../ksh/bash0
$0=/home/00/bediger/src/ksh/../ksh/bash0
/home/00/bediger/src/ksh/../ksh
$ ../ksh/bash0
$0=../ksh/bash0
../ksh

আপনাকে পরিচালনা করতে প্রস্তুত করতে হবে ""। কিছু সাধারণ পরিস্থিতিতে ডিরেক্টরি নাম হিসাবে। আমি কিছুটা পরীক্ষা করতাম, যেহেতু আমি মনে করি যে Ksh থেকে অন্তর্নির্মিত dirname কাজটি করার সময় কিছুটা আলাদাভাবে কাজ করার সময় ""। " PATH এ উপস্থিত হয়।


4
এটি একটি উত্সাহিত স্ক্রিপ্ট নয়, সম্পাদিত স্ক্রিপ্ট। $0একটি ইন্টারেক্টিভ শেলটির জন্য কেবল "বাশ" রয়েছে এবং এটি সর্বাধিক উত্সযুক্ত স্ক্রিপ্ট দেখে।
ক্যাস্যাবেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.