ts icon
سرور تیم اسپیک گاردایران

پست های پیشنهاد شده

    بخش دوم - قسمت نهم


    تا اینجا شما یاد گرفتید چجوری اسکریپت هایی بنویسید که با تمام ابجکت ها تعامل داشته باشند , اما مواقعی هستند که شما نیاز دارید اسکریپتتون با شخصی که اونو اجرا میکنه در تعامل باشه , مثل ابزار هایی از کالی لینوکس که با بش نوشته شدن 

    شل بش راه هایی برای این کار در نظر گرفته , مثل پارامتر هایی که به برنامه اضافه میکنیم , یا اپشن ها و ...


    پارامتر ها :

    ساده ترین راه تزریق دیتا به اسکریپتتون هستند , که در زمان اجرای کد اعمال میشن :

    $ ./red 10 30


    شل بش متغیر های مخصوصی رو برای دریافت پارامتر ها تعریف میکنه که بهشون میگن positional parameters
    این متغیر ها اعداد استاندارد هستند , که 0$ اسم اسکریپت رو نگه میداره و 1$ یا 2$ و ... تا 9$ پارامتر هارو نگه میدارن , به مثال زیر توجه کنید :

$ cat test2.sh
#!/bin/bash
# estefade az parameter
#
    total=$[ $1 * $2 ]
    echo avalin parameter : $1
    echo dovomin parameter : $2
    echo meghdare kol : $total
    
    
$ ./test2.sh 2 5
avalin parameter : 2
dovomin parameter : 5
meghdare kol : 10


    در مثال بالا پارامتر ها مقدار عددی داشتند , شما میتونید از رشته هم استفاده کنید :

$ cat test3.sh
#!/bin/bash
#
    echo hello $1
    
   
$ ./test3.sh red
hello red


    توجه داشته باشید اگه در مثال بالا از اسمی که فاصله بینشه استفاده کنید بخش اول اسم به عنوان اولین پارامتر برداشته میشه :

$ ./test3.sh red naxela
hello red


    متوجه شدید که شل برای تمایز بین پارامتر ها از فاصله استفاده میکنه , بنابراین برای استفاده از مقادیر دارای فاصله از کوتیشن تک یا دابل استفاده میکنیم :

$ ./test3.sh 'red naxela'
hello red naxela
    
    
$ ./test3.sh "red naxela"
hello red naxela


    ما از متغیر های نه گانه ی نگهدارنده پارامتر ها صحبت کردیم
    ولی بیشتر از نه پارامتر هم میشه تعریف کرد , فقط شکل خوندنشون تغیر میکنه , در مثال زیر نحوه خوندن پارامتر های شماره 10 و 11 رو میبینید :

$ cat test4.sh
#!/bin/bash
# teste bish az 9 parameter
#
    total=$[ ${10} * ${11} ]
    echo dahomin parameter : ${10}
    echo yazdahomin parameter : ${11}
    echo meghdare kol : $total
    
    
$ ./test4.sh 1 2 3 4 5 6 7 8 9 10 11 12
dahomin parameter : 10
yazdahomin parameter : 11
meghdare kol : 110


    خوندن اسم اسکریپت :

    انجام این کار در اسکریپت های چند تابعی کاربرد پیدا میکنه , که به روش زیر انجام میشه :

$ cat test5.sh
#!/bin/bash
# teste $0 parameter
#
    echo parameter sefr : $0
    
    
$ bash test5.sh
parameter sefr : test5.sh
    
    
$ ./test5.sh
parameter sefr : ./test5.sh
    
    
$ bash /home/rednaxela/test5.sh
parameter sefr : /home/rednaxela/test5.sh

 

    طبق مثال های اجرای مختلف اسکریپت مشاهده کردید که متغیر 0$ به چه شکلی عمل میکنه

    برای اینکه فقط اسم اسکریپت رو دریافت کنید (بدون مسیر) از دستور basename استفاده میکنیم :

$ cat test5b.sh
#!/bin/bash
# estefade az basename baraye parameter $0
#
    name=$(basename $0)
    echo
    echo esme script : $name
    
    
$ bash /home/rednaxela/test5b.sh
    esme script : test5b.sh
    
    
$ ./test5b.sh
esme script : test5b.sh


    شما میتونید از این تکنیک برای اسکریپت هایی که چند تابعی هستند و توابع بر اسم اسکریپت تکیه دارن استفاده کنید , به مثال زیر توجه کنید :

$ cat test6.sh
#!/bin/bash
#
    name=$(basename $0)
    #
    if [ $name = "jam" ]
    then
    total=$[ $1 + $2 ]
    #
    elif [ $name = "zarb" ]
    then
    total=$[ $1 * $2 ]
    fi
    #
    echo
    echo meghdare mohasebe shode : $total
    
    
$ cp test6.sh jam
$ chmod u+x jam
$ ln -s test6.sh zarb
$ ls -l jam zarb
-rwxrw-r--. 1 rednaxela rednaxela 224 Jun 30 23:50 jam
lrwxrwxrwx. 1 rednaxela rednaxela   8 Jun 30 23:50 zarb -> test6.sh
    
    
$ ./jam 2 5
meghdare mohasebe shode : 7
    
    
$ ./zarb 2 5
meghdare mohasebe shode : 10


    تست پارامتر ها :

    در اسکریپت های پارامتر دار مواضب خطا های مربوط به استفاده نادرست از پارامتر ها باشید , مثال :

$ ./red 2
./red: line 8: 2 +  : syntax error: operand expected (error token is " ")
meghdare mohasebe shode :


    برای جلوگیری همیشه پارامتر هاتون رو چک کنید که ایا مقدار دارن یا نه :

$ cat test7.sh
#!/bin/bash
# teste parameter ghabl az estefade
#
    if [ -n "$1" ]
    then
    echo hello $1
    else
    echo "meghdar vared nashode"
    fi
    
    
$ ./test7.sh red
hello red
    
    
$ ./test7.sh
meghdar vared nashode


    استقاده از متغیر های مخصوص پارامتر ها :

    در مثال بالا چک کردن مقدار پارامتر برای جلوگیری از بروز خطا رو دیدید , که البته راه اصلی نبود , استفاده از روش بالا در اسکریپت های دارای چندین پارامتر اشگال این موضوع رو نشون میده

    به جای تست تک به تک پارامتر ها میتونید تعداد پارامتر های وارد شده رو در نظر بگیرید

    بش یک متغیر مخصوص برای این موضوع در نظر گرفته 
    متغیر مخصوص #$ تعداد پارامتر های وارد شده رو نگهداری میکنه , مثال زیر :

$ cat test8.sh
#!/bin/bash
# daryafte tedade parameter ha
#
    echo tedade parameter haye voroodi : $#
    
    
$ ./test8.sh
tedade perameter haye voroodi : 0
    
    
$ ./test8.sh 1 2 3 4 5
tedade parameter haye voroodi : 5
    
    
$ ./test8.sh 1 2 3 4 5 6 7 8 9 10
tedade parameter haye voroodi : 10
    
    
$ ./test8.sh "red naxela"
tedade parameter haye voroodi : 1


    مثال تست کردن پارامتر ها با این روش :

