zsh และ mksh ไม่สามารถใช้ร่วมกับ bash ได้


11

เชลล์อื่นที่ทำงานร่วมกันได้ของ POSIX สามารถทำงานแทนกันได้อย่างเหมาะสมสำหรับทุบตีอย่างไร พวกเขาไม่จำเป็นต้องแทนที่ "drop-in" จริง แต่ใกล้พอที่จะทำงานกับสคริปต์ส่วนใหญ่และสนับสนุนส่วนที่เหลือด้วยการปรับเปลี่ยนบางอย่าง

  1. ฉันต้องการมีสคริปต์ทุบตีอย่างชัดเจน - initscripts, สคริปต์ไคลเอนต์ DHCP และอื่น ๆ - ทำงานด้วยการปรับเปลี่ยนเล็กน้อย

  2. ฉันต้องการคอลเลกชันของเชลล์สคริปต์พิเศษที่ไม่ต้องการการดัดแปลงมากเกินไป

  3. ฉันต้องการมีคุณสมบัติเช่นการจัดการสตริงและการจับคู่รูปแบบ regex ในตัว

คู่แข่งที่ร้ายแรงเท่านั้นที่ฉันรู้จักคือ zsh และ mksh ดังนั้นสำหรับพวกคุณที่นี่ที่ดีทั้งหรือทั้งสอง:

  1. bash มีคุณสมบัติใดบ้างที่ zsh และ mksh ตามลำดับไม่มี?

  2. คุณสมบัติใดที่เชลล์ใช้ร่วมกับ bash แต่ใช้ไวยากรณ์ที่เข้ากันไม่ได้


3
การเปรียบเทียบ Command Shells: ( en.wikipedia.org/wiki/Comparison_of_command_shells ) คำแนะนำขั้นสูงเพื่อ Bash Scripting: ( tldp.org/LDP/abs/html ) คู่มือ ZSH: ( zsh.sourceforge.net/Guide/zshguide.html ) MirBSD คู่มือการใช้งานเชลล์: ( mirbsd.org/htman/i386/man1/mksh.htm ) ฉันขอโทษ แต่คำถามนี้ซับซ้อนเกินไป บางทีคุณควรถามวิธีแก้ไข bash เพื่อแก้ไขช่องโหว่ภายในสำหรับการแจกจ่ายเฉพาะของ Linux?
Tyler Maginnis

3
ที่มีอยู่ไม่เชลล์ที่ฟังก์ชั่นที่สามารถเป็นลดลงในการเปลี่ยนของbash, mksh และฟังก์ชั่นสามารถ zsh เป็น/bin/shที่มีระดับต่าง ๆ ของความถูกต้อง bashแต่ไม่ได้
llua

1
สิ่งที่หอยทั้งหมดดูเหมือนจะไม่เกี่ยวข้องกับคำถามหลักและเป็นเพียงการรบกวนผู้คนดังนั้นฉันจึงลบมันออก
Michael Mrozek

3
คำถามทั้งหมดกว้างเกินไป บางทีคุณควรลบมันออก
Tyler Maginnis

1
สิ่งเดียวที่ฉันกังวลจริงๆคือ BASH ได้รับการดูแลอย่างดีจากมูลนิธิซอฟต์แวร์เสรี (FSF) ผู้ติดต่อของฉันที่นั่นบอกฉันว่าการเปิดเผย "ข้อบกพร่องพื้นฐาน" ภายใน BASH จะนำไปสู่การปฏิบัติที่แข็งแกร่งและปลอดภัยยิ่งขึ้นเท่านั้น มีเชลล์ทางเลือกมากมายที่เริ่มแนะนำหนึ่งสำหรับความต้องการของคุณฉันต้องการความเข้าใจอย่างถ่องแท้เกี่ยวกับกรณีการใช้งานของคุณ จากนั้นในด้าน O / S ... มีหลายสิ่งที่ผูกติดอยู่กับ Bash ซึ่งคุณอาจจะเขียนสาย O / S ทั้งหมดไปที่ BASH ทางออกที่ดีที่สุดที่ฉันเห็นคือเลือกแจกจ่ายด้วย alt-shell ที่บำรุงรักษา
Tyler Maginnis

