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

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

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


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

نویسنده موضوع: استفاده از رشته به عنوان پارامتر در zsh (حل شد)  (دفعات بازدید: 1224 بار)

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

آفلاین سید وحید رضا برهانی

  • High Hero Member
  • *
  • ارسال: 1668
  • جنسیت : پسر
  • یک مخالف نرم افزار اوپن سورس
سلام
دستورات زیر رو در نظر بگیرید:
function f()
> {
> echo $#
> }
x="1 2"
توی بش وقتی f x رو اجرا می کنید خروجی ۲ هست یعنی بش x رو به عنوان دوتا پارامتر می فرسته به f.
ولی اگر توی zsh اجرا کنید خروجی ۱ هست یعنی zsh به عنوان یک پارامتر می فرسته.
حالا چطوری باید از zsh استفاده کنم که مثل بش رفتار کنه؟
« آخرین ویرایش: 05 شهریور 1397، 03:15 ق‌ظ توسط سید وحید رضا برهانی »
نرم افزاری که نشه سیخ انگولکش کرد (به هر دلیلی چه به‌خاطر قانون و چه پیچیدگی یا توسعه سریع)نرم افزار آزاد نیست حالا مهم نیست چه بنیادی یا چه افرادی اون رو نوشته باشند یا GPL باشه یانه!
نرم افزار آزاد یک جنبش هست نه یک تیکه کاغذ پاره(GPL)
حق فهمیدن از حق خوندن مهمتره

آفلاین علی رزم دیده

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1244
  • جنسیت : پسر
  • ali76 سابق
پاسخ : استفاده از رشته به عنوان پارامتر در zsh
« پاسخ #1 : 05 شهریور 1397، 12:51 ق‌ظ »
سلام

در zsh به صورت پیش فرض تقسیم کلمات با space اتفاق نمیوفته. برای اینکه تقسیم کلمات با فاصله رو در zsh فعال کنین می تونین از راه های زیر استفاده کنین :

1.فعال کردن آپشن shwordsplit

اینجا مشابه bash تقسیم کلمات با فاصله اتفاق میوفته :
setopt shwordsplit

function f() {echo $#}
x="1 2"
f $x

2.راه دیگه استفاده از ${=x} به جای $x موقع فراخوانی تابع هستش (این ساختار آپشن shwordsplit رو فقط برای متغیر دلخواه فعال می کنه):
function f() {echo $#}
x="1 2"
f ${=x}


3.راه دیگه استفاده از آرایه به جای رشته هستش :
function f() {echo $#}
x=(1 2)
f $x


4.و راه آخر استفاده از دستور eval هستش :
function f() {echo $#}
x="1 2"
eval f $x


دلیل فعال نبودن این قابلیت هم طبق داکیومنت های خود zsh این هستش که آرایه ها کارایی بیشتری نسبت به رشته ها دارن و همین قضیه باعث شده تا توسعه دهنده های zsh ترجیح بدن این قابلیت به صورت پیش فرض غیرفعال باشه و هر کسی بخواد چنین کاری انجام بده از آرایه ها استفاده کنه نه از رشته ها.

آفلاین سید وحید رضا برهانی

  • High Hero Member
  • *
  • ارسال: 1668
  • جنسیت : پسر
  • یک مخالف نرم افزار اوپن سورس
پاسخ : استفاده از رشته به عنوان پارامتر در zsh
« پاسخ #2 : 05 شهریور 1397، 03:14 ق‌ظ »
ممنون :)
ظاهرا فقط با eval می شه یک کدی رو نوشت که توی بش و zsh یکسان اجرا بشه.
نرم افزاری که نشه سیخ انگولکش کرد (به هر دلیلی چه به‌خاطر قانون و چه پیچیدگی یا توسعه سریع)نرم افزار آزاد نیست حالا مهم نیست چه بنیادی یا چه افرادی اون رو نوشته باشند یا GPL باشه یانه!
نرم افزار آزاد یک جنبش هست نه یک تیکه کاغذ پاره(GPL)
حق فهمیدن از حق خوندن مهمتره

آفلاین علی رزم دیده

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1244
  • جنسیت : پسر
  • ali76 سابق
پاسخ : استفاده از رشته به عنوان پارامتر در zsh
« پاسخ #3 : 05 شهریور 1397، 03:02 ب‌ظ »
ممنون :)
ظاهرا فقط با eval می شه یک کدی رو نوشت که توی بش و zsh یکسان اجرا بشه.

خواهش می کنم.

بله البته بستگی به کدی هم داره که می خواید بزنید ؛ در کل راه زیاده مثلاً شما می تونین اسکریپتتون روی طوری بنویسین که اول شل رو چک کنه و اگه zsh بودش setopt shwordsplit رو به اجرا در بیاره.

if [[ -n $(readlink "/proc/$$/exe" | grep 'zsh') ]]; then
    setopt shwordsplit
fi

function f() { echo $#; }

x="1 2"
f $x


پ.ن : در عبارت بالا استفاده از $SHELL به جای /proc/$$/exe درست نیست، چون $SHELL تنها environment variable مربوط به SHELL رو نیشون می ده نه شلی که با اون اسکریپت اجرا می شه.

ولی می تونین از دستوری مثل دستور زیر هم به جای /proc/$$/exe استفاده کنین :
if [[ $(ps -p $$ -ocomm=) = "zsh" ]]; then
« آخرین ویرایش: 05 شهریور 1397، 03:54 ب‌ظ توسط علی رزم دیده »