คำถามติดแท็ก ksh

Korn shell (ksh) เป็นเชลล์ที่มีคุณสมบัติการเขียนสคริปต์ขั้นสูงซึ่งมักพบได้ใน unices เชิงพาณิชย์และระบบ BSD บางระบบ แต่ไม่ค่อยได้ใช้บน Linux

2
เหตุใดจึงต้องหลีกเลี่ยงอักขระตัวเล็กในเชลล์สคริปต์
ฉันเพิ่งเปิดเชลล์สคริปต์ดั้งเดิม (เขียนด้วย ksh88 เก่าบน Solaris) และพบสิ่งต่อไปนี้ซ้ำแล้วซ้ำอีกตลอดทั้งรหัส: [ -f $myfile ] && \rm -f $myfile แบ็กสแลชที่หนีออกมาจะทำให้ฉันประหลาด ฉันรู้ว่ามันเป็นการจงใจเนื่องจากการหลบหนี (ไร้ประโยชน์แบบนี้) ซ้ำแล้วซ้ำอีกตลอดทั้งรหัส ผู้เขียนดั้งเดิมหายไปนานฉันไม่สามารถติดต่อกับเขาเพื่อขอให้เขา นี่เป็นเพียงนิสัยแปลก ๆ ตลก ๆ ของผู้แต่งหรือเป็นแนวปฏิบัติที่ดีที่เลิกใช้แล้วซึ่งทำให้เข้าใจได้ในบางเวลา หรืออาจเป็นวิธีที่แนะนำในการทำสิ่งต่าง ๆ และฉันก็ขาดอะไรไปบ้าง?

7
หาเชลล์ในสคริปต์ระหว่างรันไทม์
ตามความรู้ของฉันเพื่อกำหนดเชลล์ปัจจุบันที่เราใช้echo $0ในเชลล์ ค่อนข้างฉันต้องการสคริปต์ของฉันเพื่อตรวจสอบว่าเปลือกมันทำงานอยู่ ดังนั้นฉันพยายามพิมพ์$0ในสคริปต์และส่งคืนชื่อสคริปต์เท่าที่ควร ดังนั้นคำถามของฉันคือฉันจะหาเชลล์ที่สคริปต์ของฉันทำงานในระหว่างรันไทม์ได้อย่างไร
22 linux  shell  ksh 

1
เป็น ((…)) {…;} ไวยากรณ์เชลล์ที่ถูกต้องหรือไม่ หอยไหน?
การแสดงออก: $ ksh -c 'for ((i=0;i<10;i++)){ echo $i;}' 0 1 2 3 4 ทำงานอย่างถูกต้อง ฉันล้มเหลวในการค้นหาคำอธิบายของไวยากรณ์นี้ซึ่ง{...;}แทนที่ด้วย; do ...; doneในคู่มือ มีการอ้างอิงในคู่มือหรือไม่? เชลล์ใดที่ทำงานได้ถูกต้อง?
21 bash  shell  zsh  ksh 

5
มีวิธีการรวมขนาดไฟล์ที่ระบุไว้หรือไม่?
นี่คือคำสั่งที่ฉันใช้เพื่อแสดงรายการไฟล์: find . -name \*.extract.sys -size +1000000c -exec ls -lrt {} \; -rw-r--r-- 1 qa1wrk15 test 1265190 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_7.20110929.extract.sys -rw-r--r-- 1 qa1wrk15 test 1345554 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_2.20110929.extract.sys -rw-r--r-- 1 qa1wrk15 test 1370532 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_3.20110929.extract.sys -rw-r--r-- 1 qa1wrk15 test 1399854 Sep 29 01:14 ./var/can/projs/ar/rep/extract/Sep/29/ar.ARAB-PI_8.20110929.extract.sys และอื่น ๆ …


1
วิธีรับวันที่และเวลาปัจจุบันในรูปแบบ YYYYMMDDHHMMSS ใน ksh88?
ความต้องการของฉันคือการได้รับความแตกต่างของ 2 เวลาในชั่วโมง เนื่องจากตัวเลือกวันที่ diff ใช้เวลานานสำหรับฉันที่จะคิดออกฉันกำลังพยายามแปลงวันที่ทั้งสองเป็นรูปแบบ YYYYMMDDHHMMSS และค้นหาความแตกต่างของจำนวน ดังนั้นฉันต้องได้รับวันที่และเวลาปัจจุบันในรูปแบบเดียวกัน
18 ksh  date 

