Bash skriptlari o'rniga zsh dan foydalanish tavsiya etiladi?

Menimcha, etarli kodli kodni ishlatish uchun <script> zsh o'rnatilgan

#!/usr/bin/env zsh

shebang kabi?

Yoki bu juda ko'p tizimlarda skriptlarni ishdan chiqarmaydimi?

Clarification: I’m interested in programs/scripts an end user might want to run (like on Ubuntu, Debian, SUSE, Arch &c.)

20
Umumiy Linux foydalanuvchisi.
qo'shib qo'ydi muallif Chris Gaunt, manba
WRT "umumiy Linux foydalanuvchining oxirgi foydalanuvchisi", zsh nostandart emas. Odatiy (ko'p yoki barcha distroslarda) o'rnatilgan yoki hech narsa talab qilinmaydi, shuning uchun aksariyat odamlar buni bilishmaydi.
qo'shib qo'ydi muallif Mat Kelly, manba
G'alati savol. Sizning maqsadingiz kim? Ba'zi doiralarda (Ruby-on-Rails veb-ishlab chiquvchilari) zsh boshqalarda mashhur bo'lishi mumkin (bank sektori), u deyarli eshitilmadi. Menimcha, sizga bu haqda to'g'ri maslahat kerak bo'lsa, ko'proq ma'lumot berishingiz kerak.
qo'shib qo'ydi muallif wwilkins, manba
Mening tizimlarimning any -ga o'rnatilgan zsh yo'q va men uni yagona buyruq fayli uchun o'rnatmasman. Odatda bash odatda mavjud bo'lsa-da, bashizmlardan qochish kerak.
qo'shib qo'ydi muallif fantabolous, manba

6 javoblar

Taşınabilirlik uchun, yo'q. zsh har qanday Unix yoki Unix-kabi, hatto Cygwin orqali kamida Windows-da to'planishi mumkin va Open Source Unix-ning yoqtirgan ko'pchiligi va ko'pgina tijorat maqsadlarida paketlenir, odatda standart o'rnatish.

bash on the other end is installed on GNU systems (as bash is the shell of the GNU project) like the great majority of non-embedded Linux based systems and sometimes on non-GNU systems like Apple OS/X. In the commercial Unix side, the Korn shell (the AT&T variant, though more the ksh88 one) is the norm and both bash and zsh are in optional packages. On the BSDs, the preferred interactive shell is often tcsh while sh is based on either the Almquist shell or pdksh and bash or zsh need to be installed as optional packages as well.

zsh is installed by default on Apple OS/X. It even used to be the /bin/sh there. It can be found by default in a few Linux distributions like SysRescCD, Grml, Gobolinux and probably others, but I don't think any of the major ones.

bash uchun bo'lgani kabi, o'rnatilgan versiyadagi savol va natijada mavjud xususiyatlar mavjud. Masalan, bash3 yoki zsh3 bilan tizimlarni topib olish odatiy hol emas. Bundan tashqari, zsh5 uchun hozir yozgan skriptning zsh6 bilan ishlayotganligiga kafolat yo'q, lekin ular bash kabi, .

Buyruq fayllari uchun mening fikrim: POSIX shell sintaksisini ishlatish uchun, barcha Sitsiyalarda sh deyiladi (bu /bin shart emas) va bu sintaksisini . Keyin portativlik haqida ko'p tashvishlanishga hojat yo'q. Agar bu sintaksik sizning ehtiyojingiz uchun etarlicha bo'lmasa, ehtimol sizga qobiqdan ko'proq kerak.

Keyin variantlar quyidagilar:

  • Har bir joyida joylashgan Perl (yana eski versiyalar majmui bilan chegaralanib qolishi mumkin va sukut bo'yicha o'rnatilgan Perl modullarida taxminlar qila olmaydi)
  • Skriptingiz uchun qaramlik sifatida tarjimonni va uning versiyasini (python 2.6 yoki undan yuqorisi, zsh 4 yoki undan yuqori, bash 4.2 yoki undan yuqorisi ...) belgilang yoki har bir maqsadli tizim uchun paketni yaratish yo'li bilan qo'shadi yoki ssenariyangiz bilan birga yuborilgan README faylida yoki ssenariyangizning yuqori qismida sharh sifatida kiritilgan holda yoki Bourne sintaksisida bir necha qator qo'shib, skriptingizning boshida so'ralgan tarjimonning mavjudligini tekshiradi va pulni pul bilan ta'minlaydi. bu skript uchun zsh 4.0 yoki undan yuqori bo'lishi kerak kabi aniq xatolik.
  • Sizning skriptingiz bilan birga tarjimonni yuboring (litsenziyalash natijalariga e'tibor bering), bu ham sizning har bir maqsadli operatsion tizim uchun bitta paketga muhtojligingizni anglatadi. Ba'zi tarjimonlar ssenariyni va tarjimonni bitta bajariladigan dasturda to'plash yo'li bilan uni osonlashtiradi.
  • Ushbu kompilyatsiya qilingan tilda yozing. Shunga qaramay, har bir maqsadli tizim uchun bitta paket.
27
qo'shib qo'ydi
"zsh-man" so'zi "yo'q", men siz bilan faxrlanaman! ^^ Portability ftw! (barcha ogohlantirishlar bilan ...). +1.
qo'shib qo'ydi muallif Olivier Dulac, manba

Yo'q, qilolmaysiz. Mavjud kafolatlangan narsa /bin/sh , aslida asl Bourne qobig'i hisoblanadi. Deyarli barcha ("deyarli" deb yozing!) Linux qurilmalari bashga ega bo'ladi, lekin USD tizimlarida u kamdan-kam hollarda (BSD-ning ishonchliligi GSP kodi, masalan, Bash). Men standart qobiqning Mac-da nima ekanligini bilmayman, lekin yana GPL haqida xavotirlar bor. Solaris uchun ham xuddi shunday.

zsh Mart shell, u Fedora-ning standart sozlamasida emas (va bu katta distributor uchun sukutga ishonmayman).

9
qo'shib qo'ydi
Xo'sh, "default" o'rnatish juda muhim emas. Muhim ahamiyatga ega bo'lgan narsa, u o'rnatilgan bo'lsa.
qo'shib qo'ydi muallif Chris Gaunt, manba
Qanday qilib bu niche qobig'i? Shuni aytishim mumkinki, bash va IMO modulli dizayni bilan kamida yana ko'p jihatdan har xil bo'ladi.
qo'shib qo'ydi muallif Stéphane Chazelas, manba
Shuni esda tutingki, bugungi kunda Linux-larning ko'pchilik qismi (Android, printerlar, routerlar, televizorlar, lampochkalar ... deb o'ylaysiz), Linux-asosidagi tizimlarning aksariyati yo'q > Bash (bu tizimlar, ehtimol OXning savoliga javob beradigan asosiy maqsad emas, balki)
qo'shib qo'ydi muallif Stéphane Chazelas, manba
@Profpatsch, u holda standart o'rnatish juda tegishli (ehtimol tarqatish odamlar haqiqatdan foydalanganligini aniqladi).
qo'shib qo'ydi muallif vonbrand, manba
@StephaneChazelas, "mart" ning "bir nechta foydalanuvchi buni ishlatadi"/"bir nechta qurilma bor". Bu tilsimlangan nondan boshlab eng yaxshi qobiq bo'lishi mumkin, lekin faqat kichik bir qism ishlatsa, uni hamma joyda o'rnatilishini hisoblay olmaysiz.
qo'shib qo'ydi muallif vonbrand, manba
BSD tizimlarida bash skriptlari haqida (OS Xga nisbatan boshqa ) agar esingizda bo'lsa, u holda u bash mavjud bo'lsa, odatda /bin/bash emas, shuning uchun shebang chizig'i #!/bin/bash odatda ishlamaydi. bash aslida o'rnatilgan bo'lsa, odatda #!/Usr/bin/env bash deb ishonaman.
qo'shib qo'ydi muallif German Ganz, manba
Albatta, asl Bourne Shell emas, balki Posix mos tizimlarida Posix shell emas, balki juda ko'p tizimda/bin/sh, lekin albatta (Solaris <= version 10'da/usr/xpg4/bin/sh)
qo'shib qo'ydi muallif Pepper, manba

