คำถามติดแท็ก shell-script

คำถามเกี่ยวกับเชลล์สคริปต์ไฟล์เรียกทำงานที่ตีความโดยเชลล์ (bash, zsh ฯลฯ )

5
คุณจะปรับสีคำหลักบางคำสำหรับสคริปต์ทุบตีได้อย่างไร
ฉันใช้รหัสการทดสอบหน่วย โค้ดทดสอบหน่วยจะแสดงข้อความปกติ มีข้อความจำนวนมากดังนั้นฉันต้องการเน้นสำหรับคำหลักที่สำคัญของผู้ใช้ ในกรณีนี้คำหลักคือ "PASS" และ "FAIL" คุณเปลี่ยนสี "PASS" เป็นสีเขียวและ "FAIL" เป็นสีแดงได้อย่างไร

3
ป้อนข้อความโดยอัตโนมัติจากสคริปต์ทุบตีโดยไม่ต้องใช้ EOF
ฉันใช้ Ubuntu Linux myprogramสมมติว่ามีโปรแกรมที่เรียกว่า โปรแกรมนี้ให้ผู้ใช้ป้อนข้อมูล Enterโดยเฉพาะผู้ใช้ต้องพิมพ์เป็นจำนวนเต็มเมื่อได้รับแจ้งและกด ฉันต้องการทำให้กระบวนการนี้เป็นแบบอัตโนมัติโดยใช้สคริปต์ทุบตี โดยเฉพาะอย่างยิ่งฉันต้องการที่จะดำเนินการmyprogramพูด 100 ครั้ง (ใช้เคาน์เตอร์iที่ไปจาก1ไป100) ในการดำเนินการแต่ละครั้งmyprogramฉันต้องการป้อนค่าปัจจุบันของiเมื่อได้รับแจ้ง (โดยวิธีการmyprogramใช้ตัวเลือก / สวิทช์-optionsซึ่งทั้งหมดจะคงที่และระบุไว้ในสคริปต์ทุบตี) โครงกระดูกที่ไม่สมบูรณ์ของสคริปต์ทุบตีนี้อาจเป็น: #!/bin/bash for i in {1..100} do myprogram -options done ตอนนี้ฉันต้องการแก้ไขโค้ดด้านบนเพื่อให้iป้อนค่าปัจจุบันของเมื่อได้รับแจ้งจากโปรแกรม วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร? เว็บไซต์ของซอฟต์แวร์ที่ฉันใช้แนะนำให้ใช้<<EOFที่ท้ายmyprogram -optionsบรรทัด ฉันคิดว่าสิ่งนี้บอกให้ทุบตีดูที่ "จุดสิ้นสุดของไฟล์" สำหรับอินพุตที่จะใช้ แต่ถ้าฉันไม่ต้องการวางอินพุตที่ท้ายไฟล์ล่ะ เกิดอะไรขึ้นถ้าผมอยากจะใส่มันทันทีหลังจากที่<<หรือ<? เหตุผลก็คือสิ่งต่าง ๆ จะมีความซับซ้อนมากขึ้น ตัวอย่างเช่นฉันอาจแนะนำตัวนับจำนวนเต็มที่jเปลี่ยนแปลงในวิธีที่ไม่เป็นเชิงเส้นหรือไม่ต่อเนื่อง จากนั้นผมก็อยากจะกินค่าปัจจุบันของjไปmyprogramในแต่ละซ้ำ แต่ค่าของjอาจมีการเปลี่ยนแปลงระหว่างการโทรไปและจุดสิ้นสุดของแฟ้ม myprogram -optionsEOF คุณมีข้อเสนอแนะใด?

4
วิธีที่ง่ายที่สุดในการดำเนินการข้อความจากหางที่บรรทัดคำสั่งคืออะไร?
บางครั้งฉันกำลังทำงานกับกล่องใหม่ (อูบุนตู) และฉันพิมพ์gitและได้รับการแจ้งเตือน: The program 'git' is currently not installed. You can install it by typing: apt-get install git-core หากเกิดขึ้นฉันรู้ว่าฉันสามารถคว้าบรรทัดสุดท้ายโดยทำสิ่งที่ชอบ: !! 2>&1 | tail -n 1 แต่ฉันจะรันผลลัพธ์ของ (นั้นapt-get install git-core) ได้อย่างง่ายดายที่สุดได้อย่างไร ฉันรู้ว่าฉันสามารถทำได้ `!! 2>&1 | tail -n 1` แต่ยังมีวิธีที่จะส่งออกไปป์ไลน์จริง ๆ และมีการเรียกใช้หรือไม่ ดูเหมือนจะใช้งานไม่ได้: !! 2>&1 | tail -n 1 | sh …