$ cat test9.sh
#!/bin/bash
# teste parameter ha
#
    if [ $# -ne 2 ]
    then
    echo
    echo nahve ye estefade : test9.sh a b
    echo
    else
    total=$[ $1 + $2 ]
    echo
    echo meghdare mohasebe shode : $total
    echo
    fi


$ bash test9.sh
nahve ye estefade : test9.sh a b
 

$ bash test9.sh 10
nahve ye estefade : test9.sh a b
  

$ bash test9.sh 10 15
meghdare mohasebe shode : 25


    همینطور میتونید فقط اخرین پارامتر وارد شده رو بیرون بکشید :

$ cat test10.sh
#!/bin/bash
# akharin parameter
#
    params=$#
    echo
    echo tedade parameter ha : $params
    echo akharin parameter : ${!#}
    echo
    
    
$ bash test10.sh 1 2 3 4 5
tedade parameter ha : 5
akharin parameter : 5
    
    
$ bash test10.sh
tedade parameter ha : 0
akharin parameter : test10.sh



    پایان قسمت نهم از بخش دوم

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

    بخش دوم - قسمت دهم


    قسمت قبل در مورد پارامتر ها , متغیر های نگه دارندشون و یک سری متغیر های مخصوص مرتبط صحبت کردیم

    دو متغیر مخصوص دیگه هستند که برای یک جا جمع کردن تمام پارامتر های ورودی استفاده میشن , متغیر های : *$ و @$ 
    متغیر *$ تمام پارامتر هارو در قالب یک کلمه درمیاره , اما متغیر @$ پارامتر هارو جدا از هم در یک رشته قرار میده , مثال :

$ cat test11.sh
#!/bin/bash
# teste $* va $@
#
    echo
    echo "estefade az \$* khorooji : $*"
    echo
    echo "estefade az \$@ khorooji : $@"
    
    
    
$ ./test11.sh red blue green pink
estefade az $* khorooji : red blue green pink
estefade az $@ khorooji : red blue green pink


    همونطور که میبینید ظاهرا هر دو خروجی برابر با هم هستند
    تفاوت بنیادی ای که قبل تر گفتم در مثال زیر قابل لمسه :

$ cat test12.sh
#!/bin/bash
# teste $* va $@
#
    echo
    count=1
    #
    for param in "$*"
    do
    echo "\$* Parameter #$count = $param"
    count=$[ $count + 1 ]
    done
    #
    echo
    count=1
    #
    for param in "$@"
    do
    echo "\$@ Parameter #$count = $param"
    count=$[ $count + 1 ]
    done
    
    
$ ./test12.sh red blue green pink

$* Parameter #1 = red blue green pink
    
$@ Parameter #1 = red
$@ Parameter #2 = blue
$@ Parameter #3 = green
$@ Parameter #4 = pink

   
    دستور shift :

    ابزار بعدی که شل در اختیارتون میزاره این دستوره , که با استفاده ازش میتونید پارامتر هارو یک واحد به سمت چپ بکشید 

    یعنی مثلا : مقدار 3$ در 2$ قرار میگیره , مقدار 2$ در 1$ قرار میگیره , و مقدار 1$ از بین میره , توجه داشته باشید مقدار 0$ که اسم اسکریپته دست نخورده باقی میمونه , مثال زیر رو ببینید :

$ cat test13.sh
#!/bin/bash
# teste dastoore shift
#
    echo
    count=1
    while [ -n "$1" ]
    do
    echo "Parameter #$count = $1"
    count=$[ $count + 1 ]
    shift
    done
    
    
$ ./test13.sh red blue green pink
 
Parameter #1 = red
Parameter #2 = blue
Parameter #3 = green
Parameter #4 = pink


    نکته مهم در مورد استفاه از دستور شیفت اینه که بعد از خارج شدن هر پارامتر از جایگاه شماره یک , مقدار از دست میره و قابل برگشت نیست

    شما میتونید با دادن پارامتر به دستور شیفت تعداد واحد ها در هر جابه جایی رو مشخص کنید , مثال زیر :

$ cat test14.sh
#!/bin/bash
# teste multi-position shift
#
    echo
    echo "parameter ha : $@"
    shift 2
    echo "parameter jadid dar jayegahe shomare yek : $1"
    
    
$ ./test14.sh 1 2 3 4 5
 
parameter ha : 1 2 3 4 5
parameter jadid dar jayegahe shomare yek : 3

 
    با استفاده از روش بالا شما میتونید به راحتی از پارامتر هایی که نمیخواید چشم پوشی کنید


    کار با اپشن ها :

    در کار با بش حتما دستوراتی رو دیدید که هم از پارامتر ها استفاده میکنن هم از اپشن ها , اپشن ها حروفی همراه با یک دش قبلشون هستند که رو رفتار دستور تاثیر میزارن

    در بخش قبل شما نحوه استفاده از دستور شیفت برای پارامتر هارو دیدید , ما میتونیم همین کار رو برای اپشن ها هم انجام بدیم ، مثال :

$ cat test15.sh
#!/bin/bash
#
    echo
    while [ -n "$1" ]
    do
    case "$1" in
    -a) echo "option -a peyda shod" ;;
    -b) echo "option -b peyda shod" ;;
    -c) echo "option -c peyda shod" ;;
    *) echo "$1 option nist" ;;
    esac
    shift
    done
    
    
$ ./test15.sh -a -b -c -d
option -a peyda shod
option -b peyda shod
option -c peyda shod
-d option nist


    فرقی هم نمیکنه ترتیب اپشن ها چی باشه :

$ ./test15.sh -b -a -c -d
option -b peyda shod
option -a peyda shod
option -c peyda shod
-d option nist

 

    مواقعی وجود داره که شما تمایل دارید از اپشن ها و پارامتر ها به طور همزمان استفاده کنید
    شل از دابل دش برای تشخیص تمام شدن لیست اپشن ها استفاده میکنه
    بعد از دیدن دابل دش اسکریپت شما سایر پارامتر هارو به عنوان پارامتر دریافت میکنه نه اپشن , در مثال زیر به تفاوت دو نوع اجرای اسکریپت دقت کنید :

$ cat test16.sh
#!/bin/bash
#
    echo
    while [ -n "$1" ]
    do
    case "$1" in
    -a) echo "option -a peyda shod" ;;
    -b) echo "option -b peyda shod";;
    -c) echo "option -c peyda shod" ;;
    --) shift
    break ;;
    *) echo "$1 option nist";;
    esac
    shift
    done
    #
    count=1
    for param in $@
    do
    echo "Parameter #$count: $param"
    count=$[ $count + 1 ]
    done
    
    
$ ./test16.sh -c -a -b test1 test2 test3
    
option -c peyda shod
option -a peyda shod
option -b peyda shod
test1 option nist
test2 option nist
test3 option nist


$ ./test16.sh -c -a -b -- test1 test2 test3

option -c peyda shod
option -a peyda shod
option -b peyda shod
Parameter #1: test1
Parameter #2: test2
Parameter #3: test3


    اپشن های مقدار دار :

    بعضی از اپشن ها  به پارامتر نیاز دارن , در این موقعیت ها کامند لاین به این شکل درمیاد :

$ ./testing.sh -a test1 -b -c -d test2


    اسکریپت شما باید متوجه باشه چه زمانی یک اپشن به پارامتر نیاز داره و بتونه این موضوع رو به طور مناسب مدیریت کنه , مثال زیر :

$ cat test17.sh
#!/bin/bash
#
    echo
    while [ -n "$1" ]
    do
    case "$1" in
    -a) echo "option -a peyda shod";;
    -b) param="$2"
    echo "option -b peyda shod, hamrah ba parameter $param"
    shift ;;
    -c) echo "option -c peyda shod";;
    --) shift
    break ;;
    *) echo "$1 option nist";;
    esac
    shift
    done
    #
    count=1
    for param in "$@"
    do
    echo "Parameter #$count: $param"
    count=$[ $count + 1 ]
    done
    
    
$ ./test17.sh -a -b test1 -d
option -a peyda shod
option -b peyda shod, hamrah ba parameter test1
-d option nist


    مثل نمونه قبل در این حالت هم ترتیب مقادیر ورودی اهمیتی نداره :

$ ./test17.sh -b test1 -a -d
option -b peyda shod, hamrah ba parameter test1
option -a peyda shod
d option nist


    الان شما نمونه ابتدایی ایجاد اپشن در اسکریپت رو یاد گرفتید , ولی این نمونه محدودیت هایی داره مثل عدم ترکیب اپشن ها , مثال زیر :

$ ./test17.sh -ac
-ac option nist


    استفاده از دستور getopt :

    با استفاده از این ابزار بهتر میتونیم موارد مرتبط با اپشن ها و پارامتر هارو هندل کنیم

    این دستور میتونه لیست اپشن ها و پارامتر هارو به هر فرمی دریافت کنه و به صورت خودکار تبدیلشون کنه به فرمت مناسب , فرمت :

getopt optstring parameters


    بخش اول فرمت اپشن هارو تعریف میکنه , و حتی مشخص میکنه کدوم اپشن پارامتر میگیره :

$ getopt ab:cd -a -b test1 -cd test2 test3
-a -b test1 -c -d -- test2 test3


    در این مثال همونطور که در خط دوم میبینید چهار اپشن و دو پارامتر تعریف شدن , که یکی از اپشن ها پارامتر هم میگیره

    در خط اول یک ( : ) جلوی حرف بی میبینید , به این معنی که این اپشن قراره پارامتر هم داشته باشه

    و همینطور میبینید که قابلیت تفکیک اپشن های به هم چسبیده رو هم داره

    اگه در قسمت اول دستور اپشنی که قصد تعریفش رو دارید مشخص نکنید با ارور زیر رو به رو میشید  :

$ getopt ab:cd -a -b test1 -cde test2 test3
getopt: invalid option -- e
-a -b test1 -c -d -- test2 test3


    که البته با اپشن q- میتونید از نمایش ارور جلوگیری کنید :

$ getopt -q ab:cd -a -b test1 -cde test2 test3
-a -b 'test1' -c -d -- 'test2' 'test3'


    استفاده از getopt در اسکریپت :

    برای این کار باید خروجی دستور getopt رو بدیم به دستور set در حالی که اپشن دابل دش براش ست شده , مثال :

$ cat test18.sh
#!/bin/bash
#
    set -- $(getopt -q ab:cd "$@")
    #
    echo
    while [ -n "$1" ]
    do
    case "$1" in
    -a) echo "option -a peyda shod" ;;
    -b) param="$2"
    echo "option -b peyda shod, hamrah ba parameter $param"
    shift ;;
    -c) echo "option -c peyda shod" ;;
    --) shift
    break ;;
    *) echo "$1 option nist";;
    esac
    shift
    done
    #
    count=1
    for param in "$@"
    do
    echo "Parameter #$count: $param"
    count=$[ $count + 1 ]
    done
    
    
$ ./test18.sh -ac

option -a peyda shod
option -c peyda shod


$ ./test18.sh -a -b test1 -cd test2 test3 test4

option -a peyda shod
option -b peyda shod, hamrah ba parameter 'test1'
option -c peyda shod
Parameter #1: 'test2'
Parameter #2: 'test3'
Parameter #3: 'test4'


    خوب دیدید که خروجی ها طبق انتظار بودن , اما اگه در یک پارامتر فاصله وجود داشته باشه چی ؟

$ ./test18.sh -a -b test1 -cd "test2 test3" test4

option -a peyda shod
option -b peyda shod, hamrah ba parameter 'test1'
option -c peyda shod
Parameter #1: 'test2
Parameter #2: test3'
Parameter #3: 'test4'


    دیدید که دابل کوتیشن ها هم نتونستن مارو به چیزی که میخوایم برسونن

    این یکی از دلایلی هستش که برای کار با اپشن ها و پارامتر ها مارو به سمت یه ابزار پیشرفته تر میکشونه ، که در قسمت بعد بهش میپردازیم


    پایان قسمت دهم از بخش دوم

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

    بخش دوم - قسمت یازدهم


    پیشروی به سمت getopts 

    فرمت و مثال :

    getopts optstring variable
 
 
$ cat test19.sh
#!/bin/bash
#
    echo
    while getopts :ab:c opt
    do
    case "$opt" in
    a) echo "option -a peyda shod" ;;
    b) echo "option -b peyda shod, hamrah ba $OPTARG";;
    c) echo "option -c peyda shod" ;;
    *) echo "option: $opt vojood nadarad";;
    esac
    done
    
 
