مسائل قابلیت حمل

فصل 36- گوناگون

‎36.9‎- مسائل قابلیت حمل

 

حمل کردن یک پوسته آسانتر از حمل یک اسکریپت پوسته است.

--Larry Wall

این کتاب بویژه با اسکریپت‌نویسی Bash روی یک سیستم گنو-لینوکس سر و کار دارد. با وجود این، کاربران sh و ksh مطالب با ارزشی در اینجا خواهند یافت.

اتفاقاً، به نظر می‌رسد بسیاری از پوسته‌های مختلف و زبان‌های اسکریپت‌نویسی در حال توجه یافتن به طرف استاندارد ‎1003.2‎ ‏POSIX هستند. فراخوانی Bash با گزینه ‎--posix‎ یا درج کردن ‎set -o posix‎ در ابتدای یک اسکریپت باعث می‌شود Bash با دقت بسیار از این استاندارد پیروی نماید. یک جایگزین دیگر استفاده از سرآیند شبانگ ‎#!/bin/sh‎ به جای ‎#!/bin/bash‎ در اسکریپت است. ‎[1]‎ توجه نمایید که ‎/bin/sh‎ در لینوکس و برخی از دیگر طعم‌های یونیکس، یک link به ‎/bin/bash‎ است، و یک اسکریپت احضار شده به این روش قابلیت‌های توسعه یافته Bash را غیر فعال می‌کند.

اکثر اسکریپت‌های Bash همانطور که هستند در ksh اجرا خواهند شد، و بالعکس، چون ‎Chet Ramey‎ با فعالیت تمام مشغول انتقال ویژگی‌های ksh به آخرین نگارش‌های Bash بوده است.

روی یک ماشین یونیکس تجاری، ممکن است اسکرپیت‌هایی که از ویژگی‌های مختص گنو فرمان‌های استاندارد استفاده می‌کنند، کار نکنند. در سالهای اخیر این مشکل کم شده است، چون برنامه‌های سودمند GNU تقریباً جانشین همتاهای مالکانه‌شان، حتی روی UNIX «گران قیمت» شده‌اند. آزاد کردن کد Caldera برای بسیاری از برنامه‌های سودمند اصلی یونیکس به این رویداد شتاب داده است.

Bash دارای ویژگی‌های خاصی است که پوسته Bourne قدیمی فاقد آنهاست. از جمله این ویژگی‌ها عبارتند از:

برای یک لیست کامل، ‎Bash F.A.Q‎ را ملاحظه نمایید.

‎36.9.1‎- یک مجموعه آزمایش

اجازه بدهید برخی ناسازگاری‌های میان Bash و پوسته Bourne کلاسیک را روشن کنیم. پوسته ‎"Heirloom Bourne Shell"‎ را دانلود و نصب کرده و اسکریپت پایین را اجرا کنید، نخست با استفاده از Bash و سپس با پوسته sh کلاسیک.

مثال ‎36-23‎. مجموعه آزمایش

#!/bin/bash
# 
#                            یک مجموعه آزمایش نیمه کامل سازگاری Bash.
#  این اسکریپت را روی نگارش Bash خود یا برخی پوسته‌های دیگر اجرا کنید.

default_option=FAIL         # تست‌های زیر ناموفق می‌شوند مگر اینکه. . .

echo
echo -n "Testing "
sleep 1; echo -n ". "
sleep 1; echo -n ". "
sleep 1; echo ". "
echo

# براکت‌های دوگانه
String="Double brackets supported?"
echo -n "Double brackets test: "
if [[ "$String" = "Double brackets supported?" ]]
then
  echo "PASS"
else
  echo "FAIL"
fi

# براکت‌های دوگانه و انطباق عبارت منظم
String="Regex matching supported?"
echo -n "Regex matching: "
if [[ "$String" =~ R.....matching* ]]
then
  echo "PASS"
else
  echo "FAIL"
fi


# آرایه‌ها
test_arr=$default_option     # FAIL
Array=( If supports arrays will print PASS )
test_arr=${Array[5]}
echo "Array test: $test_arr"


# جایگزینی فرمان
csub_test ()
{
  echo "PASS"
}

test_csub=$default_option    # FAIL
test_csub=$(csub_test)
echo "Command substitution test: $test_csub"

echo

#    کامل کردن این اسکریپت تمرینی برای خوانده است.
# تست‌های مشابه فوق برای پرانتزهای دوگانه، بسط ابرو
#+             جایگزینی پردازش، و غیره اضافه کنید.

exit $?

یادداشت‌ها

[1]

یا، از آن هم بهتر، ‎#!/bin/env sh‎