Men, albatta, siz foydalanayotgan va qaerda foydalanayotganingizdan qat'i nazar, zsh ga bog'liq. Agar skriptingizni turli foydalanuvchilar va tizimlarga tarqatishni rejalashtirayotgan bo'lsangiz, bash yoki hatto sh ni ishlatishni taklif qilaman.

Sizning skriptingiz tashkilotingizda ijro etilishi uchun yaratilgan bo'lsa va sizning mashinalaringizda (masalan, bir xil asosiy AMI) zsh ga ega bo'lsangiz, sizning vazifangiz rivojlangan fayllar tanlovi kabi kengaytmalardan aniq foydalarga ega. yoki boshqa narsalar http://www.rayninfo.co.uk/tips/zshtips.html Men aytmoqchiman!

2
qo'shib qo'ydi

Siz deyarli kafolat berishingiz mumkin bo'lgan yagona narsa /bin/sh mavjudligidir. Bu, odatda, statik bog'langan qobiq bo'lishi mumkin yoki u boshqa qobiq bilan bog'lanish bo'lishi mumkin. Boshqa qobiq odatda sh deb ataladi va moslik rejimida ishlaydi.

Birinchi jumlada deyarli ga e'tibor bering.

Har bir unix, hozirda men ishlagan tizim kabi edi. Ularning ko'pchiligida Bash o'rnatilgan (lekin ularning barchasi emas, balki ), masalan, BAS ba'zi bir UX larda sukut bo'yicha o'rnatilgan emas. DASH , uning o'rniga Debian Almquist qobig'i.