$ ./test19.sh -ab test1 -c

option -a peyda shod
option -b peyda shod, hamrah ba test1
option -c peyda shod


    به جز تغیر در حالت اسکریپت و ساده تر شدنش , دو تفاوت اصلی بین این دستور و دستور قسمت قبل رو در مثال بالا مشاهده کردید

    اول اینکه دیدید در قسمت تعریف اپشن ها قبل از اسم اپشن ها یک ( : ) گذاشته شده , این علامت به جای اپشن q- در قسمت قبل گذاشته شده تا جلوی نمایش ارور گرفته بشه

    و دومین تغیر نوع تعریف پارامتر برای اپشن , دستور از متغیر محیطی OPTARG برای این کار استفاده میکنه

    این متغیر به صورت خودکار برای اپشنی که پارامتر دار معرفی شده پارامتر رو نگهداری میکنه

    بر خلاف نمونه قبلی در این دستور پارامتر ها میتونن حاوی فاصله باشن :

$ ./test19.sh -b "test1 test2" -a
option -b peyda shod, hamrah ba test1 test2
option -a peyda shod


    همچنین شما میتونید بین اپشن ها و یا اپشن و پارامتر و یا هر دو حالت همزمان , هیچ فاصله ای نذارید :

$ ./test19.sh -abtest1
option -a peyda shod
option -b peyda shod, hamrah ba test1


    و همچنین ابزار قدرت تفکیک و تشخیص اپشن های تعریف نشده رو هم داره :

$ ./test19.sh -d
Unknown option: ?


$ ./test19.sh -acde
option -a peyda shod
option -c peyda shod
Unknown option: ?
Unknown option: ?


    ابزار میدونه چه زمانی اپشن ها رو رها کنه و به پردازش پارامتر ها بپردازه
    زمانی که شما نیاز به خوندن پارامتر ها داشتید میتونید از دومین متغیری که این ابزار باهاش کار میکنه با استفاده از شیفت برای رفتن به سمت پارامتر ها استفاده کنید    متغیر محیطی OPTIND شامل مقدار لوکیشن فعلی , داخل لیست پارامترهاست ، مثال :

$ cat test20.sh
#!/bin/bash
# teste option ha va parameter ha ba getopts
#
    echo
    while getopts :ab:cd opt
    do
    case "$opt" in
    a) echo "option -a peyda shod"  ;;
    b) echo "option -b peyda shod, hamrah ba $OPTARG" ;;
    c) echo "option -c peyda shod"  ;;
    d) echo "option -d peyda shod"  ;;
    *) echo "Unknown option: $opt" ;;
    esac
    done
    #
    shift $[ $OPTIND - 1 ]
    #
    echo
    count=1
    for param in "$@"
    do
    echo "Parameter $count: $param"
    count=$[ $count + 1 ]
    done
    
    
$ ./test20.sh -a -b test1 -d test2 test3 test4

option -a peyda shod
option -b peyda shod, hamrah ba test1
option -d peyda shod

Parameter 1: test2
Parameter 2: test3
Parameter 3: test4

  

 استاندارد سازی اپشن ها :

    حالا که شما میتونید اسکریپت های اپشن دار بنویسید , این که چه حروفی برای اپشن ها استفاده بشه به عهده شماست
    اگرچه تعدادی حروف با معانی مشخص جا افتادند که اگه شما هم در اسکریپتتون از این حروف استفاده کنید , ابزارتون قابل استفاده تر میشه , مثال :

    a-
    نمایش همه ابجکت ها

    d-
    مشخص کردن یک دایرکتوری

    e-
    توسعه یک ابجکت

    f-
    مشخص کردن یک فایل

    h-
    نمایش دستورالعمل

    l-
    تولید یک فرمت کامل تر از خروجی

    o-
    مشخص کردن فایل برای دریافت خروجی

    q-
    میشه گفت عدم نمایش ارور ها

    r-
    پروسه های همزمان فایل ها و دایرکتوری ها

    s-
    اجرا در حالت سایلنت

    x-

    اجرای یک ابجکت
    


    دریافت ورودی از کاربر :

    این عمل با استفاده از دستور read انجام میشه , به مثال زیر توجه کنید :

$ cat test21.sh
#!/bin/bash
# teste dastoore read
#
    echo -n "esmetoon ro vared konid : "
    read name
    echo "slm $name, khosh amadid"
  
  
$ ./test21.sh
esmetoon ro vared konid : rednaxela
slm rednaxela, khosh amadid


    همچنین میتونید مستقیم با خود دستور بنر رو چاپ کنید :

$ cat test22.sh
#!/bin/bash
#
    read -p "lotfan senetoon ro vared konid: " age
    days=$[ $age * 365 ]
    echo "sene shoma hade aghal balatar az $days rooz ast

 
$ ./test22.sh
lotfan senetoon ro vared konid: 10
sene shoma hade aghal balatar az 3650 rooz ast


    این دستور تمام بخش های ورودی رو در یک متغیر قرار میده , برای بخش بندی مقادیر ورودی بین متغیر ها , به صورت زیر عمل میکنیم :

$ cat test23.sh
#!/bin/bash
# teste chand moteghayer baraye daryafte maghadire voroodi
#
    read -p "esmetoon ro vared konid: " first last
    echo $first
    echo $last
   
   
$ ./test23.sh
esmetoon ro vared konid: red naxela
red
naxela


    اگر برای دستور هیچ متغیری تعریف نکنید , دستور از متغیر محیطی REPLY برای دریافت دیتا استفاده میکنه

$ cat test24.sh
#!/bin/bash
#
    read -p "esmetoon ro vared konid: "
    echo slm $REPLY, khosh amadid
   
   
$ ./test24.sh
esmetoon ro vared konid: rednaxela
slm rednaxela khosh amadid


    شما میتونید برای وارد کردن اطلاعات توسط کابر زمان مشخص کنید , تا اگه اطلاعاتی وارد نشد اسکریپت از کارش نیوفته و کاری که جایگزین میکنید رو انجام بده

    این کار با اپشن t- انجام میشه و واحد های ثانیه ای دریافت میکنه ، مثال زیر :

$ cat test25.sh
#!/bin/bash
# tayine zaman baraye voroodi
    #
    if read -t 5 -p "lotfan esme khod ra vared konid: " name
    then
    echo "slm $name, khosh amadid"
    else
    echo
    echo "zaman be payan resid "
    fi
  
  
$ ./test25.sh
lotfan esme khod ra vared konid: rednaxela
slm rednaxela, khosh amadid
    
    
$ ./test25.sh
lotfan esme khod ra vared konid:

zaman be payan resid 


    همچنین شما میتونید به جای محدودیت زمانی , از مشخص کردن تعداد کاراکتر های ورودی استفاده کنید

    این کار با اپشن n-  و واحد های کاراکتری انجام میشه , مثال زیر :

$ cat test26.sh
#!/bin/bash
# daryafte tanha yek character az voroodi
#
    read -n1 -p "aya edame midid [Y/N]? " answer
    case $answer in
    Y | y) echo
    echo "ok, edame midim";;
    N | n) echo
    echo "khoda negahdar"
    exit;;
    esac
    echo "payane script"
  
  
$ ./test26.sh
aya edame midid [Y/N]? y
ok, edame midim
payane script
  
  
$ ./test26.sh
aya edame midid [Y/N]? N
khoda negahdar

 

    عدم نمایش مقدار ورودی کاربر ( مثل وارد کردن پسورد ) :

    این کار با اپشن s- انجام میشه , و مقدار وروردی در مانیتور دیده نمیشه
    در واقع مقدار ورودی در مانیتور چاپ میشه , ولی چون دستور رنگ مقدار رو با رنگ پس زمینه هماهنگ میکنه , نمیتونیم مقدار رو ببینیم :

$ cat test27.sh
#!/bin/bash
# makhfi kardane meghdare voroodi dar monitor
#
    read -s -p "password ro vared konid: " pass
    echo
    echo "password hamine : $pass ?"
  
  
$ ./test27.sh
password ro vared kooid:

password hamine : T3st1ng ?


    همچنین شما میتونید با این ابزار مقادیر ورودی رو از یک فایل دریافت کنید 
    دستور این کار رو خط به خط انجام میده , به مثال زیر توجه کنید :

$ cat test28.sh
#!/bin/bash
# daryafte maghadir az yek file
#
    count=1
    cat file | while read line
    do
    echo "Line $count: $line"
    count=$[ $count + 1]
    done
    echo "payane pardazesh"
    
    
$ cat file
guardiran digital security team
guardiran cyber security tream
    
    
$ ./test28.sh
Line 1: guardiran digital security team
Line 2: guardiran cyber security tream
payane pardazesh



    پایان قسمت یازدهم از بخش دوم

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

    بخش دوم - قسمت دوازدهم


    file descriptor ها :

    لینوکس هر ابجکتی رو به عنوان یک فایل هندل میکنه , که شامل پروسه های ورودی و خروجی هم میشه
    همچنین سیستم هر ابجکت فایلی رو با استفاده از یک فایل دیسکریپتر شناسایی میکنه
    فایل دیسکریپتر یک عدده که منحصرا فایل های باز در یک نشست رو شناسایی میکنه , هر پروسه اجازه داره تا 9 فایل دیسکریپتر در یک زمان داشته باشه , که شل بش سه تای اول رو (0,1,2) برای مقاصد مشخصی استفاده میکنه :

    0      STDIN       Standard input
    1      STDOUT      Standard output
    2      STDERR      Standard error


    این سه فایل دیسکریپتر مخصوص , ورودی و خروجی از اسکریپت شما رو هندل میکنن
    که شل ازشون برای هدایت ورودی و خروجی پیش فرض , به محل مناسب استفاده میکنه


    STDIN :

    این فایل دیسکریپتر ورودی استاندارد رو به شل ارجاع میده , که برای یک رابط کاربری ترمینال ورودی استاندارد میشه کیبور

    شل مقادیر ورودی با استفاده از کیبورد رو در STDIN دریافت و پردازش میکنه
    وقتی شما از علا مت ( > ) برای ارجاع استفاه میکنید لینوکس فایل دیسکریپتر ورودی استاندارد رو با فایلی که شما ارجاع دادید عوض میکنه , که یعنی اطلاعات فایل به نحوی به شل داده میشه که انگار همون لحضه از طریق کیبورد تایپ شدن

    به نحوه تغیر ورودی گرفتن شل از فایل کاربر دقت کنید :