คำตอบ:


19

ฉันจะใช้คุณสมบัติการเขียนสคริปต์ คุณสมบัติอินเทอร์แอคทีฟที่หลากหลาย (รุ่นบรรทัดคำสั่งความสมบูรณ์การแจ้งเตือน ฯลฯ ) มีแนวโน้มที่จะแตกต่างกันมาก คุณลักษณะใดบ้างที่อยู่ใน zsh และหายไปจาก bash หรือในทางกลับกัน ให้ตัวชี้สองสามตัวเกี่ยวกับการใช้แบบโต้ตอบ

สิ่งที่ใกล้เคียงที่สุดในการทุบตีคือATT ksh93หรือmksh (Korn เชลล์และโคลน) Zsh มีชุดย่อยของคุณสมบัติ แต่คุณจะต้องเรียกใช้ในโหมดการจำลอง ksh ไม่ใช่ในโหมดเนทีฟ zsh

ฉันจะไม่แสดงรายการคุณสมบัติPOSIX (ซึ่งมีอยู่ในshเชลล์ที่ทันสมัย) หรือคุณลักษณะที่ค่อนข้างคลุมเครือและไม่ได้กล่าวถึงคุณสมบัติข้างต้นสำหรับการใช้แบบโต้ตอบ การสังเกตมีผลตั้งแต่ bash 4.2, ksh 93u และ mksh 40.9.20120630 เท่าที่พบใน Debian wheezy

ไวยากรณ์เชลล์

quoting