12
วิธีการส่งออกสี diff?
ฉันต้องการฟอร์แมตไฟล์ Unix แบบมีเงื่อนไขตอนนี้ฉันกำลังทำงานกับdiffคำสั่งและต้องการทราบว่าเป็นไปได้หรือไม่ที่จะจัดรูปแบบข้อความของdiffเอาต์พุตคำสั่ง ตัวอย่าง: ค่าที่ตรงกันควรแสดงเป็นสีเขียว ค่าที่ไม่ตรงกันควรแสดงเป็นสีแดง สมมติว่าฉันมีสองไฟล์file1และคำสั่งของฉันคือfile2diff file1 file2 ตอนนี้ฉันต้องการที่สมมติว่าผลลัพธ์มี 5 ไม่ตรงกันจากนั้นไม่ตรงกันเหล่านั้นควรจะแสดงในสีแดง วิธีการบรรลุสิ่งนี้โดยใช้ยูนิกซ์? ในระยะสั้น "เปลี่ยนสีเป็นสีแดงสำหรับผลลัพธ์ของคำสั่ง diff สำหรับค่าที่ไม่ตรงกัน"
18 bash  ksh  diff 


2
วิธีหนึ่งสามารถรูทเชลล์ออกหลังจากระยะเวลาหนึ่งได้อย่างไร
มีวิธีการ 'หมดเวลาใช้งาน' รูทเชลล์ (ตัวอย่างเช่นในgnome-terminal) เพื่อให้หลังจากระยะเวลาหนึ่งไม่ออกคำสั่งใด ๆ เชลล์จะออกหรือไม่ ฉันกำลังค้นหาโซลูชันที่ทำงานbashกับ Fedora และในkshOpenBSD
15 bash  ksh 

8
ตรวจสอบตัวแปรเป็นอาร์เรย์ใน Bourne like shell หรือไม่
ใน Bourne like shell ซึ่งสนับสนุนตัวแปรอาเรย์เราสามารถใช้การวิเคราะห์คำเพื่อตรวจสอบว่าตัวแปรเป็นอาร์เรย์หรือไม่ a=(1 2 3)คำสั่งทั้งหมดด้านล่างนี้ถูกเรียกใช้หลังจากการทำงาน zsh: $ declare -p a typeset -a a a=( 1 2 3 ) bash: $ declare -p a declare -a a='([0]="1" [1]="2" [2]="3")' ksh93: $ typeset -p a typeset -a a=(1 2 3) pdksh และอนุพันธ์: $ typeset -p a set -A a …
14 bash  shell  zsh  ksh  yash 

4
วิธี scp ด้วยนิพจน์ทั่วไป
ฉันพยายามคัดลอกไฟล์ทั้งหมดที่ไม่ได้ขึ้นต้นด้วยตัวอักษร "a" ในหน่วย ksh การคัดลอกจากเครื่องต้นทางไปยังเครื่องปลายทางทำงานได้ดี : scp -p !(a*) user@machine:/path/directory/. แต่ถ้าฉันอยู่บนเซิร์ฟเวอร์ปลายทางและต้องการคัดลอกจากเซิร์ฟเวอร์ต้นทางล้มเหลว: scp -p user@machine:/path/!(a*) . ความคิดใด ๆ
13 ksh  scp 

1
ksh93 หลีกเลี่ยงการส้อมในการทดแทนคำสั่งได้อย่างไร
ป.ร. ให้ไว้ cmd='fun(){ echo "$@"; }; fun $(fun $(fun hi))' หอยมีแนวโน้มที่จะต้องทำให้ 2 ส้อมเพื่อให้มันเกิดขึ้น strace-f(){ strace -f "$@" 2>&1; }; for sh in dash bash zsh ksh; do printf "$sh\t" ; strace-f $sh -c "$cmd" |grep -e clone -e fork -c; done ยกเว้นkshอย่างกล้าหาญทำให้มันไม่ได้ฟอร์กครั้งเดียว: dash 2 bash 2 zsh 2 ksh 0 …