$ cat < testfile
khate aval az test
khate dovom az test


    STDOUT :

    این فایل دیسکریپتر کارش ارجاع خروجی استاندارد شل هستش , که در یک رابط کاربری ترمینال خروجی استاندارد مانیتور محسوب میشه    

    تمام خروجی شل , شامل برنامه ها و اسکریپت هایی که شما اجرا میکنید , به خروجی استاندارد هدایت میشن که میشه همون مانیتور
    اکثر دستورات بش خروجیشون رو در حالت پیشفرض به STDOUT هدایت میکنن , که البته میتونید به جایی که میخواید تغیرش بدید :

$ ls -l > test2
$ cat test2
total 20
-rw-rw-r-- 1 rednaxela rednaxela 53 2020-5-16 11:30 test
-rw-rw-r-- 1 rednaxela rednaxela  0 2020-5-16 11:32 test2
-rw-rw-r-- 1 rednaxela rednaxela 73 2020-5-16 11:23 testfile


$ who >> test2
$ cat test2
total 20
-rw-rw-r-- 1 rednaxela rednaxela 53 2020-5-16 11:30 test
-rw-rw-r-- 1 rednaxela rednaxela  0 2020-5-16 11:32 test2
-rw-rw-r-- 1 rednaxela rednaxela 73 2020-5-16 11:23 testfile
rednaxela     pts/0        2020-5-16 15:34 (192.168.1.2)


    و اما به اتفاقی که در مثال زیر میوفته دقت کنید :

$ ls -al badfile > test3
ls: cannot access badfile: No such file or directory
$ cat test3


    وقتی یک دستور باعث ایجاد ارور میشه , بر خلاف تغیر مسیر خروجی , شل ارور رو به سمتی که ما برای خروجی مشخص کردیم هدایت نمیکنه

    شل فایل خروجیه مارو ساخته ولی ارور بهش منتقل نشده
    شل ارور هارو جدا از خروجی نرمال هندل میکنه , اگه شما شل اسکریپتی مینویسید که در بک گراند اجرا بشه اغلب باید به پیام های خروجی ارسالی به یک لاگ فایل متکی باشید

    در این روش , اگه پیام اروری داده بشه روی لاگ فایل قابل رویت نیست , شما باید از روش دیگه ای استفاه کنید


    STDERR :


    شل با استفاده از فایل دیسکریپتر STDERR ارور هارو هندل میکنه
    اینجا جاییه که شل ارور های به وجود اومده در خودش و برنامه ها یا اسکریپت های اجرا شده در شل رو ارسال میکنه

    مسیر پیش فرض هر دو فایل دیسکریپتر STDOUT و STDERR به سمت مانیتور ارجاع داده میشه, اگرچه با مقادیر متفاوتی کار میکنن

    به همین دلیل همونطور که در مثال دیدید , وقتی شما خروجی پیش فرض رو ارجاع دادید , مسیر خروجیه ارور ها تغیری نکردن


    ارجاع ارور ها :

    شما با ارجاع خروجی اشنا شدید , ارجاع ارور ها هم فرق چندانی نداره فقط باید هنگام هدایت STDERR رو تعریف کنید , برای این کار چند راه وجود داره :


    فقط هدایت ارور :

    همونطور که قبلا دیدید عدد تعریف شده برای این فایل دیسکریپتر 2 هستش
    شما میتونید با قرار دادن این عدد کنار علامت هدایت به اسکریپت بگید فقط ارور ها تغیر مسیر بده :

$ ls -al badfile 2> test4
$ cat test4
ls: cannot access badfile: No such file or directory

 

    میبینید که پیام ارور به جای چاپ در مانیتور داخل فایل ما قرار گرفته
    یه مثال دیگه , این بار ترکیب استفاده از STDOUT و STDERR :

$ ls -al test badtest test2 2> test5
-rw-rw-r-- 1 rednaxela rednaxela 158 2020-5-16 11:32 test2

$ cat test5
ls: cannot access test: No such file or directory
ls: cannot access badtest: No such file or directory


    هدایت ارور ها و دیتا :

    اگه میخواید هم دیتا و هم ارور هارو هدایت کنید باید از دو علامت هدایت استفاده کنید , این کار باعث میشه هر نوع از خروجی در فایل جداگونه ای که بهش میدیم قرار بگیره :

$ ls -al test test2 test3 badtest 2> test6 1> test7

$ cat test6
ls: cannot access test: No such file or directory
ls: cannot access badtest: No such file or directory
 
$ cat test7
-rw-rw-r-- 1 rednaxela rednaxela 158 2020-5-16 11:32 test2
-rw-rw-r-- 1 rednaxela rednaxela   0 2020-5-16 11:33 test3


    اگه میخواید هر دو مقدار خروجی به یک فایل هدایت بشن از نماد & استفاده کنید :

$ ls -al test test2 test3 badtest &> test7
$ cat test7
ls: cannot access test: No such file or directory
ls: cannot access badtest: No such file or directory
-rw-rw-r-- 1 rednaxela rednaxela 158 2020-5-16 11:32 test2
-rw-rw-r-- 1 rednaxela rednaxela   0 2020-5-16 11:33 test3


    اگه شما بخواید مشخصا یک پیام ارور در اسکریپتتون ایجاد کنید , میتونید یک خط مشخص از خروجی اسکریپت رو به STDERR ارجاع بید

    برای ارجاع به فایل دیسکریپتر ها تنها کافیه هنگام هدایت خروجی علامت ( & ) رو به عدد مربوطه اضافه کنید :

echo "in yek payame error hastesh" >&2


    خروجیه این خط به سمت جایی هدایت میشه که محل مربوط به ارور هاست


    یک مثال پویا تر :
 

$ cat test8
#!/bin/bash
# teste payame STDERR
#
    echo "in yek error hastesh" >&2
    echo "in yek khoroojie normal hastesh"
 
 
$ ./test8
in yek error hastesh
in yek khoroojie normal hastesh


    در این مثال ظاهرا هیچ اتفاقی نیوفتاده , دلیلش اینه که در حالت پیشفرض STDERR به سمت STDOUT هدایت میشه

    نتیجه کار با تغیر مسیر STDERR قابل رویت میشه :

$ ./test8 2> test9
in yek khoroojie normal hastesh

$ cat test9
in yek error hastesh


    برای ارجاع کامل خروجی اسکریپت با استفاده از دستور exec به روش زیر عمل میکنیم : 

$ cat test10
#!/bin/bash
# hedayate tamame khoroojie script be yek file
#
    exec 1>testout
    #
    echo "teste hedayate kamele khorooji"
    echo "az script be yek file"
    echo "bedoone inke majboor bashim khat be khat redirect konim"
    
  
$ ./test10
$ cat testout
teste hedayate kamele khorooji
az script be yek file
bedoone inke majboor bashim khat be khat redirect konim


    شما همچنین میتونید این کار رو وسط اسکریپت و در جهات مختلف انجام بدید :

$ cat test11
#!/bin/bash
#
    exec 2>testerror
    #
    echo "inja shoroo e script hastesh"
    echo "hala tamame khorooji ro redirect mikonim"
    #
    exec 1>testout
    #
    echo "in khorooji bayad be file testout hedayat beshe"
    echo "ama in yeki khorooji bayad be file testerror hedayat she" >&2
    
   
$ ./test11
inja shoroo e script hastesh
hala tamame khorooji ro redirect mikonim
 
$ cat testout
in khorooji bayad be file testout hedayat beshe
   
$ cat testerror
ama in yeki khorooji bayad be file testerror hedayat she


    شما از همین روش میتونید برای هدایت ورودی به اسکریپتتون استفاده کنید , مثال زیر :

$ cat test12
#!/bin/bash
# redirect kardane voroodi
#
    exec 0< testfile
    count=1
    #
    while read line
    do
    echo "Line #$count: $line"
    count=$[ $count + 1 ]
    done


$ ./test12
Line #1: in khate avale file hastesh
Line #2: in khate dovome file hastesh
Line #3: in khate sevome file hastesh


    ساختن فایل دیسکریپتر های متعلق به خودتون :

    وقتی ورودی یا خروجی اسکریپت رو کنترل میکنید محدود به استفاده از سه نوع نام برده نیستید 

    فایل دیسکریپتر های شماره 3 تا هشت هم اماده استفاده در اسکریپتتون هستند
    شما میتونید هرکدوم از اونا رو برای هدایت ورودی و خروجی به یک فایل استفاده کنید , مثال :

$ cat test13
#!/bin/bash
# estefade az file descriptor alternative
#
    exec 3>test13out
    #
    echo "in payam bayad dar monitor chap beshe"
    echo "va in yeki bayad dar file zakhire beshe" >&3
    echo "amma in payam bayad mojadadan dar monitor dide beshe"
  
  
$ ./test13
in payam bayad dar monitor chap beshe
amma in payam bayad mojadadan dar monitor dide beshe
  