7
วิธีการรวมข้อความของบรรทัดที่เป็นตัวอักษรเข้ากับบรรทัดที่เป็นตัวเลขในเชลล์?
ฉันมีไฟล์ที่มีข้อความเช่นนี้: AAAA BBBB CCCC DDDD 1234 5678 9012 3456 EEEE 7890 ฯลฯ ... และฉันต้องการจับคู่ตัวอักษรกับบรรทัดตัวเลขเพื่อให้เป็นเช่นนี้: AAAA 1234 BBBB 5678 CCCC 9012 DDDD 3456 EEEE 7890 ไม่มีใครรู้วิธีง่ายๆในการบรรลุเป้าหมายนี้หรือไม่?

1
คุณละเว้น“ ./” อย่างไรเมื่อเรียกใช้สคริปต์ในไดเรกทอรีปัจจุบัน
ในบทเรียนบางอย่างผ่านทางอินเทอร์เน็ตพวกเขาสามารถเรียกใช้สคริปต์ในไดเรกทอรีปัจจุบันโดยไม่ต้องทำ: ./script คุณจะละเว้นสิ่งนี้ได้อย่างไร ฉันใช้ CentOS 5.6 x64 ฉันต้องการเรียกใช้วิธีนี้ script

6
ค้นหาไฟล์หรือไดเรกทอรีที่ใหญ่ที่สุด
คำสั่งใดจะพิมพ์ขนาดของไฟล์และไดเรกทอรีทั้งหมดในไดเรกทอรี tmp (รวมถึงไฟล์ที่ซ่อนอยู่) และจัดเรียงตามขนาดจากมากที่สุดไปหาน้อยที่สุดในรูปแบบที่มนุษย์อ่านได้ (เช่น 2 GB) ผลลัพธ์อาจเป็นดังนี้: file.mpg 2GB file.avi 1.8GB .backtup 1.7 GB (this is directory) ฉันพยายามใช้lsและduคำสั่ง แต่ไม่พบสวิตช์ที่ถูกต้อง

5
ทางเลือกมาตรฐานแบบไม่ใช้เวลามาตรฐานสากล? [ปิด]
ปิด คำถามนี้ต้องการรายละเอียดหรือความคมชัด ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ เพิ่มรายละเอียดและชี้แจงปัญหาโดยแก้ไขโพสต์นี้ ปิดให้บริการใน3 ปีที่ผ่านมา สำหรับการเปรียบเทียบครั้งเรียกใช้สคริปต์ระหว่างเปลือกหอยแตกต่างกันบางคำตอบ SE แนะนำให้ใช้bash's ในตัว timeคำสั่งเช่นดังนั้น: time bash -c 'foo.sh' time dash -c 'foo.sh' ... ฯลฯให้ทุกเชลล์ทำการทดสอบ มาตรฐานดังกล่าวล้มเหลวในการกำจัดเวลาที่แต่ละเปลือกโหลดและเริ่มต้นตัวเอง ตัวอย่างเช่นสมมติว่าทั้งสองคำสั่งดังกล่าวถูกจัดเก็บไว้ในอุปกรณ์ช้ากับความเร็วในการอ่านของฟล็อปปี้ดิสก์ต้น (124KB / s), dash(ก~ 150Kปฏิบัติการ) จะโหลดประมาณ7 เท่าเร็วกว่าbash( ~ 1M ) เปลือก เวลาในการโหลดจะเอียงtimeตัวเลข - เวลาก่อนการโหลดของกระสุนเหล่านั้นไม่เกี่ยวข้องกับการวัดเวลาการทำงานของfoo.shใต้แต่ละเชลล์หลังจากกระสุนถูกโหลดแล้ว แบบพกพาและยูทิลิตี้ทั่วไปที่ดีที่สุดในการรันสำหรับกำหนดเวลาสคริปต์ที่สามารถเรียกใช้จากภายในแต่ละเชลล์คืออะไร ดังนั้นโค้ดด้านบนจะมีลักษณะดังนี้: bash -c 'general_timer_util foo.sh' dash -c 'general_timer_util foo.sh' หมายเหตุ: ไม่มีคำสั่งในตัวของ …