$'…'(สตริงตัวอักษรที่มีการแก้ไขแบ็กสแลช) มีอยู่ใน ksh93 และ mksh `$" ... "(สตริงที่แปลแล้ว) เป็นข้อมูลเฉพาะของ bash

โครงสร้างแบบมีเงื่อนไข

Mksh และ ksh93 ต้อง;&ผ่านไปในcaseแถลงการณ์ แต่ไม่ใช่;;&เพื่อทดสอบกรณีที่ตามมา Mksh มี;|ไว้สำหรับสิ่งนั้นและ mksh ล่าสุดอนุญาตให้;;&ใช้งานร่วมกันได้

((…))การแสดงออกทางคณิตศาสตร์และ[[ … ]]การทดสอบเป็นคุณสมบัติ ksh ตัวดำเนินการตามเงื่อนไขบางตัวนั้นแตกต่างกันโปรดดู“ นิพจน์เงื่อนไข” ด้านล่าง

Coprocesses

Ksh และ bash ทั้งคู่มีตัวประมวลผลร่วม แต่ทำงานแตกต่างกัน

ฟังก์ชั่น

Mksh และ ksh93 สนับสนุนfunction name {…}ไวยากรณ์สำหรับคำจำกัดความของฟังก์ชั่นเพิ่มเติมจากมาตรฐานname () {…}แต่การใช้functionใน ksh เปลี่ยนกฎการกำหนดขอบเขตดังนั้นควรดำเนินการname () …เพื่อรักษาความเข้ากันได้ กฎสำหรับอักขระที่อนุญาตในชื่อฟังก์ชันแตกต่างกันไป ติด Alphanumerics _และ

การขยายรั้ง

Ksh93 {foo,bar}และการขยายตัวรั้งสนับสนุน Ksh93 รองรับช่วงตัวเลข{1..42}แต่ mksh ไม่รองรับ

การขยายพารามิเตอร์

Ksh93 และ mksh สนับสนุนการแยกสตริงย่อยด้วย${VAR:offset}และ${VAR:offset:length}, แต่ไม่สามารถใช้ตัวพิมพ์เล็กและตัวพิมพ์${VAR^}ใหญ่${VAR,}, ฯลฯ คุณสามารถทำการแปลงเคสด้วยtypeset -lและtypeset -uทั้งใน bash และ ksh

พวกเขาสนับสนุนการเปลี่ยนด้วยหรือ${VAR/PATTERN/STRING} ${VAR/PATTERN//STRING}กฎการอ้างอิงสำหรับ STRING แตกต่างกันเล็กน้อยดังนั้นหลีกเลี่ยงแบ็กสแลช (และอักขระอื่น ๆ ) ใน STRING (สร้างตัวแปรและใช้${VAR/PATTERN/$REPLACEMENT}แทนหากการแทนที่มีอักขระที่อ้างถึง)

การขยายตัวของ array ( ${ARRAY[KEY]}, "${ARRAY[@]}", ${#ARRAY[@]}, ${!ARRAY[@]}) การทำงานในทุบตีเหมือนใน ksh

${!VAR}การขยายเป็น${OTHERVAR}เมื่อค่าของVARคือOTHERVAR(การอ้างอิงตัวแปรทางอ้อม) เป็น bash-specific (ksh ทำบางสิ่งที่แตกต่างด้วย${!VAR}) ในการรับส่วนขยายสองเท่าเป็น ksh คุณต้องใช้การอ้างอิงชื่อแทน ( typeset -n VAR=OTHERVAR; echo "$VAR") ${!PREFIX*}ทำงานเหมือนกัน

การทดแทนกระบวนการ

การทดแทนกระบวนการ<(…)และ>(…)ได้รับการสนับสนุนใน ksh93 แต่ไม่ได้อยู่ใน mksh

รูปแบบสัญลักษณ์แทน

รูปแบบวงกลมแบบขยาย ksh ที่ต้องshopt -s extglobเปิดใช้งานใน bash นั้นมีให้ใน ksh93 และ mksh

Mksh [[:alpha:]]ไม่สนับสนุนตัวละครคลาสเช่น

การเปลี่ยนเส้นทาง IO

Bash และ ksh93 กำหนด pseudo-files และแต่ mksh ไม่ได้/dev/tcp/HOST/PORT/dev/udp/HOST/PORT

การขยาย wildcards ในการเปลี่ยนทิศทางในสคริปต์ (ตามที่var="*.txt"; echo hello >$aเขียนไว้a.txtหากชื่อไฟล์นั้นเป็นการจับคู่ แต่เพียงผู้เดียวสำหรับรูปแบบ) เป็นคุณลักษณะเฉพาะของ bash (เชลล์อื่นไม่เคยทำในสคริปต์)

<<< here-strings ทำงานเป็น ksh เหมือนทุบตี

ทางลัด>&ไปยังการเปลี่ยนเส้นทางข้อผิดพลาดทางไวยากรณ์ได้รับการสนับสนุนโดย mksh แต่ไม่ใช่โดย ksh93

การแสดงออกตามเงื่อนไข

[[ … ]] ไวยากรณ์ของวงเล็บคู่

ไวยากรณ์วงเล็บคู่จาก ksh ได้รับการสนับสนุนทั้ง ATT ksh93 และ mksh เหมือนเป็นทุบตี

ผู้ประกอบการไฟล์

Ksh93, mksh และ bash สนับสนุนส่วนขยายเดียวกันกับ POSIX รวมถึง-aคำพ้องความหมายที่ล้าสมัยของ-e, -k(เหนียว), -G(เป็นของ egid), -O(เจ้าของโดย euid), -ef(ไฟล์เดียวกัน), -nt(ใหม่กว่า), -ot(เก่ากว่า)

-N FILE (แก้ไขตั้งแต่อ่านล่าสุด) ไม่รองรับ mksh

Mksh =~ไม่ได้มีผู้ประกอบการจับคู่ Ksh93 มีโอเปอเรเตอร์นี้และทำการจับคู่เช่นเดียวกับใน bash แต่ไม่เท่ากับBASH_REMATCHการดึงกลุ่มที่ตรงกันในภายหลัง

ผู้ประกอบการสตริง

Ksh93 และการสนับสนุน mksh เดียวกันผู้ประกอบการเปรียบเทียบสตริง<และ>ทุบตีเช่นเดียวกับคำพ้องความหมายของ== =Mksh ไม่ได้ใช้การตั้งค่าตำแหน่งที่ตั้งเพื่อกำหนดลำดับพจนานุกรมโดยเปรียบเทียบสตริงเป็นสตริงไบต์

ผู้ประกอบการอื่น ๆ

-v VARเพื่อทดสอบว่ามีการกำหนดตัวแปรเฉพาะ bash หรือไม่ ในเปลือก POSIX [ -z "${VAR+1}" ]คุณสามารถใช้

builtins

alias

ชุดของอักขระที่อนุญาตในชื่อนามแฝงนั้นไม่เหมือนกันในเชลล์ทั้งหมด ฉันคิดว่ามันเหมือนกับฟังก์ชั่น (ดูด้านบน)

builtin

Ksh93 มี builtin ที่เรียกว่าbuiltinแต่มันไม่ได้รันชื่อเป็นคำสั่งในตัว ใช้commandเพื่อหลีกเลี่ยงนามแฝงและฟังก์ชัน สิ่งนี้จะเรียกว่าบิวด์อินถ้ามีอยู่มิฉะนั้นจะมีคำสั่งภายนอก (คุณสามารถหลีกเลี่ยงได้PATH= command error_out_if_this_is_not_a_builtin)

caller

นี่คือเฉพาะทุบตี คุณจะได้รับผลที่คล้ายกันด้วย.sh.fun, .sh.fileและ.sh.linenoใน ksh93 ใน mksh LINENOมีที่สุดท้าย

declare, local,typeset

declareเป็นชื่อที่ทุบตีเฉพาะสำหรับ typesetksh ใช้typeset: มันยังทำงานในทุบตี

Mksh กำหนดเป็นชื่อแทนสำหรับlocal typesetใน ksh93 คุณต้องใช้typeset(หรือกำหนดนามแฝง)

Mksh ไม่มีอาเรย์เชื่อมโยง (มีกำหนดไว้สำหรับเวอร์ชันที่ยังไม่เผยแพร่

ฉันไม่คิดว่าจะมีค่าเทียบเท่าของ bash's typeset -t(ฟังก์ชันติดตาม) ในหน่วย ksh

cd

Ksh93 -eไม่ได้

echo

Ksh93 และ mksh ประมวลผล-eและ-nตัวเลือกเช่นในทุบตี Mksh เข้าใจ-Eเช่นกัน ksh93 ไม่ถือว่าเป็นตัวเลือก การขยายแบ็กสแลชถูกปิดใช้งานตามค่าเริ่มต้นใน ksh93, โดยค่าเริ่มต้นใน mksh

enable

Ksh ไม่มีวิธีปิดใช้งานคำสั่งในตัว เพื่อหลีกเลี่ยงการ buildin ค้นหาเส้นทางของคำสั่งภายนอกและเรียกใช้อย่างชัดเจน

exec

Ksh93 มีแต่ไม่-a -lMksh ไม่มี

export

ksh93 หรือ mksh export -nไม่มี ใช้typeset +x fooแทนมันทำงานได้ใน bash และ ksh

Ksh ไม่ส่งออกฟังก์ชั่นผ่านสภาพแวดล้อม

let

let เหมือนกันใน bash และ ksh

mapfile, readarray

นี่เป็นคุณลักษณะเฉพาะของ bash คุณสามารถใช้while readลูปหรือการทดแทนคำสั่งเพื่ออ่านไฟล์และแยกเป็นอาร์เรย์ของบรรทัด ดูแลIFSและโค้งมน นี่เทียบเท่ากับmapfile -t lines </path/to/file:

IFS=$'\n'; set -f
lines=($(</path/to/file))
unset IFS; set +f

printf

printfคล้ายกันมาก ฉันคิดว่า ksh93 สนับสนุนคำสั่งฟอร์แมตของ bash ทั้งหมด mksh ไม่รองรับ%qหรือ%(DATE_FORMAT)T; ในการติดตั้งบางอย่างprintfไม่ใช่ mksh ในตัวและเรียกใช้คำสั่งภายนอกแทน

printf -v VAR เฉพาะ bash, ksh จะพิมพ์ไปยังเอาต์พุตมาตรฐานเสมอ

read

มีหลายตัวเลือกที่เฉพาะสำหรับ bash รวมถึงตัวเลือกทั้งหมดที่เกี่ยวกับ readline ตัวเลือก-r, -d, -n, -N, -t, -uมีความเหมือนกันในทุบตี ksh93 และ mksh

readonly

คุณสามารถประกาศตัวแปรแบบอ่านอย่างเดียวใน Ksh93 และ mksh ด้วยไวยากรณ์เดียวกัน readonly VARถ้าตัวแปรคืออาร์เรย์ที่คุณจะต้องกำหนดให้มันเป็นครั้งแรกแล้วทำให้มันอ่านอย่างเดียวกับ ฟังก์ชั่นไม่สามารถทำเป็นแบบอ่านอย่างเดียวใน ksh

set, shopt

ตัวเลือกทั้งหมดไปยังsetและset -oเป็นคุณสมบัติ POSIX หรือ ksh

shoptเฉพาะทุบตี ตัวเลือกมากมายเกี่ยวกับการใช้แบบโต้ตอบอยู่แล้ว สำหรับเอฟเฟกต์เกี่ยวกับ globbing และคุณสมบัติอื่น ๆ ที่เปิดใช้งานโดยตัวเลือกบางตัวให้ดูส่วน“ ตัวเลือก” ด้านล่าง

source

ตัวแปรนี้.มีอยู่ใน ksh เช่นกัน ในทุบตีและ mksh, sourceค้นหาไดเรกทอรีปัจจุบันหลังจากที่PATHแต่ใน ksh93 .ก็เป็นที่แน่นอนของเทียบเท่า

trap

DEBUGสัญญาณหลอกไม่ได้ดำเนินการใน mksh ใน ksh93 มันมีอยู่ในวิธีที่แตกต่างกันในการรายงานข้อมูลดูคู่มือสำหรับรายละเอียด

type

ใน ksh, เป็นนามแฝงสำหรับtype whence -vใน mksh type -pไม่พิมพ์พา ธ ไปยังไฟล์ที่เรียกทำงานได้ แต่เป็นข้อความที่มนุษย์อ่านได้ คุณต้องใช้whence -p COMMANDแทน

ตัวเลือก

shopt -s dotglob - อย่าเพิกเฉยต่อไฟล์ dot ในรูปแบบต่างๆ

ที่จะเลียนแบบdotglobตัวเลือกใน ksh93 FIGNORE='@(.|..)'คุณสามารถตั้งค่า ฉันไม่คิดว่าจะมีอะไรอย่างนี้ใน mksh

shopt -s extglob - ksh รูปแบบ glob ขยาย

extglobตัวเลือกที่มีประสิทธิภาพตลอดเวลาใน ksh

shopt -s failglob - เกิดข้อผิดพลาดหากรูปแบบกลมตรงกับอะไร

ฉันไม่คิดว่ามีอยู่ใน mksh หรือ ksh93 มันทำใน zsh (พฤติกรรมเริ่มต้นนอกจากnull_globหรือcsh_null_globมีการตั้งค่า)

shopt -s globstar- การ  **/วนซ้ำแบบซ้ำ

Ksh93 มี globbing recursive กับ**/, set -Gการใช้งานด้วย Mksh ไม่มีการวนซ้ำซ้ำ

shopt -s lastpipe - รันคำสั่งสุดท้ายของไพพ์ไลน์ในเชลล์พาเรนต์

Ksh93 รันคำสั่งสุดท้ายของไพพ์ไลน์เสมอในพาเรนต์เชลล์ซึ่งใน bash ต้องการlastpipeให้ตั้งค่าตัวเลือก Mksh จะเรียกใช้คำสั่งสุดท้ายของไปป์ไลน์ใน subshell เสมอ

shopt -s nocaseglob, shopt -s nocasematch- รูปแบบกรณีตาย

Mksh ไม่มีรูปแบบที่ไม่ตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก Ksh93 สนับสนุนบนพื้นฐานรูปแบบโดยรูปแบบ: ~(i)รูปแบบคำนำหน้าด้วย

shopt -s nullglob - ขยายรูปแบบที่ไม่ตรงกับไฟล์ไปยังรายการว่าง

Mksh ไม่มีสิ่งนี้ Ksh93 สนับสนุนบนพื้นฐานรูปแบบโดยรูปแบบ: ~(N)รูปแบบคำนำหน้าด้วย

ตัวแปร

เห็นได้ชัดว่าBASH_xxxตัวแปรส่วนใหญ่ไม่มีอยู่ในหน่วย ksh $BASHPIDสามารถลอกเลียนแบบด้วยค่าใช้จ่าย แต่พกพาsh -c 'echo $PPID'ได้และเพิ่งถูกเพิ่มไปยัง mksh BASH_LINEอยู่.sh.linenoใน ksh93 และLINENOใน mksh BASH_SUBSHELLอยู่.sh.subshellใน ksh93

Mksh และ ksh93 ทั้งแหล่งไฟล์ที่กำหนดในENVเมื่อพวกเขาเริ่มต้นขึ้น

EUIDและUIDไม่มีอยู่ใน ksh93 Mksh เรียกพวกเขาUSER_IDและKSH_UID; GROUPSมันไม่ได้มี

FUNCNAMEและFUNCNESTไม่มีอยู่ใน ksh Ksh93 มีและ.sh.fun .sh.levelฟังก์ชั่นประกาศด้วยfunction foo { …; }(ไม่มีวงเล็บ!) $0มีชื่อของตัวเองใน

GLOBIGNOREมีอยู่ใน ksh93 แต่มีชื่อและไวยากรณ์ที่แตกต่าง: มันถูกเรียกใช้FIGNOREและเป็นรูปแบบเดียวไม่ใช่รายการที่คั่นด้วยโคลอน ใช้@(…|…)รูปแบบ Ksh's FIGNOREsubsumes bash's พร้อมกับไวยากรณ์ที่แตกต่างกันทั้งหมด

Ksh93 และ mksh ไม่มีอะไรเหมือนHOSTTYPE, และMACHTYPE OSTYPEมิได้หรือSHELLOPTSTIMEFORMAT

Mksh มีPIPESTATUSแต่ ksh93 ไม่มี

Mksh และ ksh93 RANDOMมี


หากคุณไม่ต้องการสร้างเครื่องหมายการค้า (ไม่จดทะเบียน)“ mksh” อย่างถูกต้องที่จุดเริ่มต้นของประโยค ( ดู““ dd.” กับ““ dd”. ) ที่นี่โปรดเขียน“ The MirBSD” กรณ์เชลล์” แทน มันผิดเสมอไปที่จะใช้อักษรตัวใหญ่ของ "mksh" ขอบคุณ
mirabilos

วิธีการสามารถ$BASHPIDได้รับการเทิดทูนด้วยsh -c 'echo $PPID'? ฉันลองใช้(sh -c 'echo $PPID')Bash แต่มันให้ PID เดียวกับ$$ฉัน
Franklin Yu

ผมคิดว่าเหมาะกับคำถามที่ดีกว่าที่นี่ ฉันคัดลอกคำถามที่นั่น
Franklin Yu

4

คำถามนี้ค่อนข้างกว้างเกินไป

ทั้งmkshและzshเป็นเชลล์ที่รองรับGNU bash -ส่วนขยายเฉพาะจำนวนมากแต่มีบางอย่างที่ไม่เข้าใจ

zsh รองรับสิ่งต่าง ๆ ได้มากขึ้น แต่เฉพาะในโหมด zsh ดั้งเดิมซึ่งไม่สามารถใช้งานร่วมกับ POSIX เชลล์ (เช่น GNU bash, AT&T ksh93 , mksh) นอกจากนี้ mksh ยังผอมกว่าและเร็วกว่าและพกพาได้มากกว่า

โดยทั่วไปหากนี่คือสคริปต์ของคุณที่เรากำลังพูดถึงไปข้างหน้าเพียงทดสอบพวกเขา (mksh ยังไม่รองรับอาร์เรย์ที่เชื่อมโยงกับสไตล์ bash4 คำสั่ง“ ประกาศ” เป็น bash-specific“ เรียงพิมพ์” นั้นเทียบเท่ากันฉันไม่คุ้นเคยกับ zsh มากพอที่จะระบุอะไรก็ได้เกี่ยวกับเรื่องนั้น ksh93 ไม่มี“ local” แต่ใช้“ เรียงพิมพ์” สำหรับสิ่งนั้นด้วย) แต่ถ้าเป็นเช่นนั้นให้พูดว่าใช้ระบบเดเบียนที่ไม่ใช้คำสั่งที่ไม่ต้องใช้คำสั่ง การมีอยู่ของ bash นั้นเป็นส่วนหนึ่งของ“ สัญญา” (API / ABI ของระบบ) และต้องพึ่งพามันมาก

ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้พัฒนา mksh


1

การเปรียบเทียบ ZSH ของเชลล์

อย่างไรก็ตามในช่วงไม่กี่ปีที่ผ่านมามีการขยายครอสโอเวอร์เป็นจำนวนหนึ่ง Zsh (ตั้งแต่ 3.1.6) มี${var/old/new}' feature for replacing the text old with the text new in the parameter $var. Note one difference here: while both shells implement the syntax$ {var / # old / new} ' bash ของ' และ${var/%old/new}' for anchoring the match of old to the start or end of the parameter text, respectively, in zsh you can't put the# 'หรือ%' inside a parameter: in other words{var / $ old / new}' ที่ซึ่งเก่าเริ่มต้นด้วย#' treats that as an ordinary character in zsh, unlike bash. To do this sort of thing in zsh you can use (from 3.1.7) the new syntax for anchors in any pattern,(#s) 'เพื่อให้ตรงกับจุดเริ่มต้นของสตริง และ `(#e) 'เพื่อให้ตรงกับจุดสิ้นสุด สิ่งเหล่านี้ต้องมีการตั้งค่าตัวเลือก EXTENDED_GLOB

ฉันไม่คุ้นเคยกับ mksh มากที่สุดดังนั้นฉันไม่รู้ว่าจะหาคำตอบได้จากที่ไหน

หากคุณกำลังมองหาการแทนที่เชลล์ที่ปลอดภัยไม่มีเชลล์เหล่านี้แตกต่างจาก Bash เท่าที่เป็นข้อบกพร่องโดยธรรมชาติที่คุณกำลังพูดถึง

ภาษาอย่าง Perl สามารถจัดการอินพุตได้อย่างปลอดภัยยิ่งขึ้น แต่การบำรุงรักษาก็เป็นสิ่งสำคัญเช่นกัน การแทนที่เชลล์ Perl นั้นไม่ได้รับการยอมรับอย่างดี เป็นความรับผิดชอบของผู้ดูแลเชลล์ที่จะจัดการอินพุตอย่างปลอดภัย ดังนั้นเมื่อคุณเขียนสคริปต์ตรวจสอบตรวจสอบตรวจสอบทุกอย่าง! ใช้สัญญารหัสเพื่อรับรองผลลัพธ์ที่ถูกต้องทุกครั้ง!

Perl Shell

คำสั่ง FSF ใน Shell Shock


หากเป็นกรณีที่เชลล์อื่นมีข้อบกพร่องเหมือนกัน - ซึ่งฉันค่อนข้างสงสัยตามการสนทนาที่ฉันได้เห็น - นั่นเป็นปัญหาใหญ่เพราะโปรแกรมของบุคคลที่สามจำนวนมากส่งผ่านตัวแปรไปยังเชลล์โดยไม่มีชนิดใด ๆ ของการตรวจสอบหรืออะไร หากเป็นเช่นนั้นเราอาจจะทิ้ง POSIX ไปด้วย
DanL4096

1
โครงการ Bash มีการใช้ประโยชน์ 1 วันใน 10 ปี Microsoft Windows มีช่องโหว่มากกว่า 10 ช่องทุก 0 วันต่อสัปดาห์ คุณรู้ด้วยหรือเปล่าว่ามีคนกี่คนที่รบกวนทีมพัฒนา Bash เกี่ยวกับเรื่องนี้? เพียงอัปเดตแล้วไปต่อ! มันไม่ใช่เรื่องใหญ่.
Tyler Maginnis

1
@ DanL4096 การส่งผ่านตัวแปรไปยังเชลล์สคริปต์นั้นไม่เพียงพอต่อการตรวจสอบสติของตัวแปรนั้นไม่มีเหตุผลที่จะทิ้ง POSIX ปัญหาเกิดขึ้นกับคนที่เขียนเชลล์สคริปท์ตั้งแต่แรก
fpmurphy

0

คุณลักษณะหนึ่งที่ไม่ได้เปิดใช้งานโดยค่าเริ่มต้นmkshคือประวัติเชลล์

  • ใน.mkshrcชุดเพียงของคุณ:

    export HISTFILE=~/.mksh-history

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.