$ cat test13out
va in yeki bayad dar file zakhire beshe


    همچنین میتونید به فایل مقدار اضافه کنید :

    exec 3>> test13out


    نکته مهم برگردوندن مسیر پیشفرض فایل دیسکریپتر های استاندارد هستش

    برای این کار قبل از ریدایرکت کردن نوع استاندارد , از یک دیسکریپتر ثانویه برای هدایت به نوع استاندارد استفاده میکنیم , مثال زیر رو ببینید :

$ cat test14
#!/bin/bash
# zakhire kardane STDOUT, va bazgashte dobare behesh
#
    exec 3>&1
    exec 1>test14out
    #
    echo "in payam bayad dar file zakhire beshe"
    echo "hamrah ba in yeki payam"
    #
    exec 1>&3
    #
    echo "ama alan oza be halate normal bargashte"
   
   
$ ./test14
ama alan oza be halate normal bargashte
   
$ cat test14out
in payam bayad dar file zakhire beshe
hamrah ba in yeki payam


    پایان قسمت دوازدهم از بخش دوم

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

    بخش دوم - قسمت سیزدهم


    ادامه ایجاد فایل دیسکریپتر های الترناتیو :

    شما میتونید همونطور که در قسمت قبل خروجی الترناتیو تعریف کردید , فایل دیسکریپتر های الترناتیو برای ورودی تعریف کنید , مثال زیر رو ببینید :

$ cat test15
#!/bin/bash
# redirect kardane file descriptor voroodi
    #
    exec 6<&0
    #
    exec 0< testfile
    #
    count=1
    while read line
    do
    echo "Line #$count: $line"
    count=$[ $count + 1 ]
    done
    exec 0<&6
    read -p "karetoon anjam shod ? " answer
    case $answer in
    Y|y) echo "bye";;
    N|n) echo "inja ghesmate akhare";;
    esac
   
   
$ ./test15
Line #1: in khate avale
Line #2: in khate dovome
Line #3: in khate sevome
karetoon anjam shod ? y
bye


    همچنین شما میتونید یک فایل دیسکریپتر برای دریافت دیتا از یک فایل , و همچنین ارسال دیتا بهش ایجاد کنید 

    در این متد شل از یک اشاره گر داخل فایل استفاده میکنه تا محل کنونی برای ادامه فعالیت مشخص باشه , مثال :

$ cat test16
#!/bin/bash
# teste ijade file descriptor baraye voroodi va khorooji
#
    exec 3<> testfile
    read line <&3
    echo "Read: $line"
    echo "in yek teste" >&3
  
  
$ cat testfile
in khate avale
in khate dovome
in khate sevome
 
 
$ ./test16
Read: in khate avale
 
 
$ cat testfile
in khate avale
in yek teste
in khate sevome


    به خط دوم داخل فایل , یا همون خروجی اسکریپتمون دقت کردید ؟
    وقتی ما با دستور read خط اول فایل رو چاپ کردیم اشاره گر داخل فایل برای نشون دادن محل کنونی به شل , در محل اولین کاراکتر در خط دوم قرار گرفته , به همین دلیل وقتی خواستیم خروجی به فایل اضافه کنیم , مقدار خروجی روی خط دوم فایل نوشته و جایگزین شده

    وقتی قصد استفاده موازی از یک فایل رو دارید باید حتما به این نکته توجه کنید

    همچنین برای بستن یک فایل دیسکریپتر از دستور زیر همراه با شماره مورد نظر استفاده کنید , دستور و مثال :

    exec 3>&-
  
  
$ cat badtest
#!/bin/bash
# teste bastane file descriptor ha
#
    exec 3> test17file
    #
    echo "in yek teste" >&3
    #
    exec 3>&-
    #
    echo "injoori kar nemikone" >&3
   

$ ./badtest
./badtest: 3: Bad file descriptor


    دیدید که به دلیل بسته بودن ارتباط دستور چاپ باعث شد ارور به وجود بیاد
    و خود ارور هم مبنی بر اینه که فایل دیسکریپتر استفاده شده ارجاع نشده

    نکته بعدی که باید در نظر داشته باشید اینه که ارجاع یک فایلی که وجود داره , باعث نوشتن روی دیتا های اون فایل میشه , مثال :

$ cat test17
#!/bin/bash
#
    exec 3> test17file
    echo "in yek teste" >&3
    exec 3>&-
    #
    cat test17file
    #
    exec 3> test17file
    echo "in teste dovome" >&3
 
 
$ ./test17
in yek teste
   
   
$ cat test17file
in teste dovome


    برای لیست کردن فایل دیسکریپتر ها و محل ارجاعشون از دستور lsof استفاده میکنیم :

$ /usr/sbin/lsof -a -p $$ -d 0,1,2
COMMAND   PID   USER       FD   TYPE   DEVICE  SIZE  NODE  NAME
bash      3344  rednaxela  0u   CHR    136,0         2     /dev/pts/0
bash      3344  rednaxela  1u   CHR    136,0         2     /dev/pts/0
bash      3344  rednaxela  2u   CHR    136,0         2     /dev/pts/0


    در مثال بالا از اپشن  p- برای مشخص کردن PID و از اپشن d- برای مشخص کردن فایل دیسکریپتر استفاده کردیم

    شل PID فعلی رو در متغیر محیطی $$ نگهداری میکنه , که برای مقدار دهی سریع در مثال بالا ازش استفاده کردیم , مثال استفاده در اسکریپت :

$ cat test18
#!/bin/bash
# teste lsof hamrah ba file descriptor ha
#
    exec 3> test18file1
    exec 6> test18file2
    exec 7< testfile
    #
    /usr/sbin/lsof -a -p $$ -d0,1,2,3,6,7
   
   
$ ./test18
COMMAND  PID   USER       FD  TYPE DEVICE SIZE   NODE NAME
test18   3594  rednaxela  0u   CHR  136,0        2    /dev/pts/0
test18   3594  rednaxela  1u   CHR  136,0        2    /dev/pts/0
test18   3594  rednaxela  2u   CHR  136,0        2    /dev/pts/0
18       3594  rednaxela  3w   REG  253,0    0 360712 /home/rednaxela/test18file1
18       3594  rednaxela  6w   REG  253,0    0 360715 /home/rednaxela/test18file2
18       3594  rednaxela  7r   REG  253,0   73 360717 /home/rednaxela/testfile


    بعضی وقتا قصد ندارید اسکریپتتون هیچ خروجی ای داشته باشه, مثل وقتایی که قراره بکگراند اجرا بشه 

    برای این کار شما میتونید STDERR رو ریدایرکت کنید به یک فایل مخصوص به اسم null file
    هر اطلاعاتی که شل به این فایل بفرسته از بین میره

    محل استاندارد این فایل در سیستم های لینوکس /dev/null هستش 

$ ls -al > /dev/null
$ cat /dev/null


    این یک راه برای چاپ نشدن ارور هاست , مثال زیر رو ببینید :

$ ls -al badfile test16 2> /dev/null
-rwxr--r--   1 rednaxela  rednaxela   135 Oct 29 19:57 test16*


    استفاده به عنوان ورودی :

$ cat testfile
in khate avale
in khate dovome
in khate sevome
  
$ cat /dev/null > testfile
$ cat testfile
$


    فایل های موقت :

   لینوکس از دایرکتوری tmp/ برای نگهداری فایل های موقت استفاده میکنه

    همچنین دستور مخصوصی برای ساخت این فایل ها قرار داده

mktemp


    و فایل های ساخته شده میتونن در دایرکتوری مخصوص نگه داری بشن

    ضمنا فایل های ساخته شده از umask پیشفرض تبعیت نمیکنن , این فایل ها دسترسی خوندن و نوشتن و فقط برای صاحب فایل در حالت پیشفرض قرار میدن

    برای ایجاد فایل از دستور مربوطه همراه با شش حرف اکس جلوی اسم فایل استفاده میکنیم
    که این حروف با شش کاراکتر برای اطمینان از واحد بودن اسم فایل جایگزین میشن , مثال زیر رو ببینید :

$ mktemp testing.XXXXXX
$ ls -al testing*
-rw-------   1 rednaxela  rednaxela    0 Oct 17 21:30 testing.UfIi13

 

    شما میتونید با خیال راحت تعداد زیادی فایل با یک اسم تعریف کنید :

$ mktemp testing.XXXXXX
testing.1DRLuV
$ mktemp testing.XXXXXX
testing.lVBtkW
$ mktemp testing.XXXXXX
testing.PgqNKG
  

$ ls -l testing*
-rw-------    1 rednaxela  rednaxela    0 Oct 17 21:57 testing.1DRLuV
-rw-------    1 rednaxela  rednaxela    0 Oct 17 21:57 testing.PgqNKG
-rw-------    1 rednaxela  rednaxela    0 Oct 17 21:30 testing.UfIi13
-rw-------    1 rednaxela  rednaxela    0 Oct 17 21:57 testing.lVBtkW


    برای استفاده از این دستور در اسکریپت شما میتونید اسم فایل ساخته شده رو در یک متغیر برای دسترسی راحت قرار بدید , مثال زیر :

$ cat test19
#!/bin/bash
# ijad va estefade az yek temp file
#
    tempfile=$(mktemp test19.XXXXXX)
    #
    exec 3>$tempfile
    #
    echo "in script dar temp file neveshte mishe : $tempfile"
    echo "in khate avale" >&3
    echo "in khate dovome" >&3
    echo "in khate akhare" >&3
    exec 3>&-
    #
    echo "sakhte temp file tamoome, mohtava:"
    cat $tempfile
    rm -f $tempfile 2> /dev/null
   
   
