آموزش‌های خط فرمانی

این وبلاگ تلاش می‌کند گامی در حد بضاعت در جهت آموزش خط فرمان و اسکریپت‌نویسی پوسته گنو-لینوکس بردارد.

آموزش‌های خط فرمانی

این وبلاگ تلاش می‌کند گامی در حد بضاعت در جهت آموزش خط فرمان و اسکریپت‌نویسی پوسته گنو-لینوکس بردارد.

ارجحیت ترکیب ‎$(...)‎‎ نسبت به `...`


چرا‎ $(...) ‎نسبت به ‎ `...` ‎  (نقل‌قول برعکس) ارجحیت دارد؟

`...` ترکیب دستوری موروثی است که فقط در پوسته‌های خیلی قدیمی ناسازگار با POSIX لازم می‌شود. چندین دلیل برای ترجیح دادن همیشگی ترکیب ‎$(...)‎ وجود دارد:

تفاوتهای مهم

  • داخل نقل‌قولهای وارونه(backticks) با ممیزهای برعکس ‎(\)‎به یک حالت نا معلوم رفتار می‌شود:
    •   $ echo "`echo \\a`" "$(echo \\a)"
        a \a
        $ echo "`echo \\\\a`" "$(echo \\\\a)"
        \a \\a
        # Note that this is true for *single quotes* too!
        $ foo=`echo '\\'`; bar=$(echo '\\'); echo "foo is $foo, bar is $bar" 
        foo is \, bar is \\
  • نقل‌قول‌های تو در تو داخل ‎$()‎ خیلی بیشتر مناسب هستند.

    •   echo "x is $(sed ... <<<"$y")"

      در این مثال، با نقل‌قول‌های اطراف ‎$y‎ به عنوان یک زوج رفتار می‌شود، به علت آن که آنها داخل ‎$()‎ هستند. این در نگاه اول مغشوش به نظر می‌آید، زیرا اکثر برنامه‌نویسان C انتظار دارند با نقل‌قول قبل از x و نقل‌قول قبل از ‎$y‎ به عنوان یک زوج رفتار بشود، اما در پوسته‌ها این درست نیست. از طرف دیگر کد زیر،

        echo "x is `sed ... <<<\"$y\"`"
      برای قابل حمل شدن نیاز به \ها در اطراف نقل‌قول‌های داخلی دارد، پوسته‌های Bourne و Korn به این \ها نیاز دارند، در حالیکه Bash و dash لازم ندارند.
  • جایگزینی‌های فرمان تو در تو را آسانتر می‌کند. مقایسه کنید:
    •   x=$(grep "$(dirname "$path")" file)
        x=`grep "\`dirname "$path"\`" file`

      بعد از دومرحله زشت‌تر و بدقواره‌تر می‌شود. ‎$()‎ زمینه کاملاً جدید نقل‌قولی را تحمیل می‌کند، به طوری که هر چیز درون جایگزینی فرمان محافظت می‌شود و می‌تواند مثل اینکه خودش به تنهایی بوده، بدون ارتباط خاص با نقل‌قول و escaping، با آن رفتار بشود.

سایر مزایا

  • تابع ‎$(...)‎ به عنوان یک بسط از لحاظ بصری واضح است. ترکیب نشانه پیشوندی $ سازگار با تمام بسط های دیگر است، که در همان زمان از چپ به راست از درون نقل‌قولهای دوگانه تفکیک می‌شوند. فقط نقل‌قولهای وارونه(backticks) مستثنی می‌باشند. این مطلب قابلیت خواندن ماشین و انسان را بهبود می‌دهد، و ترکیب دستوری نامتناقض، زبان را برای خوانندگان محسوس‌تر می‌کند.

  • مطابق بالا، اشخاص(امیدواریم)با بسط‌های نقل‌قولی دوگانه و بسط‌های جایگزینی با ترکیب دستوری معمول ‎"$..."‎ عادت داده می‌شوند. تقریباً همیشه نقل‌قولی کردن جایگزینی فرمان کار صحیحی می‌باشد، بازهم اکثریت عظیمی از نمونه‌های ‎`...`‎ پراکنده نقل‌قولی نشده پیدا می‌کنیم، شاید به دلیل اینکه آنهایی هنوز از دستور زبان موروثی استفاده می‌کنند که کمتر ورزیده هستند، یا به سبب ترکیب دستوری متفاوت آن را با سایر بسط‌ها مربوط نمی‌کنند.
    علاوه بر این، کاراکتر ‎`‎ موقعی که در مجاورت " قرار گیرد به سادگی استتار می‌شود، که حتی برای خواندن دشوارتر می‌گردد، مخصوصاً با فونت‌های کوچک یا غیر عادی.

  • backtickها همچنین به آسانی با نقل‌قول‌های منفرد اشتباه می‌شوند.

See also:


پرسش و پاسخ 82 (آخرین ویرایش ‎2013-01-24 10:53:38‎ توسط ormaaj)


نظرات 0 + ارسال نظر
ایمیل شما بعد از ثبت نمایش داده نخواهد شد