Qanday kafolat bera olasiz? README fayliga zsh kerakligini bildirgan satr qo'shishingiz mumkin. Agar siz paketni qursangiz, unda zshni bog'liqlik sifatida belgilashingiz mumkin. Buni autoconf/automake asboblari bilan tekshirishingiz mumkin. Siz zshni o'rnatish skriptida topilganligini tekshirishingiz mumkin (boshlang'ich/bin/sh bilan boshlang va zsh toping, agar topilsa, davom eting.) Agar xato bo'lmasa, masalan: "Ogohlantirish: ZSH o'rnatilmagan. ".)

Ishonchim komilki, men bir necha variantni unutganman. Biroq, asosiy fikrlar quyidagilardir:

  • Siz uni tekshirmaguningizcha hech qanday kafolat bera olmaysiz.
  • /bin/sh mavjudligini va bu bilan ba'zi tekshiruvlarni amalga oshirishingiz mumkinligi haqida deyarli kafolatlangan.
1
qo'shib qo'ydi
@vonbrand. POSIX /bin/sh shart emas. To'g'ri muhitda (standart muhit bo'lishi shart emas), u belgilab qo'ygan holda harakat qiladigan sh kodini talab qiladi. /bin/sh POSIX shell bo'lmasligi mumkin. Misol uchun, Solaris 10 va undan oldingi versiyalarida hali ham Bourne kabuğu va /usr/xpg4/bin standartidagi sh standarti bo'lgan.
qo'shib qo'ydi muallif Stéphane Chazelas, manba
POSIX kerak/bin/sh, AFAIU. Bunga o'xshash bir nechta foydali vositalarni talab qiladi. GNU autoconfiscation rekvizitlarini tekshiring.
qo'shib qo'ydi muallif vonbrand, manba

Ko'rib turganimizdek, bash ko'pincha tarqatish uchun standart o'rnatishda keng tarqalgan. Sizning skriptingiz zsh ga suyanib, eng katta foydalanuvchi bazasiga erisha olmaydi.

Skriptni tuzishdan oldin javob berish kerak bo'lgan muhim savol: " Nima uchun skriptni qaerdan oladi? "

Turli xil shelllar turli sintaksikdan foydalanadi yoki boshqa shelllar tomonidan qo'llab-quvvatlanmasligi mumkin bo'lgan qo'shimcha qobiq funksiyalarini taklif qiladi. "Umumiy Linux foydalanuvchisi dunyosi" uchun skript yozish uchun skriptingiz ma'lum bir qobiq muhitiga tayanadigan har qanday sintaksisi yoki qobiq vazifasini ishlatishini aniqlash.

Masalan, bash kabuk a> foydalanuvchi tizimida dash , Bourne shell yoki /bin/sh kodlari tomonidan qo'llab-quvvatlanmaydigan ba'zi kengayishlarni qo'llab-quvvatlaydi.

$ ls -l /bin/sh 
lrwxrwxrwx 1 root root 4 Feb 19  2014 /bin/sh -> dash

/bin/bash ga nisbatan echo {1..10} kodini /bin/sh yordamida bajarishga urinib ko'ring va siz juda ko'p har xil chiqishlarni qo'lga kiritasiz.

zsh uchun ham xuddi shunday bash sintaksisini qo'llab-quvvatlaydigan, bash qobig'i tomonidan qo'llab-quvvatlanmaydigan qo'shimcha kengayish va sintaksisni taqdim etadi. Muayyan misollar uchun

jadvallarni solishtirganda jadvallarni ko'ring.

#!/Ming/sh -u bilan chaqirilganda ishlaydigan skriptlarga rioya qilib, potentsial foydalanuvchi bazasini bash dan ortiqroqqa chiqarishingiz mumkin. Biroq, bu yana bir muhim savol tug'diradi: " Katta portativlik evaziga qurbon bo'lish nimani anglatadi? "

Xavfsizlik masalalari, funktsionallik, samaradorlik yoki siz sezadigan boshqa narsalar sizning buyrug'ingiz uchun ustuvor bo'lib, qurbonlikka layoqatli bo'ladimi-yo'qligini aniqlang. Siz ko'proq muhitda ishlayotgani sababli ma'lum xavfsizlik kamomadi bilan skriptni keng tarqalgan foydalanishni xohlamasligingiz mumkin.

Ushbu kodlarni qo'llab-quvvatlovchi bash uchun juda ko'p ssenariylar, buyruq qobig'ini taqqoslash . Ko'proq odam skriptni zsh yoki qobiq muhitiga xos boshqa sintaksikka tayanmasdan ko'ra ishlatishi mumkin.

Bundan tashqari, foydalanuvchining skriptni qanday bajarishini nazorat qilmasligini yodda tuting (shuningdek, turli shelllarda nosozliklarni skriptlarni tuzatish ):

Shell skriptini o'qish uchun qobiqdan foydalansangiz ("sh   scriptname "), uni to'g'ridan-to'g'ri bajarish o'rniga (" ./scriptname ")   qobiq barcha izohlarni shell skriptining boshida ko'rib chiqadi   Izohlar. Xususan, tarjimonni ko'rsatadigan sharh   ("#!/bin/sh -u") skriptni bajarishda foydalanilsa, bu kabi e'tiborga olinmaydi   bu tarjimon yonidagi barcha variantlar bo'ladi.

Shunday qilib, siz buni amalga oshirishingiz mumkin bo'lgan eng yaxshi narsa skriptlarni portativ qilishdir, chunki u qanday vazifani bajarishi uchun katta qurbonlik yo'q.

Shuningdek, Bash kodlash konventsiyalari - Stack Overflow ni ham ko'rishingiz mumkin.

1
qo'shib qo'ydi
"Qurbonlik nima" ... otokonfaga qarang. Ular "original Bourne Shell" dagi kabi/bin/sh-ni maqsad qilib olishdi, chunki barcha shelllar bu (kichik) xususiyatlar to'plamini qo'llab-quvvatlaydi. Ular juda ko'p azob chekishdi.
qo'shib qo'ydi muallif Luca Molteni, manba

Bu yaxshi savol. Umumiy foydalanishdagi tcsh skriptlari kutubxonam bor. Biroq, tcshning obro'sini e'tiborga olish kerak. Men ularni qayta yozishim kerak (aks holda ular yaxshi ishlaydi). Menimcha, javob juda oddiy: bash. GNU/Linux tufayli keng o'rnatilgan bazaga ega.

0
qo'shib qo'ydi