$ ./test19
in script dar temp file neveshte mishe : test19.vCHoya
sakhte temp file tamoome, mohtava:
in khate avale
in khate dovome
in khate akhare


        ساخت فایل موقت در دایرکتوریه مخصوصشون tmp/

    برای این کار تنها کافیه اپشن t- رو به دستور اضافه کنیم
    وقتی با این روش فایل ساخته بشه خروجی دستور مسیر کامل فایله نه فقط اسمش :

$ mktemp -t test.XXXXXX
/tmp/test.xG3374
$ ls -al /tmp/test*
-rw------- 1 rednaxela rednaxela 0 2019-10-29 18:41 /tmp/test.xG3374


    یک مثال پویا تر :

$ cat test20
#!/bin/bash
# injade temp file dar /tmp
#
    tempfile=$(mktemp -t tmp.XXXXXX)
    #
    echo "in yek file teste" > $tempfile
    echo "in dovomin khat az file teste" >> $tempfile
    echo "mahale negahdarie tmp file: $tempfile"
    cat $tempfile
    rm -f $tempfile
  
  
$ ./test20
mahale negahdarie tmp file: /tmp/tmp.Ma3390
in yek file teste
in dovomin khat az file teste

 

    پایان قسمت سیزدهم از بخش دوم

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

بخش دوم - قسمت چهاردهم


    ساخت یک tmp directory :

    اپشن d- به دستور میگه به جای یک فایل , یک دایرکتوری ایجاد کنه

$ cat test21
#!/bin/bash
# estefade az yek temporary directory
#
    tempdir=$(mktemp -d dir.XXXXXX)
    cd $tempdir
    tempfile1=$(mktemp temp.XXXXXX)
    tempfile2=$(mktemp temp.XXXXXX)
    #
    exec 7> $tempfile1
    exec 8> $tempfile2
    #
    echo "ersale data be directory: $tempdir"
    echo "yek teste data baraye $tempfile1" >&7
    echo "yek teste data baraye $tempfile2" >&8
  
  
$ ./test21
ersale data be directory: dir.ouT8S8
$ ls -al
total 72
drwxr-xr-x    3 rednaxela  rednaxela    4096 Oct 17 22:20 ./
drwxr-xr-x    9 rednaxela  rednaxela    4096 Oct 17 09:44 ../
drwx------    2 rednaxela  rednaxela    4096 Oct 17 22:20 dir.ouT8S8/
-rwxr--r--    1 rednaxela  rednaxela      338 Oct 17 22:20 test21*
 

$ cd dir.ouT8S8
[dir.ouT8S8]$ ls -al
total 16
drwx------    2 rednaxela  rednaxela    4096 Oct 17 22:20 ./
drwxr-xr-x    3 rednaxela  rednaxela    4096 Oct 17 22:20 ../
-rw-------    1 rednaxela  rednaxela      44 Oct 17 22:20 temp.N5F3O6
-rw-------    1 rednaxela  rednaxela      44 Oct 17 22:20 temp.SQslb7
    
    
[dir.ouT8S8]$ cat temp.N5F3O6
yek teste data baraye temp.N5F3O6
 
[dir.ouT8S8]$ cat temp.SQslb7
yek teste data baraye temp.SQslb7
    
[dir.ouT8S8]$


    بعضی وقتا لازمه خروجی رو , هم به مانیتور و هم به یک فایل برای لاگ برداری بفرستیم

    به جای اینکه خروجی رو دو بار ریدایرکت کنیم , میتونیم از دستور tee استفاده کنیم
    این دستور مثل یک T - connector برای پایپ ها عمل میکنه , که دیتا رو از STDIN به دو مقصد ارسال میکنه

$ date | tee testfile
Sun jun 19 18:56:21 EDT 2020


$ cat testfile
Sun jun 19 18:56:21 EDT 2020


    دیدید که خروجی دستور همزمان در مانیتور و فایل مورد نظر ذخیره شد

    نکته مهم استفاده از دستور در حالت پیشفرضه که باعث میشه دیتا ها روی هم نوشته بشن : 

$ who | tee testfile
rednaxela     pts/0        2020-5-17 18:41 (192.168.1.2)
  

$ cat testfile
rednaxela     pts/0        2020-5-17 18:41 (192.168.1.2)

 

    اگه میخواید دیتای جدید به جای جایگزین شدن به فایل اضافه بشه از اپشن a- استفاده کنید

$ date | tee -a testfile
Sun jun 19 18:58:05 EDT 2020
  

$ cat testfile
rednaxela     pts/0        2020-5-17 18:41 (192.168.1.2)
Sun jun 19 18:58:05 EDT 2020


    استفاده از این تکنیک برای ذخیره اطلاعات و نمایش همزمان به کاربر :

$ cat test22
#!/bin/bash
# estefade az dastoore tee baraye logging
#
    tempfile=test22
    #
    echo "inja test shoroo mishe" | tee $tempfile
    echo "in khate dovome teste" | tee -a $tempfile
    echo "inja payane teste" | tee -a $tempfile
  

$ ./test22
inja test shoroo mishe
in khate dovome teste
inja payane teste
  

$ cat test22file
inja test shoroo mishe
in khate dovome teste
inja payane teste

    

سیگنال ها :

    لینوکس از سیگنال ها برای تعامل با پروسه های در حال اجرا استفاده میکنه
    مثل نمونه هایی که در قسمت های اولیه بخش اول مشاهده کردید , اعم از قطع , وصل و متوقف کردن پروسه ها

    شما میتونید با کد نویسی داخل اسکریپتتون بهش بگید با دریافت هر سیگنال چه کاری انجام بده , و به این ترتیب وقتی اسکریپت در حال اجراست با سیگنال های ارسالی کنترلش کنید

    بیشتر از 30 سیگنال برای تولید توسط سیستم و اپلیکیشن ها در لینوکس تعریف شده , که ما چند نمونه از پر استفاده ترین هاشون در اسکریپت نویسی رو در لیست زیر میبینیم :


    1     SIGHUB
    معلق کردن پروسه

    2     SIGINT
    قطع کردن پروسه

    3     SIGQUIT
    متوقف کردن پروسه

    9     SIGKILL
    حذف پروسه

    15    SIGTERM
    ترمینیت کردن پروسه در صورت امکان

    17    SIGSTOP
    استاپ کردن پروسه

    18    SIGTSTP
    استاپ یا پاز کردن پروسه

    19    SIGCONT
    ادامه دادن پروسه متوقف شده

 

    ایجاد سیگنال ها :

    شل بش به شما این امکان رو میده که سیگنال های ارسالی با استفاده از کلید های ترکیبی کیبورد رو تعریف کنید , این امکان مواقعی به کار میاد که مثلا میخواید یک اسکریپت در حال اجرا رو استاپ کنید

    کلید های ترکیبی Ctrl + C یک سیگنال از نوع SIGINT میسازن و سیگنال ساخته شده رو به پروسه در حال اجرای فعلی ارجاع میدن

    شما میتونید اینو روی یک دستور که در حالت نرمال زمان زیادی میگیره امتحان کنید, مثال :

    $ sleep 100
    ^C
    $


    یا مثلا کلید های ترکیبی Ctrl + Z به جای نمونه قبلی یرای توقف موقت پروسه نه قطع کردنش , که این کار با ارسال سیگنال SIGTSTP انجام میشه

    $ sleep 100
    ^Z
    [1]+  Stopped                 sleep 100
    $


    به خروجی نمونه دوم که دقت کنید , قسمت اول یک عدد بین براکت هاست که جاب نامبر تعریف شده توسط شل هستش , که این اعداد منحصر به فرد هستند و برای دسترسی و کنترل پروسه کاربرد دارن , که به ترتیب از یک شروع میشن , مثلا اگه الان شما یک پروسه دیگه رو استاپ کنید شماره جاب 2 بهش تعلق میگیره

    در این حالت اگه شما بخواید شل رو ببندید به خاطر جلوگیری از منحل شدن فرایند پشت پرده شل بهتون هشدار میده در مورد عواقب بسته شدنش , مثال :

$ sleep 100
^Z
[1]+  Stopped                 sleep 100
$ exit
exit
There are stopped jobs.
$


    همچنین شما میتونید قبل از خروج از دستور ps برای دیدن پروسه ها استفاده کنید :

$ sleep 100
^Z    [1]+  Stopped               sleep 100   
$    
$ ps -l
F S UID   PID  PPID  C PRI NI ADDR SZ WCHAN  TTY       TIME CMD
0 S 501  2431  2430  0  80  0 - 27118 wait   pts/0 00:00:00 bash
0 T 501  2456  2431  0  80  0 - 25227 signal pts/0 00:00:00 sleep
0 R 501  2458  2431  0  80  0 - 27034 -      pts/0 00:00:00 ps



    ستون S در خروجی دستور وضعیت پروسه رو اعلام میکنه
    اگه با این حال هنوز قصد خروج از شل رو دارید کافیه یک بار دیگه دستور exit رو تایپ کتید
    و یا الان که پروسه ایدی هارو میبینید با استفاده از دستور kill یک سیگنال SIGKILL به پروسه ای که قصد از بین بردنش رو دارید بفرستید :

$ kill -9 2456
$
[1]+  Killed                 sleep 100

 
    شما میتونید به جای اینکه سیگنال هارو مدیریت نشده ازاد بزارید تا روی اسکریپت در حال اجراتون تاثیر بزارن , قدرت اجراییشون رو ازشون بگیرید

    این کار با استفاده از دستور trap انجام میشه , و فرمت استفاده ازش به این صورته :

   trap commands signals


    به این صورت که شما در قسمت کامندز دستوراتی که میخواید شل اجرا کنه رو مینویسید , و با یک فاصله اسم و یا شماره ی سیگنال هایی که قصد دارید ترپ بشن رو تایپ میکنید , مثال زیرو ببینید :