1
ลบไฟล์ที่เก่ากว่า 500 วัน
ฉันมีไดเรกทอรีพร้อมไฟล์จากปี 2010 .. ฉันต้องการลบไฟล์ทั้งหมดที่เก่ากว่า 500 วันและฉันลองทำสิ่งนี้: find /var/log/arc/* -type f -mtime +500 -delete {}\; แต่ฉันได้รับสิ่งนี้: -bash: /usr/bin/find: Argument list too long ฉันรู้ว่านี่หมายความว่ามีไฟล์มากเกินไปและfindไม่สามารถจัดการได้ แต่ถึงฉันจะใส่+2000อันไหนมากกว่า 3 ปีฉันก็ยังได้ สิ่งที่ฉันหายไปที่นี่

3
ฉันสามารถใช้ตัวแปรในการขยาย Bash brace ได้หรือไม่?
ด้านล่างนี้เป็นโค้ดหลอกบางประเภทสำหรับสิ่งที่ฉันพยายามทำ: #!/bin/bash # I already have the variable below figured out (positive integer): numlines=$([returns number of lines containing specific characters in a file]) # This is basically what I want to do with it: for i in {1..$numlines}; do # the part below is already figured out as well: do …

4
ใช้ chown $ USER: $ USER ภายในสคริปต์ทุบตี
ในสคริปต์ทุบตีเล็ก ๆ ที่ฉันใช้ฉันพยายามที่จะ chown ไดเรกทอรีใหม่ที่สร้างขึ้น ฉันได้เพิ่ม: sudo chown $USER:$USER /var/www/$sitename sudo chmod 775 /var/www/$sitename หลังจากบรรทัดที่ฉัน mkdir ( sudo mkdir /var/www/$sitename) ด้วยเหตุผลบางอย่าง chown ไม่ทำงาน ฉันสามารถรันด้วยตนเอง แต่เมื่อเขียนในไฟล์มันไม่ทำงาน ฉันสังเกตว่า "chown" ไม่ได้เน้นสีเดียวกับ "mkdir" และ "chmod" แต่ฉันไม่สามารถเข้าใจปัญหาของฉันได้ ทำไม chown ไม่ทำงานที่นี่ เป็นปัญหา$USER:$USERหรือไม่? แก้ไข นี่คือสคริปต์เต็ม ฉันจะ chown ไฟล์ใดที่ผู้ใช้ที่ไม่ใช่รูทสั่งสคริปต์ #!/bin/sh #!/bin/bash # New Site cd /etc/apache2/sites-available/ echo "New …

6
ฉันจะลบบรรทัดใหม่ต่อท้ายในทุบตีได้อย่างไร
ฉันกำลังมองหาสิ่งที่ชอบทำตัวของ chompPerl ฉันกำลังมองหาคำสั่งที่พิมพ์เพียงแค่อินพุตลบอักขระตัวสุดท้ายหากเป็นบรรทัดใหม่: $ printf "one\ntwo\n" | COMMAND_IM_LOOKING_FOR ; echo " done" one two done $ printf "one\ntwo" | COMMAND_IM_LOOKING_FOR ; echo " done" one two done (การทดแทนคำสั่งใน Bash และ Zsh ลบบรรทัดใหม่ที่ตามมาทั้งหมด แต่ฉันกำลังมองหาบางสิ่งที่จะลบบรรทัดใหม่ที่ต่อท้ายหนึ่งบรรทัด)

2
เหตุใดชื่อไฟล์จึงมีเครื่องหมายคำถามเมื่อฉันเรียกใช้สคริปต์บนเครื่องระยะไกลของฉัน
ฉันมีสคริปต์เล็ก ๆ ที่ดึงข้อมูลวันที่ปัจจุบันเรียกใช้สคริปต์ PHP และเปลี่ยนเส้นทางผลลัพธ์ (และข้อผิดพลาด) ไปยังชื่อไฟล์ที่มีวันที่ปัจจุบัน DATE=$(date +"%Y%m%d") FILE="log/${DATE}.log" php -q script.php >> $FILE 2>&1 เมื่อฉันเรียกใช้สคริปต์นี้บนเครื่องท้องถิ่นของฉัน (Windows 7 Aptana IDE) ที่สคริปต์ PHP ทำงานได้ดีและ logfile 20140502.logมีชื่อไฟล์ที่คาดไว้เช่น แต่เมื่อฉันกดสคริปต์นั้นผ่าน SFTP ไปยังเครื่องระยะไกลของฉันและเรียกใช้สคริปต์นั้นชื่อไฟล์จะเป็นดังนี้: 20140502?.log? อาจมีปัญหาอะไร? นี่เป็นข้อผิดพลาดการเข้ารหัส (เช่นการเข้ารหัสสำหรับการอัปโหลด SFTP คือ ANSII ซึ่งคาดว่า UTF-8) หรือฉันจะต้องเปลี่ยนแปลงอะไรในสคริปต์ตัวเอง? ข้อมูลเกี่ยวกับระบบ / เชลล์: [foo@bar path]$ sh --version GNU bash, version 3.2.25(1)-release …

3
รับล็อกการอ่าน / เขียนแบบเอกสิทธิ์เฉพาะบุคคลในไฟล์สำหรับการปรับปรุงอะตอม
ฉันต้องการมีไฟล์ที่ใช้เป็นตัวนับ ผู้ใช้ A จะเขียนและเพิ่มจำนวนนี้ในขณะที่ผู้ใช้ B ขอให้อ่านไฟล์ เป็นไปได้หรือไม่ที่ผู้ใช้ A สามารถล็อคไฟล์นี้เพื่อให้ไม่มีใครสามารถอ่านหรือเขียนไฟล์ได้จนกว่าการเขียนของผู้ใช้จะเสร็จสิ้น? ฉันดูแล้วflockแต่ดูเหมือนจะไม่สามารถใช้งานได้ตามที่คาดหวัง flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt && sleep 5 หากมีวิธีที่เหมาะสมกว่าในการรับไฟล์ที่เพิ่มขึ้นคล้ายกับอะตอมนี้ซึ่งจะเป็นการฟังที่ดีเช่นกัน! เป้าหมายของฉันคือ: LOCK counter.txt; write to counter.txt; ในขณะที่ในเวลาเดียวกัน Read counter.txt; realize it's locked so wait until that lock is finished.

3
Bash script; การเพิ่มประสิทธิภาพความเร็วการประมวลผล
ฉันสงสัยว่ามีแนวทางทั่วไปในการเพิ่มประสิทธิภาพสคริปต์ Bash หรือไม่ ตัวอย่างเช่นสะดวกในการเขียนลูปมากกว่าบรรทัดคำสั่ง แต่มันเร็วกว่าในการประมวลผลสำหรับระบบหรือไม่ ตัวอย่าง: for i in a b c; do echo $i; done echo a echo b echo c บางครั้งผู้คนนำเสนอวิธีแก้ไขปัญหาต่าง ๆ สำหรับปัญหาเดียวกัน ตัวอย่างเช่นsed, cut, awkและechoมีความสามารถทั้งหมดที่จะตัดตัวเลขจากสตริง ฉันสงสัยว่าถ้าคุณสามารถบอกได้ว่ายิ่งมีจำนวนรหัสน้อยเท่าไหร่ก็ยิ่งเร็วเท่านั้นหากคุณใช้: คำสั่งเดียวกันเช่น STRING=abc.def echo ${STRING} | sed 's/.def//g' echo ${STRING} | sed '$s/....$//' คำสั่งต่าง ๆ เช่น STRING=abc.def echo ${STRING} | cut -d …

4
ฉันจะกำหนดรหัสผ่านเริ่มต้น / เริ่มต้นให้กับผู้ใช้ใน Linux ได้อย่างไร
ผมพบว่าคู่มือที่อธิบายถึงวิธีไปตั้งค่ารหัสผ่านของผู้ใช้ ฉันกำลังพยายามทำให้เป็นอัตโนมัติและส่งอีเมลไปยังผู้ใช้ที่ชอบ: userid created with password XYZ. request to change the initial password. ตามเอกสารข้างต้นจำเป็นต้องสร้างรหัสผ่านที่เข้ารหัสโดยใช้ Python และป้อนให้กับusermodคำสั่งเช่นนี้: usermod -p "<encrypted-password>" <username> มีวิธีอื่นที่ง่ายกว่าในการทำเช่นนี้? ฉันไม่ต้องการดาวน์โหลดโปรแกรมอรรถประโยชน์พิเศษใด ๆ ควรสรุปให้มากที่สุด แก้ไข : แม้แต่วิธีการที่ระบุในลิงก์ด้านบนก็ไม่ได้ผลสำหรับฉัน: bash-3.00# python Python 2.4.6 (#1, Dec 13 2009, 23:43:51) [C] on sunos5 Type "help", "copyright", "credits" or "license" for more information. >>> import …

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