یاد بگیرید چگونه تمرینهای Bash خود را در Exercism آزمایش کنید
میتوانید برای حل تمرینها از ویرایشگر آنلاین در وبسایت Exercism استفاده کنید. یا تمرینها را روی رایانهی خود دانلود کنید، آنها را بهصورت محلی حل کنید و بعد به Exercism بفرستید. بقیهی این سند دربارهی کار کردن بهصورت محلی است.
برای دانلود و فرستادن تمرینها به ابزار خط فرمان exercism نیاز دارید.
مستندات exercism cli را ببینید.
یکی از نکات آزاردهندهی ابزار پیشفرض exercism این است که بعد از دانلود یک تمرین، باید پوشه را دستی عوض کنید.
این تابع پوششی این کار را برایتان انجام میدهد؛ آن را در ~/.bashrc ذخیره کنید.
exercism () {
local out
readarray -t out < <(command exercism "$@")
printf '%s\n' "${out[@]}"
if [[ $1 == "download" && -d "${out[-1]}" ]]; then
cd "${out[-1]}" || return 1
fi
}
دقت کنید که این نمیتواند یک اسکریپت پوسته باشد؛ باید یک تابع پوسته باشد. اسکریپتهای پوسته در یک فرآیند فرزند اجرا میشوند و نمیتوانند محیط پوستهی فعلی شما (مثل پوشهی کاری جاری) را تغییر دهند.
برای test کردن در مسیر bash، از bats استفاده میکنیم.
testهای تمرین فرضی «whatever» را اینطور اجرا کنید:
cd /path/to/your/exercise_workspace/bash/whatever
bats whatever.bats
اگر میخواهید هنگام اجرای testها بهصورت محلی خروجی debug را چاپ کنید، به debug بهصورت محلی نگاه کنید.
bats-core
باید بتوانید آن را از مدیر بستهی موردعلاقهی خودتان نصب کنید:
روی macOS با Homebrew چیزی شبیه این میشود:
$ brew install bats-core
==> Downloading https://github.com/bats-core/bats-core/archive/v1.1.0.tar.gz
==> Downloading from https://codeload.github.com/bats-core/bats-core/tar.gz/v1.1.0
######################################################################## 100.0%
==> ./install.sh /usr/local/Cellar/bats-core/1.1.0
🍺 /usr/local/Cellar/bats-core/1.1.0: 13 files, 55KB, built in 4 seconds
bats هم در اکوسیستم homebrew وجود دارد.
آن را اشتباهی نصب نکنید: bats-core را نصب کنید.bats برای فدورا ۳۰ و جدیدتر بستهبندی شده است؛ میتوانید آن را اینطور نصب کنید
sudo dnf install bats
برای سایر توزیعهای لینوکس، ممکن است پیادهسازی bats که ما استفاده میکنیم بهراحتی بستهبندی نشده باشد.
بهترین راه نصب آن، نصب از سورس است.
اگر میخواهید آن را زیر /usr/local نصب کنید، اینطور عمل کنید:
git clone https://github.com/bats-core/bats-core
cd bats-core/
sudo ./install.sh /usr/local
بعد از این کار، با فرض اینکه /usr/local/bin در $PATH شما باشد، حالا میتوانید این کار را بکنید:
$ bats
Error: Must specify at least one <test>
Usage: bats [-cr] [-f <regex>] [-j <jobs>] [-p | -t] <test>...
bats [-h | -v]
...
$ git clone https://github.com/bats-core/bats-core.git
$ cd bats-core
$ ./install.sh $HOME
نکته: وقتی از مخزن قدیمی https://github.com/sstephenson/bats.git استفاده میکنید و خطایی مثل cp: cannot create symbolic link '${HOME}/bin/bats': No such file or directory میبینید، باید محتوای پوشهی bin/bats/libexec/ را دستی در ${HOME}/bin/ کپی کنید.
گزارشهایی وجود دارد که نسخههای جدیدتر bats در bash مینگویی خوب کار نمیکنند؛ پیش از اجرای اسکریپت نصب، شاید بخواهید این کار را بکنید:
$ git checkout v1.1.0
برای کمک گرفتن در معنای دستورهای مختلف assert* در testها، به مستندات کتابخانهی bats-assert مراجعه کنید.
حل کردن یک تمرین یعنی اینکه همهی testهایش قبول شوند. بهصورت پیشفرض، وقتی testها را اجرا میکنید فقط یک test (اولین test) اجرا میشود. این کار عمدی است، چون به شما اجازه میدهد فقط روی قبول شدن همان یک test تمرکز کنید. وقتی آن یکی قبول شد، میتوانید test بعدی را با کامنت کردن یا حذف کردن
[[ $BATS_RUN_SKIPPED == true ]] || skip
annotationهایی که ابتدای بقیهی testها آمدهاند فعال کنید.
برای اجرای همهی testها، از جمله آنهایی که annotation skip دارند، میتوانید متغیر محیطی BATS_RUN_SKIPPED را روی مقدار true تنظیم کنید.
یک راه برای تنظیم آن فقط برای مدت اجرای bats این است:
BATS_RUN_SKIPPED=true bats exercise_name.bats
ممکن است استفاده از یک تابع پوششی برای صرفهجویی در تایپ کردن راحت باشد:
bats() {
BATS_RUN_SKIPPED=true command bats *.bats
}
بعد testها را فقط با این دستور اجرا کنید:
bats
bats قدیمیbats-core از پیادهسازی اصلی bats فورک شد.
پروژهی sstephenson/bats پر از bug بود و رها شده بود.
مالکیت آن در سال ۲۰۱۷ واگذار شد: sstephenson/bats#150 (comment).
اگر نسخهی اصلی sstephenson/bats را نصب دارید (با bats -v بررسی کنید؛ اگر شمارهی نسخهای کمتر از 1.0 گزارش کند)، باید به bats-core روی بیاورید؛ وگرنه ممکن است با شکستهای بیتوضیح test روبهرو شوید.