বাছাই করে সোর্সিং ('।' বা 'উত্স') এবং ফাইল চালানোর মধ্যে পার্থক্য কী?


76

এর মতো স্ক্রিপ্ট কার্যকর করার মধ্যে পার্থক্য কী:

./test.sh

এবং এর মতো স্ক্রিপ্ট কার্যকর করা:

. test.sh?

আমি একটি সহজ, দ্বি-লাইন স্ক্রিপ্ট চেষ্টা করেছিলাম তা দেখতে আমি কোনও পার্থক্য আছে কিনা তা খুঁজে পেতে চেষ্টা করেছি:

#!/bin/bash
ls

কিন্তু উভয় . test.shএবং ./test.shএকই তথ্য ফেরত।


দুঃখিত এটি যদি একটি সদৃশ হয় - তদন্তের পরে, আমি 'বাশ' এর পরিবর্তে 'বাশ ডট' অনুসন্ধান করে প্রাসঙ্গিক তথ্য সহ কিছু পৃষ্ঠা খুঁজে পেয়েছি।
নাটান

3
ঠিক যেমন test.shহিসাবে একই নয় ./test.sh(প্রথম একটি বস্তুর পূজা PATHঅনুসন্ধান), তাই হয় . test.shএবং . ./test.shএকই ভাবে পৃথক (সাবেক একটি বস্তুর পূজা PATHঅনুসন্ধান)। অনেক শাঁস পরোক্ষভাবে অন্তর্ভুক্ত বলে মনে হচ্ছে .শেষে PATHযখন একটি করছেন .পথ অনুসন্ধান, কিন্তু এই আচরণ মান নয়। সুতরাং, test.shবনাম . test.shএবং ./test.shবনাম তুলনা আরও সঠিক . ./test.sh
jw013

উত্তর:


83

./test.shtest.shএকটি পৃথক প্রোগ্রাম হিসাবে চলমান । ফাইলটি test.shশুরু হলে এটি বাশ স্ক্রিপ্ট হতে পারে #!/bin/bash। তবে এটি পুরোপুরি অন্য কিছু হতে পারে।

. ./test.shব্যাশের test.shচলমান দৃষ্টান্তের মধ্যে ফাইলের কোডটি কার্যকর করে । এটি এমনভাবে কাজ করে test.shযে . ./test.shলাইনের পরিবর্তে বিষয়বস্তু ফাইলটি পাঠ্যভাবে অন্তর্ভুক্ত করা হয়েছিল । (প্রায়: কয়েকটি আলাদা আলাদা বিশদ রয়েছে যেমন বিল্টিনের মান $BASH_LINENOএবং আচরণের মতো return))

source ./test.shঅভিন্ন . ./test.shব্যাশ মধ্যে (অন্যান্য শাঁস এ, sourceকিছুটা ভিন্ন হতে পারে অথবা পুরাপুরি অস্তিত্ব নেই; .অন্তর্ভুক্তির জন্য POSIX মান হয়)।

বিল্টিনের ./test.shসাথে একটি স্ক্রিপ্ট সহ পৃথক স্ক্রিপ্ট চালানো এবং অন্তর্ভুক্ত করার মধ্যে সর্বাধিক দৃশ্যমান পার্থক্যটি .হ'ল test.shস্ক্রিপ্টটি যদি একটি পৃথক প্রক্রিয়া সহ কিছু পরিবেশের ভেরিয়েবল নির্ধারণ করে তবে স্ক্রিপ্ট অন্তর্ভুক্তির সাথে, কেবলমাত্র শিশু প্রক্রিয়ার পরিবেশ নির্ধারণ করা হয় the একমাত্র শেল প্রক্রিয়া সেট করা আছে। আপনি যদি একটি লাইন যুক্ত করে থাকেন foo=barমধ্যে test.shএবং echo $fooকলিং স্ক্রিপ্ট শেষে আপনি পার্থক্য দেখতে পাবেন:

$ cat test.sh
#!/bin/sh
foo=bar
$ ./test.sh
$ echo $foo

$ . ./test.sh
$ echo $foo
bar

17
এছাড়াও echo $$স্ক্রিপ্টে যুক্ত করা পার্থক্যটি বেশ পরিষ্কার দেখাবে। $$পরিবর্তনশীল বর্তমান শেলের PID, ঝুলিতে।

1
অন্য ব্যবহারের পরিস্থিতিটি . ./test.shঅন্য শেল স্ক্রিপ্টের মধ্য থেকে কলটি টেস্ট.শ এর মধ্যে বর্ণিত ফাংশনগুলি ব্যবহার করতে ব্যবহার করছে। আমি বলতে চাইছি এটি কেবল পরিবর্তনশীল নয় যা আপনি সেট করতে পারেন, আপনি নতুন ফাংশনও তৈরি করতে পারেন যা বাশ, বা অন্য কোনও স্ক্রিপ্ট থেকে কলযোগ্য। . /usr/libexec/company/tools; custom_command "variable"
রকোমে

9

স্ক্রিপ্ট প্রথমভাবে চালানো এটি শিশু প্রক্রিয়া হিসাবে চালিত হয়। অন্যদিকে সোর্সিং (দ্বিতীয় উপায়) স্ক্রিপ্টটি এমনভাবে চালিত করে যেমন আপনি বর্তমান শেলটিতে এর সমস্ত কমান্ড প্রবেশ করিয়েছেন - স্ক্রিপ্টটি যদি কোনও ভেরিয়েবল সেট করে থাকে তবে এটি সেট থাকবে, স্ক্রিপ্টটি যদি প্রস্থান করে, আপনার সেশনটি প্রস্থান করবে। help .ডকুমেন্টেশন জন্য দেখুন ।


3

আরেকটি বিষয় যা আমি লক্ষ্য করি তা হ'ল যদি আপনার এইরকম একটি উপাধি থাকে:

# add into .bashrc_aliases
alias ls='ls -lht'

সঙ্গে ./test.shআপনি একটি স্বাভাবিক পাবেন lsআউটপুট (এবং বর্তমান শেল তুলনায় বিভিন্ন PID,):

auraham@pandora:~/iso$ ./test.sh 
dsl-4.4.10.iso  test.sh
3136 # PID

সহ . test.shবা . ./test.shআপনি আরও বিশদ আউটপুট পাবেন (এবং বর্তমান শেলের চেয়ে একই পিআইডি):

auraham@pandora:~/iso$ echo $$
2767 # shell PID

auraham@pandora:~/iso$ . test.sh 
total 50M
drwxrwxr-x  2 auraham auraham 4.0K Jul 30 15:41 .
-rwxrwxr-x  1 auraham auraham   32 Jul 30 15:41 test.sh
drwxr-xr-x 50 auraham auraham 4.0K Jul 30 15:30 ..
-rw-rw-r--  1 auraham auraham  50M Jul 28 17:24 dsl-4.4.10.iso
2767 # PID

আপনি এটিকে .bashrc if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi এরপরে অন্তর্ভুক্ত করতে পারেন , আপনার ডাকনামটি রেখে দিন .bash_aliases
uraরহাম

অবশ্যই, তবে আপনার aliasকী কীওয়ার্ডটি ব্যবহার করতে হবে না ? (সম্ভবত এটি আপনার পোস্টে একটি ভুল - 3 লাইনে?)
ইমানুয়েল বার্গ

সম্পূর্ণ ভুল, আমার ভুল। ধন্যবাদ @ ইমানুয়েলবার্গ
আওরহাম

-1

আমার কাছে source(বা .) প্রধান ব্যবহার হ'ল বাশ ফাংশন

আমার কাছে অনেকগুলি ফাংশন সহ স্ক্রিপ্ট রয়েছে এবং আমি এগুলি সমস্ত আমার সাথে চালিত করি .bashrc। ফাংশনগুলি "হয়ে যায়" কমান্ড, যা আমি প্রায়শই ব্যবহার করি।


আমি .bashrc - উত্স, স্ক্রিপ্টের পরম অবস্থান এবং কমান্ডের নাম (একটি PATH ফোল্ডারে স্ক্রিপ্ট স্থাপন করে) - এ তিনটি পদ্ধতিই চেষ্টা করেছি এবং তিনটি পদ্ধতিই কাজ করেছিল।
ইমানুয়েল বার্গ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.