$ cat test1.sh
#!/bin/bash
# Teste signal trapping
#
    trap "echo ' signale marboot be Ctrl-C trap shode '" SIGINT
    #
    echo "in ye teste script hastesh"
    #
    count=1
    while [ $count -le 10 ]
    do
    echo "Loop #$count"
    sleep 1
    count=$[ $count + 1 ]
    done
    #
    echo "in payane teste script hastesh"
  
  
$ ./test1.sh
in ye teste script hastesh
Loop #1
Loop #2
Loop #3
Loop #4
Loop #5
' signale marboot be Ctrl-C trap shode '
Loop #6
Loop #7
Loop #8
' signale marboot be Ctrl-C trap shode '
Loop #9
Loop #10
in payane teste script hastesh


    در خروجی اسکریپت مثال بالا  مشاهده کردید که قدرت اجرایی سیگنال مربوط به کلید های ترکیبی Ctrl + C که مرتبط با قطع روند پروسه محسوب میشه , ازش گرفته شده

    و هر بار که از این کلید های ترکیبی برای قطع پروسه استفاده شده , به جای عمل پیشفرض , دستور ما که اینجا یک دستور چاپ بوده اجرا شده و اسکریپت تا اخر به کارش ادامه داده


    پایان قسمت چهاردهم از بخش دوم

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

بخش دوم - قسمت پانزدهم


    خوب دوستان میریم سمت ادامه بحث سیگنال ها و Trapping :

    در Trap کردن Script Exit شما به جای استفاه از این تکنیک در اسکریپتتون , در پایان فرایند اسکریپت ازش استفاده میکنید
    که یعنی به محض اتمام فرایند اسکریپت , دستور ما اجرا میشه , برای این کار سیگنال EXIT رو به دستور Trap میدیم , مثال :

$ cat test2.sh
#!/bin/bash
# Trap kardane script exit
#
    trap "echo Goodbye..." EXIT
    #
    count=1
    while [ $count -le 5 ]
    do
    echo "Loop #$count"
    sleep 1
    count=$[ $count + 1 ]
    done
  

$ ./test2.sh
Loop #1
Loop #2
Loop #3
Loop #4
Loop #5
Goodbye...


    همونطور که مشاهده کردید با پایان کار اسکریپت دستور ما اجرا شد , این اتفاق میتونه در صورت اجبار اسکریپت به اتمام هم رخ بده :

$ ./test2.sh
Loop #1
Loop #2
Loop #3
^CGoodbye...


    برای مدیریت Trap مشخص شده , در بخش های بعدی اسکریپت , به راحتی میتونید با مقادیر جدید در ادامه اسکریپت Trap رو تغیر بدید , مثال :

$ cat test3.sh
#!/bin/bash
# Modiriyate trap
#
    trap "echo ' khata... Ctrl-C trap shode'" SIGINT
    #
    count=1
    while [ $count -le 5 ]
    do
    echo "Loop #$count"
    sleep 1
    count=$[ $count + 1 ]
    done
    #
    trap "echo ' trap modiriyat shod'" SIGINT
    #
    count=1
    while [ $count -le 5 ]
    do
    echo "Loop 2 #$count"
    sleep 1
    count=$[ $count + 1 ]
    done


    تغیرات توضیح داده شده رو میتونید در خروجی اسکریپت ببینید :

$ ./test3.sh
Loop #1
Loop #2
Loop #3
khata... Ctrl-C trap shode
Loop #4
Loop #5
Loop 2 #1
Loop 2 #2
trap modiriyat shod
Loop 2 #3
Loop 2 #4
Loop 2 #5


    شما همچنین میتونید با اضافه کردن ( - ) یا ( -- ) و سیگنال مورد نظر Trap مرتبط رو پاکسازی کنید , و رفتار سیگنال رو به حالت پیشفرض تغیر بدید , مثال :

$ cat test3b.sh
#!/bin/bash
# Trap Removing
#
    trap "echo ' khata... Ctrl-C Trap shode'" SIGINT
    #
    count=1
    while [ $count -le 5 ]
    do
    echo "Loop #$count"
    sleep 1
    count=$[ $count + 1 ]
    done
    #
    # hala Trap ro remove mikonim
    #
    trap -- SIGINT
    echo "alan Trap remove shode"
    #
    count=1
    while [ $count -le 5 ]
    do
    echo "Loop 2 #$count"
    sleep 1
    count=$[ $count + 1 ]
    done
   
   
$ ./test3b.sh
Loop #1
Loop #2
Loop #3
Loop #4
Loop #5
alan Trap remove shode
Loop 2 #1
Loop 2 #2
Loop 2 #3
^C
  
  
$ ./test3b.sh
Loop #1
Loop #2
Loop #3
khata... Ctrl-C Trap shode
Loop #4
Loop #5
alan Trap remove shode
Loop 2 #1
Loop 2 #2
^C

 

    اجرای اسکریپت در حالت بک گراند :

    بعضی وقتا اجرای اسکریپت در کامند لاین به صرفه نیست , مثلا وقتی فرایند اسکریپت زمان زیادی میبره , شما میتونید با اجرای اسکریپت درحالت بک گراند همون موقع کنترل کامند لاین رو دوباره به دست بیارید , بدون اینکه منتظر اتمام اسکریپت باشید , و اسکریپت هم پشت پرده به کارش ادامه میده


    برای اینکه به شل دستور بدید اسکریپتتون رو در حالت بک گراند اجرا کنه کافیه علامت ( & ) رو بعد از دستور قرار بدید , مثال :

$ cat test4.sh
#!/bin/bash
# Teste ejraye script dar halate background
#
    count=1
    while [ $count -le 10 ]
    do
    sleep 1
    count=$[ $count + 1 ]
    done
 
 
$ ./test4.sh &
    [1] 3231


    میبینید که خروجی job number و PID بعد از زدن اینتر داده میشه , که عدد داخل براکت ها شماره جاب و کد بعد از اون ایدی پروسه هستش
    و بدون معطلی برای اتمام فرایند اسکریپت ، کنترل شل به دست شما برمیگرده ( ولی اسکریپت در حالت اجرا قرار داره )

    بعد از اینکه فرایند اسکریپت در حال اجرا ( در بک گراند ) به اتمام برسه , یه پیام مشابه کد زیر نمایش داده میشه , که شامل job number , job status و اسم پروسه ای که در حالت بک گراند اجرا شده بود هستش :

   [1]   Done                    ./test4.sh

 
    توجه داشته باشید که وقتی پروسه ای در حالت بک گراند داره اجرا میشه , همچنان برای STDOUT و STDERR از مانیتور استفاده میکنه , مثال :

$ cat test5.sh
#!/bin/bash
# Teste ejra dar background hamrah ba khorooji
#
    echo "shorooe scripte test"
    count=1
    while [ $count -le 5 ]
    do
    echo "Loop #$count"
    sleep 5
    count=$[ $count + 1 ]
    done
    #
    echo "etmame teste script"
 
 
$ ./test5.sh &
[1] 3275
shorooe scripte test
Loop #1
Loop #2
Loop #3
Loop #4
Loop #5
etmame teste script
[1]   Done                    ./test5.sh


    به همین دلیل وقتی خروجیه اسکریپت در حال چاپ شدنه شما میتونید بدون تداخل با فرایند اسکریپت دستورات خودتونو اجرا کنید , مثال :

$ ./test5.sh &
[1] 3319
$ shorooe scripte test
Loop #1
Loop #2
Loop #3
ls myprog*
myprog   myprog.c
$ Loop #4
Loop #5
etmame teste script
[1]+  Done                   ./test5.sh


    شما میتونید در همون تایم تعداد بیشتری پروسه رو وارد حالت بک گراند کنید , مثال :

$ ./test6.sh &
[1] 3568
$ in yek Scripte teste #1
  
$ ./test7.sh &
[2] 3570
$ in yek Scripte teste #2
 
$ ./test8.sh &
[3] 3573
$ va yek Scripte teste dg

$ ./test9.sh &
[4] 3576
$ va baz ham yek Scripte teste dg


    میبینید که با هر بار فرستادن پروسه ها به بک گراند , یک جاب نامبر و پروسه ایدی جدید برای هر پروسه چاپ شد , که میتونید با دستور ps لیستشون کنید :

$ ps
    PID  TTY          TIME CMD
    2431 pts/0    00:00:00 bash
    3568 pts/0    00:00:00 test6.sh
    3570 pts/0    00:00:00 test7.sh
    3573 pts/0    00:00:00 test8.sh
    3574 pts/0    00:00:00 sleep
    3575 pts/0    00:00:00 sleep
    3576 pts/0    00:00:00 test9.sh
    3577 pts/0    00:00:00 sleep
    3578 pts/0    00:00:00 sleep
    3579 pts/0    00:00:00 ps


    پایان قسمت پانزدهم از بخش دوم

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

    بخش دوم - قسمت شانزدهم

( قسمت اخر از بخش دوم )


    ادامه اجرای اسکریپت حتی بعد از بستن ترمینال :

    بعضی وقتا شما یک اسکریپت رو در یک ترمینال اجرا میکنید و اجازه میدید تا پایان کارش در حالت بک گراند به فعالیت ادامه بده , حتی اگه سیشن ترمینال رو ببندید , این عمل با استفاده از دستور nohub قابل اجراست

    این دستور یک بلاک کننده دستور اجرا میکنه که جلوی سیگنال SIGHUB در صورت ارسال گرفته بشه , این کار باعث عدم جلوگیری از ادامه فرایند اسکریپت بعد از بستن سیشن ترمینال میشه

    فرمت استفاده از دستور :

