انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: درخواست توضیح چند مفهوم در باره دستور source -حل شد-  (دفعات بازدید: 2269 بار)

0 کاربر و 3 مهمان درحال مشاهده موضوع.

آفلاین ali.abry

  • High Hero Member
  • *
  • ارسال: 1224
سلام دوستان
در کتاب LPIC-1: Linux Professional Institute Certification Study Guide صفحه 435 مطلبی در باره تفاوت اجرا کردن یک اسکریپت به صورت معمولی و اجرا کردن اون با دستور source نوشته که در زیر قرار میدم
در متن زیر منظور از calling shell چی هستش ؟
در مورد تفاوت 4رم منظورش از shell's language زبان برنامه نویسی هست یا چیزه دیگه ای هست ؟

■When you source a script, it will have access to environment variables set in the calling
shell, even if you haven’t exported them. Ordinarily, only environment variables that
 you explicitly export become available to scripts you run.

■ If you source a script and if that script sets an environment variable, that variable will
   become available (or will be changed) in the calling shell. If you run the script nor-
  mally, any environment variables it sets will remain local to it and to the programs that
 it calls, even if the script exports the variables.

■ Running a script in the normal ways imposes overhead costs associated with launching
   the new shell. These costs are normally negligible, but if a script calls itself recursively
  or calls many other scripts, sourcing those scripts within the fi rst script may improve
   performance.

■ Sourcing a script causes it to execute in the calling shell’s language, whereas running a
     script normally causes it to use the shell language specified on the hashbang line.
« آخرین ویرایش: 21 دی 1392، 12:49 ق‌ظ توسط ali.abry »

آفلاین mhch

  • Sr. Member
  • *
  • ارسال: 340
  • جنسیت : پسر
سلام
این که صرفا باید با متن توضیح بدم یکم سخت ه ای کاش میشد تصویر داشت
برای اجرای اسکریپت راه های مختلفی وجود داره
مثال
bash a.sh./a.sh. a.shمورد اخر در واقع همین سوال شماست
توی مورد اول یه شل داریم از توی شل یه شل ثانی رو فرا میخونیم و میگیم اسکریپت رو اجرا کن ( حالا اگه توی اسکریپت باز هم شل دیگری رو فرا بخونیم بحث ش جداست )
در مورد دوم شل جاری میبینه که در ورودی / وجود داره و متوجه میشه که این دستور نیست و ادرس هست به parent  ش میگه و parentیه دونه شل fork میکنه
( مورد اول خود شل جاری شل فرا میخونه ولی در مورد دوم PPID شل دوم متعلق به parent شل جاری ه )
اما در مورد سوم میگیم که شل ثانی fork نشه و خود همین شل جاری اسکریپت و اجرا کنه
( دوباره تاکید میکنم که این صرفا در اجراست و اگر داخل اسکریپت شل دیگری رو فرا بخونیم اون جداست از این قضیه )
خیلی سعی کردم روون بنویسم امیدوارم تونسته باشم درست مفهوم رو منتقل کنم
در این زمانه بی های و هوی و لال پرست
خوشا بحال کلاغای قیل و غال پرست
به شب نشینی خرچنگ های مردابی
چگونه رقص کند ماهی زلال پرست
رسیده ها چه غریب و نچیده میافتند
به پای هرزه علف های باغ کال پرست
هنوز زنده ام و زنده بودنم خاریست
به تنگ چشمی نامردمان زوال پرست

آفلاین امین - am1n

  • Sr. Member
  • *
  • ارسال: 467
  • جنسیت : پسر
  • ... روش دین توضیح شناخته‌ها بوسیله ناشناخته‌هاست!!
    • دات امین / حرف های آزاد من
در متن زیر منظور از calling shell چی هستش ؟
در مورد تفاوت 4رم منظورش از shell's language زبان برنامه نویسی هست یا چیزه دیگه ای هست ؟

■When you source a script, it will have access to environment variables set in the calling
shell, even if you haven’t exported them. Ordinarily, only environment variables that
 you explicitly export become available to scripts you run.

■ If you source a script and if that script sets an environment variable, that variable will
   become available (or will be changed) in the calling shell. If you run the script nor-
  mally, any environment variables it sets will remain local to it and to the programs that
 it calls, even if the script exports the variables.

■ Running a script in the normal ways imposes overhead costs associated with launching
   the new shell. These costs are normally negligible, but if a script calls itself recursively
  or calls many other scripts, sourcing those scripts within the fi rst script may improve
   performance.

■ Sourcing a script causes it to execute in the calling shell’s language, whereas running a
     script normally causes it to use the shell language specified on the hashbang line.

سلام :) سوال قشنگی پرسیدی باعث شد برم دنبال source ببینم چیه.
اول بگم که قبلا با source کار نکردم و کتاب هم نخوندم پس ممکنه اشتباه بگم . هدف اینه دور هم باشیم :دی و به نتیجه برسیم

در مورد سوال اولت ، calling shell دقیقا همون محیطیه که تو به عنوان کاربر دستورتو توش ران کردی. دقیق تر بگم. وقتی میگه calling shell ، یعنی اون shellی که دستور source رو ران کرده.
مثلا تو این دستور رو اجرا می‌کنی:
sh myscript.sh
پس اسکریپت از بالا شروع میشه به اجرا شدن . میرسه به دستور:
source something.sh
یعنی کسی که something رو call کرده ، اسکریپت myscript بوده . پس calling shell میشه همون shellی که myscript داره توش ران میشه

امیدوارم درست توضیح داده باشم و واضح :)

سوال دومت که درباره ی قسمت ۴امه.
کلا میگه اگر از دستور source استفاده کنیم باعث میشه که اسکریپی که اون رو source کردیم، با زبان calling shell اجرا بشه نه زبان خودش :) فکر کنم مثال بزنم بهتره
#!/bin/bash
source /home/blah blah/something.sh

echo "hi"
در این مثال از دستور source استفاده شده برای اجرای somethin.sh . یعنی که کدهای توی something.sh دارن با زبان calling shell اجرا میشن. توی خط اول هم نوشتیم bin/bash/!# . پس یعنی کدهای توی something.sh دارن با bin/bash/ اجرا میشن .

در حالت دوم که از دستور source استفاده نکنیم:
#!/bin/bash
./home/blah blah/something.sh

echo "hi"
در این حالت دیگه کاری نداره که زبان پدرش یعنی calling shell چیه. میره خود کد رو اجرا میکنه! ممکنه کد به هر طریقی اجرا شده باشه :)

موفق باشی
« آخرین ویرایش: 19 دی 1392، 09:21 ب‌ظ توسط amin/~: »

آفلاین ali.abry

  • High Hero Member
  • *
  • ارسال: 1224
ممنون از دوستان مشکل با توضیحات خوبتون حل شد .
موضوع رو حل شد زدم