7
ฉันจะรับรุ่น ksh อย่างปลอดภัยได้อย่างไร
ฉันจะรับรุ่น ksh อย่างปลอดภัยจากภายในสคริปต์ ksh ได้อย่างไร ฉันได้เห็นวิธีแก้ไขปัญหาต่อไปนี้ : ksh --version echo ${.sh.version} echo $KSH_VERSION และเมื่อได้รับสถานการณ์ที่เหมาะสมแต่ละงานเหล่านี้ถูกต้อง อย่างไรก็ตามฉันสนใจกรณีที่ไม่สมบูรณ์ โดยเฉพาะมีหลายเครื่องที่ฉันทำงานด้วยที่มีรุ่นเก่ากว่า ksh ที่สำหรับวัตถุประสงค์ของฉันขาดฟังก์ชั่นอย่างรุนแรง อย่างไรก็ตามเหตุผลที่ฉันต้องการตรวจสอบรุ่น (โดยทางโปรแกรม) คือดูว่ารุ่น ksh เป็นหนึ่งในรุ่นที่มีความสามารถน้อยกว่าหรือไม่ และถ้าเป็นเช่นนั้นฉันต้องการรันสาขาด้วยรหัสที่ยอดเยี่ยมน้อยลง อย่างไรก็ตามในเครื่องที่มีปัญหาความไม่สมบูรณ์ของเชลล์จะขยายไปสู่การตรวจสอบเวอร์ชัน ... ถ้าฉันลองksh --versionมันจะพิมพ์ออกมาและเปิดตัวอย่างใหม่ของksh! หากฉันลองecho ${.sh.version}ให้kshถือว่านี่เป็นข้อผิดพลาดทางไวยากรณ์ที่ไม่สามารถทิ้ง2> /dev/nullได้ $ echo ${.sh.version} 2> /dev/null ksh: ${.sh.version}: bad substitution แน่นอนecho $KSH_VERSIONว่าใช้งานได้ดี - ฉันหมายความว่ามันจะไม่ผิดพลาด - แม้ว่าเครื่องเหล่านี้จะว่างเปล่า นอกจากนี้ผมเห็นที่ไหนสักแห่งที่มีการตั้งค่าโดยเฉพาะKSH_VERSIONpdksh คำถาม: ฉันจะตรวจสอบเวอร์ชั่นของkshโปรแกรมอย่างปลอดภัยได้อย่างไร kshสำหรับวัตถุประสงค์ของฉันที่นี่ฉันไม่สนใจสิ่งที่หมายเลขรุ่นที่เกิดขึ้นจริงเป็นเพียงแค่ไม่ว่าจะเป็นรุ่นเก่า …

3
tar ไปป์ แต่เก็บเอาท์พุท verbose -v แยกจาก STDERR
คำสั่ง tar ปกติ tar cvf foo.tar ./foo >foo.out 2>foo.err มีสามสตรีม IO เอาต์พุต เก็บข้อมูลไปยัง foo.tar รายการชื่อไฟล์ไปยัง STDOUT (เปลี่ยนเส้นทางไปยัง foo.out) ข้อความแสดงข้อผิดพลาดไปยัง STDERR (เปลี่ยนเส้นทางไปยัง foo.err) ฉันสามารถตรวจสอบ foo.err เพื่อหาข้อความแสดงข้อผิดพลาดโดยไม่ต้องอ่านรายชื่อไฟล์ ถ้าฉันต้องการทำอะไรกับข้อมูลที่เก็บถาวร (ไพพ์ผ่าน netcat หรือโปรแกรมบีบอัดแบบพิเศษ) ฉันสามารถใช้-f -ตัวเลือกของ tar tar cvf - ./foo 2>foo.err | squish > foo.tar.S แต่ตอนนี้รายชื่อไฟล์ของฉันถูกผสมกับข้อความแสดงข้อผิดพลาดของฉันเพราะ-vเอาท์พุทของ tar ไม่สามารถไปที่ STDOUT (นั่นคือที่ที่เก็บข้อมูลไหล) ดังนั้น tar เขียนอย่างชาญฉลาดถึง STDERR …
12 tar  ksh  io 

2
Scrip เพื่อลบไฟล์ที่เก่ากว่า 6 เดือน
การตั้งค่างาน cron เดือนละครั้งเพื่อเริ่มสคริปต์ สคริปต์คือการหมุนไฟล์ในแต่ละเดือนเนื่องจากไฟล์มีขนาดใหญ่เกินไปและเปลี่ยนชื่อไฟล์เก่า เมื่อไฟล์เก่ากว่าหกเดือนฉันต้องการลบมัน ต้องการเรียกใช้สคริปต์นี้เดือนละครั้ง เป็นไปได้ไหมที่จะลบอันเก่าออก โปรดแจ้งให้เราทราบหากยังไม่ชัดเจนเพียงพอ
12 scripting  ksh 

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