$ nohup ./test1.sh &
[1] 3856
$ nohup: ignoring input and appending output to 'nohup.out'


    به دلیل اینکه بعد از کاربردی شدن دستور فوق دیگه ترمینالی برای تعامل و مخصوصا خروجی وجود نداره , تمام مقادیر STDOUT و STDERR اسکریپت مستقیما ارجاع داده میشه به فایلی به نام nohub.out 

    در صورت استفاده مکرر از متد بالا تمامی خروجی های اسکریپت ها به همون فایل ساخته شده ارجاع داده میشن , بنابراین مواضب اجرای اسکریپت های مختلف به این روش ( در یک دایرکتوری ) باشید , ممکنه نتایج گمراه کننده بشن

$ cat nohup.out
in yek Scripte teste
Loop 1
Loop 2
Loop 3
Loop 4
Loop 5
Loop 6
Loop 7
Loop 8
Loop 9
Loop 10
payane teste Script


    کنترل کرن جاب ها :

    قبل تر شما نمونه ای از این کارو مشاهده کردید ( Ctrl + C ) که باعث جلوگیری از ادامه روند پروسه میشد , که بعدش شما میتونستید پروسه رو kill یا restart کنید

    در کل استفاده از function های start , stop , kill رو job Control مینامیم , با جاب کنترل شما کنترل کامل روی پروسه های در حال اجرای محیط شل دارید

    کلید اصلی برای job controling دستور jobs هستش , که باعث میشه شما جاب های فعال در شل رو ببینید :

$ cat test10.sh
#!/bin/bash
# Teste job control
    #
    echo "Script Process ID: $$"
    #
    count=1
    while [ $count -le 10 ]
    do
    echo "Loop #$count"
    sleep 10
    count=$[ $count + 1 ]
    done
    #
    echo "payane script..."


    توجه داشته باشید ( $$ ) نگه دارنده ی مقدار پروسه ی فعلی هستش ( خود اسکریپت به محض اجرا ) شما میتونید از کلید های ترکیبی Ctrl + Z برای stop کردن پروسه استفاده کنید :

$ ./test10.sh
Script Process ID: 1897
Loop #1
Loop #2
^Z
[1]+  Stopped                 ./test10.sh
$


    دوباره همون اسکریپتو اجرا میکنیم , این بار در بک گراند همراه با هدایت خروجی :

$ ./test10.sh > test10.out &
[2] 1917
$


     حالا وضعیت رو با تفاوت جاب ها میتونیم ببینیم :

$ jobs
[1]+  Stopped                 ./test10.sh
[2]-  Running                 ./test10.sh > test10.out &


    میتونیم با اپشن l- پروسه ایدی هاشون هم ببینیم :

$ jobs -l
[1]+  1897 Stopped               ./test10.sh
[2]-  1917 Running               ./test10.sh > test10.out &


    این دستور اپشن های دیگه ای هم داره که چند تا از پر کاربرد هاشون رو براتون میزارم :

    l-
    نمایش pid همراه با job number

    n-
    فقط جاب هایی رو لیست میکنه که وضعیتشون نسبت به اخرین وضعیتی که شل نمایش داده بود تغیر کرده

    p-
    فقط pid های جاب هارو نمایش میده

    r-

    فقط جاب های در حال اجرا رو نمایش میده


    s-
    فقط جاب های stop شده رو نمایش میده


    وقتی جاب هارو نمایش میدیم کنار دوتا از جاب ها علامت های مثبت و منفی داخل براکت قرار داره , که میتونن جالب باشن 

    جابی که کنارش علامت مثبت قرار داره جاب پیشفرض محسوب میشه و جابی که کنارش علامت منفی قرار داره جانشین جاب پیشفرض محسوب میشه , مثال زیرو ببینید :

$ ./test10.sh > test10a.out &
    [1] 1950
 

$ ./test10.sh > test10b.out &
    [2] 1952
 

$ ./test10.sh > test10c.out &
    [3] 1955
    

$ jobs -l
[1]   1950 Running              ./test10.sh > test10a.out &
[2]-  1952 Running              ./test10.sh > test10b.out &
[3]+  1955 Running              ./test10.sh > test10c.out &
 
 
$ kill 1955
[3]+  Terminated               ./test10.sh > test10c.out
  
  
$ jobs -l
[1]-  1950 Running              ./test10.sh > test10a.out &
[2]+  1952 Running              ./test10.sh > test10b.out &
  
  
$ kill 1952
[2]+  Terminated               ./test10.sh > test10b.out
   
   
$ jobs -l
[1]+  1950 Running             ./test10.sh > test10a.out &


    در جاب کنترل شما میتونید جاب های استاپ شده رو چه در بک گراند چه در حالت نرمال ری  استارت کنید

    برای شروع مجدد یک جاب در حالت بک گراند از دستور bg استفاده میکنیم , مثال :

$ ./test11.sh
^Z
[1]+  Stopped                 ./test11.sh

    
$ bg
[1]+ ./test11.sh &
    
    
$ jobs
[1]+  Running                ./test11.sh &


    مشاهده کردید که به دلیل اینکه جاب مورد نظر جاب پیشفرض بود دستور bg خودش جاب رو شناسایی کرد

    در حالت های دیگه باید از شماره جاب برای مشخص کردنش استفاده کنید , مثال :

$ ./test11.sh
^Z
[1]+  Stopped                 ./test11.sh
  
  
$ ./test12.sh
^Z
[2]+  Stopped                 ./test12.sh
  
  
$ bg 2
[2]+ ./test12.sh &
  
  
$ jobs
[1]+  Stopped                 ./test11.sh
[2]-  Running                 ./test12.sh &


    برای شروع مجدد جاب استاپ شده در حالت نرمال به جای بک گراند میتونید از دستور fg استفاده کنید :

$ fg 2
./test12.sh
payane script...
$


    در سیستم های multitasking مثل لینوکس , کرنل موظفه CPU time هر پروسه رو مشخص کنه , که بر اساس یک مقدار عددی از 20- تا 20+ مقدار دهی میشه ، که مقدار پیشفرض برای پروسه های اجرا شده توسط شل بش 0 قرار داره

    نکته مهم در مورد درجه های تنظیم گفته شده برعکس بودنشونه , به این صورت که هرچی عدد پایین تر یا زیر صفر منفی تر باشه , اولویت بالاتری تنظیم میشه 

    برای تغیر مقدار پیشفرض یک پروسه از دستور nice استفاده میکنیم

    برای اینکه یک دستور با مقدار اولویت متفاوتی اجرا بشه از اپشن n- برای دستور nice استفاه میکنیم و عدد مورد نظر رو قرار میدیم , مثال :

$ nice -n 10 ./test4.sh > test4.out &
[1] 4973

    
$ ps -p 4973 -o pid,ppid,ni,cmd
    PID   PPID  NI  CMD
    4973  4721  10  /bin/bash ./test4.sh


    در خروجی دستور ps و در ستون ni مقدار تغیر داده شده رو مشاهده میکنید

    اما اگه بخواید مقدار اولویت رو افزایش بدید ( عدد کمتر یا منفی ) با پیام زیر مواجه میشید :

$ nice -n -10 ./test4.sh > test4.out &
[1] 4985
  
$ nice: cannot set niceness: Permission denied
[1]+  Done            nice -n -10 ./test4.sh > test4.out


    دستور nice به یوزر های معمولی اجازه افزایش اولویت رو نمیده , عدم موفقیت در مثال بالا به این دلیل بود , اما با این حال میبینید که جلوی اجرای دستور گرفته نشده

    شما میتونید به جای استفاده از اپشن n- فقط از کاراکتر ( - ) قبل از عدد مربوط به سطح اولویت استفاده کنید , مثال :

$ nice -10 ./test4.sh > test4.out &
[1] 4993
    
    
$ ps -p 4993 -o pid,ppid,ni,cmd
    PID   PPID  NI  CMD
    4993  4721  10  /bin/bash ./test4.sh


    متوجه گمراه کنندگی موضوع در این سبک از استفاده شدید ؟

    عدد مورد نظر چون بعد از علامت دش قرار گرفته با عدد منفی اشتباه گرفته میشه , در صورتی که در ستون ni در خروجی دستور ps عدد مثبت قرار داره

و برای مقدار دهی منفی باید از دو علامت دش استفاده بشه , حالا این موضوع به اضافه ی برعکس بودن عدد اولویت دهی میتونه کاملا گمراه کننده باشه , به همین دلیل سعی کنید خیلی ساده از همون اپشن n- استفاده کنید

    تا اینجا ما مقدار دهی رو هنگام اجرای دستور یا اسکریپت اعمال کردیم , اما اگه بخوایم مقدار اولویت دستوری که در حال اجراست رو تغیر بدیم چی ؟ یا مثلا بخوایم از مقداری که دادیم صرف نظر کنیم و مقدار رو افزایش یا کاهش بدیم ؟

اینجا از دستور renice استفاده میکنیم 

    طرز استفاده به همون شکله ولی چون خود دستور یا اسکریپت قبلا اجرا شده از پروسه ایدی ابجکت برای تغیرش استفاده میکنیم , مثال زیر رو ببینید :

$ ./test11.sh &
[1] 5055
    
    
$ ps -p 5055 -o pid,ppid,ni,cmd
    PID   PPID  NI  CMD
    5055  4721   0  /bin/bash ./test11.sh
    
    
$ renice -n 10 -p 5055
5055: old priority 0, new priority 10
    
    
$ ps -p 5055 -o pid,ppid,ni,cmd
    PID   PPID  NI  CMD
    5055  4721  10  /bin/bash ./test11.sh


    توجه داشته باشید از اونجایی که افزایش اولویت و تغیر در پروسه های دیگر کاربر ها محدود شده , برای کنترل کامل روی ابزار از یوزر روت استفاده کنید


    پایان قسمت شانزدهم از بخش دوم

    پایان بخش دوم

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری