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

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

2
การส่งข้อมูลไปยัง stdin ของกระบวนการโดยไม่ทำให้ EOF เกิดขึ้นภายหลัง
ฉันมีไฟล์ปฏิบัติการที่เริ่มต้นเชลล์แบบโต้ตอบกับผู้ใช้ เมื่อต้องการเปิดตัวเชลล์ให้ฉีดคำสั่งสองสามคำก่อนจากนั้นอนุญาตให้ผู้ใช้มีเซสชันแบบโต้ตอบ ฉันสามารถทำได้อย่างง่ายดายโดยใช้echo: echo "command 1\ncommand 2\ncommand3" | ./shell_executable นี้เกือบจะทำงาน ปัญหาคือคำสั่ง echo ที่ป้อน stdin ของกระบวนการจะกระทบ EOF เมื่อดำเนินการตามคำสั่งของฉันแล้ว EOF นี้ทำให้เชลล์ยกเลิกทันที (ราวกับว่าคุณกด Ctrl + D ในเชลล์) มีวิธีฉีดคำสั่งเหล่านี้ลงใน stdin โดยไม่ทำให้ EOF ภายหลังได้หรือไม่


4
ฉันจะลบอักขระบรรทัดใหม่ที่ท้ายไฟล์ได้อย่างไร
ให้ฉันชัดเจนเกี่ยวกับอักขระขึ้นบรรทัดใหม่: $ echo Hello > file1 ; cat file1 Hello $ echo -n Hello > file2 ; cat file2 Hello$ ที่นี่คุณจะเห็นว่าfile1มีอักขระขึ้นบรรทัดใหม่ในตอนท้ายขณะที่file2ยังไม่มี ตอนนี้สมมติว่าฉันเป็นหนึ่งfile: $ cat file Hello Welcome to Unix $ และฉันต้องการที่จะเพิ่มand Linuxในตอนท้ายของไฟล์จากนั้นecho " and Linux" >> fileจะถูกเพิ่มไปยังบรรทัดใหม่ แต่ฉันต้องการบรรทัดสุดท้ายเป็นUnix and Linux ดังนั้นเพื่อหลีกเลี่ยงฉันต้องการลบอักขระบรรทัดใหม่ที่ท้ายไฟล์ ดังนั้นฉันจะลบอักขระบรรทัดใหม่ได้อย่างไรในตอนท้ายของไฟล์

4
จะลบไฟล์ในเครื่องระยะไกลผ่าน SSH โดยใช้ Shell Script ได้อย่างไร
ฉันกำลังเขียนเชลล์สคริปต์ที่ฉันต้องลบไฟล์ในเครื่องระยะไกลผ่านเชลล์สคริปต์ ไหลด้วยตนเอง: ssh username@domain.com .. จากนั้นที่โดเมน: cd ./some/where rm some_file.war วิธีการทำงานให้สำเร็จ
32 ssh  shell-script 

1
ตัวอธิบายไฟล์ & เชลล์สคริปต์
ฉันมีเวลายากมากที่จะเข้าใจว่าคน ๆ หนึ่งใช้ file descriptor ใน shell script ได้อย่างไร ฉันรู้พื้นฐานเช่น exec 5 > /tmp/foo ดังนั้น fd 5 จะแนบกับ foo เพื่อเขียน exec 6 < /tmp/bar …สำหรับการอ่าน exec 5>&- …ปิด fd ตอนนี้จะทำอะไร? #!/bin/bash exec 5 > /tmp/foo exec 6 < /tmp/bar cat <&6 | while read a do echo $a >&5 done …

5
getopt, getopts หรือการแยกวิเคราะห์แบบแมนนวล - จะต้องใช้อะไรเมื่อฉันต้องการสนับสนุนตัวเลือกทั้งระยะสั้นและระยะยาว
ขณะนี้ฉันกำลังเขียนสคริปต์ Bash ซึ่งมีข้อกำหนดดังต่อไปนี้: ควรรันบนแพลตฟอร์ม Unix / Linux ที่หลากหลาย ควรสนับสนุนตัวเลือกทั้งแบบสั้นและยาว (GNU) ฉันรู้ว่าgetoptsจะเป็นวิธีที่ต้องการในแง่ของการพกพา แต่ AFAIK มันไม่สนับสนุนตัวเลือกยาว getoptรองรับตัวเลือกยาว แต่BashGuideแนะนำอย่างยิ่งกับมัน: ห้ามใช้ getopt (1) getopt ไม่สามารถจัดการกับสตริงอาร์กิวเมนต์ว่างเปล่าหรือขัดแย้งกับช่องว่างที่ฝังตัว โปรดลืมว่ามันมีอยู่จริง ดังนั้นยังคงมีตัวเลือกในการแยกวิเคราะห์ด้วยตนเอง นี่เป็นข้อผิดพลาดง่ายสร้างรหัสสำเร็จรูปค่อนข้างมากและฉันต้องจัดการข้อผิดพลาดด้วยตัวเอง (ฉันเดาว่าgetopt(s)จัดการข้อผิดพลาดด้วยตัวเอง) ดังนั้นสิ่งที่จะเป็นตัวเลือกที่ต้องการในกรณีนี้


2
ความแตกต่างระหว่าง kill, pkill และ killall คืออะไร
ผมคุ้นเคยกับkillคำสั่งและส่วนใหญ่ของเวลาที่เราเพียงแค่ใช้ฆ่า -9 จะฆ่ากระบวนการที่เข้มแข็งมีสัญญาณอื่น ๆ killอีกมากมายที่สามารถนำมาใช้กับ แต่ฉันสงสัยว่าอะไรคือกรณีการใช้งานpkillและkillallหากมีคำสั่ง kill อยู่แล้ว ทำpkillและkillallใช้killคำสั่งในการนำไปปฏิบัติหรือไม่? ฉันหมายความว่าพวกเขาเป็นเพียงแค่ห่อหุ้มkillหรือพวกเขามีการใช้งานของตัวเอง? ฉันต้องการทราบว่าpgrepคำสั่งรับรหัสกระบวนการจากชื่อกระบวนการ คำสั่งทั้งหมดเหล่านี้ใช้การเรียกระบบพื้นฐานเดียวกันหรือไม่? มีมุมมองที่แตกต่างจากประสิทธิภาพการทำงานใดบ้างเร็วกว่ากัน?

8
วิธีการสร้างจำนวนเต็มสุ่มขนาดใหญ่กระจายอย่างสม่ำเสมอในทุบตี?
ฉันสงสัยว่าสิ่งใดจะเป็นวิธีที่ดีที่สุดที่จะได้แบบแผนที่ดีในการทุบตีนั่นคือขั้นตอนในการรับจำนวนเต็มบวกแบบสุ่มระหว่างMINและMAXเช่นนั้น ช่วงสามารถมีขนาดใหญ่โดยพลการ (หรืออย่างน้อยพูดได้สูงสุด 2 32 -1) มีการกระจายค่าอย่างสม่ำเสมอ (เช่นไม่มีอคติ) มันมีประสิทธิภาพ วิธีที่มีประสิทธิภาพในการรับการสุ่มใน bash คือการใช้$RANDOMตัวแปร อย่างไรก็ตามนี่เป็นเพียงตัวอย่างค่าระหว่าง 0 ถึง 2 15 -1 ซึ่งอาจไม่ใหญ่พอสำหรับวัตถุประสงค์ทั้งหมด โดยทั่วไปผู้คนจะใช้โมดูโล่เพื่อให้อยู่ในช่วงที่พวกเขาต้องการเช่น MIN=0 MAX=12345 rnd=$(( $RANDOM % ($MAX + 1 - $MIN) + $MIN )) นอกจากนี้จะสร้างอคตินอกจากจะ$MAXเกิดขึ้นกับหาร 2 15 -1 = 32767 เช่นถ้า$MINเป็น 0 และ$MAX9 แล้วค่า 0 ถึง 7 เล็กน้อยน่าจะมากกว่าค่าที่ 8 และ 9 …

1
สาเหตุ SSH ในขณะที่วงจะหยุด
ในที่สุดฉันก็สามารถจัดการกับปัญหาที่ฉันต้องดิ้นรนเป็นเวลาสองสามสัปดาห์ ฉันใช้ SSH กับ "คีย์ที่ได้รับอนุญาต" เพื่อเรียกใช้คำสั่งจากระยะไกล ทั้งหมดเป็นเรื่องปกติยกเว้นเมื่อฉันทำในขณะที่ลูป ลูปสิ้นสุดลงหลังจากทำซ้ำใด ๆ ด้วยคำสั่ง ssh เป็นเวลานานที่ฉันคิดว่านี่เป็นความแปลกประหลาด ksh แต่ตอนนี้ฉันค้นพบว่าทุบตีทำในความเป็นจริงเหมือนกัน โปรแกรมตัวอย่างขนาดเล็กเพื่อสร้างปัญหาขึ้นอีกครั้ง นี่คือการกลั่นจากการใช้งานที่มีขนาดใหญ่ซึ่งจะนำภาพรวมและทำซ้ำพวกเขาระหว่างโหนดในคลัสเตอร์ #!/bin/bash set -x IDTAG=".*zone" MARKER="mark-$(date +%Y.%m.%d.%H.%M.%S)" REMOTE_HOST=sol10-target ZFSPARENT=rpool ssh $REMOTE_HOST zfs list -t filesystem -rHo name,mounted $ZFSPARENT | grep "/$IDTAG " > /tmp/actionlist #for RMT_FILESYSTEM in $(cat /tmp/actionlist) cat /tmp/actionlist | while read RMT_FILESYSTEM …

4
มีเชลล์ JavaScript หรือไม่
เมื่อเร็ว ๆ นี้ฉันทำงานกับ JS และฉันก็กระตือรือร้นกับภาษานี้มาก ฉันรู้ว่ามีnode.jsสำหรับรัน JS ที่ฝั่งเซิร์ฟเวอร์ แต่มีเชลล์ที่ใช้ JS เป็นภาษาสคริปต์หรือไม่ หากสิ่งนั้นมีอยู่จริงมันใช้งานได้และมั่นคงอย่างไร?

2
อธิบายคำสั่งเชลล์: shift $ (($ optind - 1))
ฉันไม่ได้เป็นผู้ชาย Linux แต่ติดอยู่ในสคริปต์บางอย่างที่ฉันต้องอ่านสำหรับโครงการของฉัน ดังนั้นทุกคนสามารถช่วยฉันในสิ่งที่คำสั่งนี้กำลังทำอะไรอยู่? shift $(($optind - 1))

3
ถ้าฉัน sudo เรียกใช้ไฟล์สคริปต์ Bash คำสั่งทั้งหมดภายในสคริปต์ Bash จะถูกเรียกใช้งานเป็น sudo ด้วยหรือไม่
ฉันต้องการเขียนสคริปต์หลังการติดตั้งอัตโนมัติใน Bash ( post-install.shเช่นชื่อ) สคริปต์จะเพิ่มและอัปเดตที่เก็บติดตั้งและอัพเดทแพ็คเกจโดยอัตโนมัติแก้ไขไฟล์กำหนดค่า ฯลฯ ตอนนี้ถ้าฉันรันสคริปต์นี้เช่นsudo post-install.shฉันจะได้รับแจ้งให้ป้อนsudoรหัสผ่านครั้งเดียวเท่านั้นหรือฉันจะต้องป้อนsudoรหัสผ่านในแต่ละการเรียกใช้คำสั่งภายในสคริปต์ซึ่งต้องsudoได้รับอนุญาตหรือไม่ กล่าวอีกนัยหนึ่งคำสั่งภายในสคริปต์ทุบตี 'สืบทอด' สิทธิ์การดำเนินการดังนั้นจะพูดหรือไม่ และถ้าพวกเขาทำจริง ๆแล้วยังมีความเป็นไปได้ไหมที่sudoสิทธิ์จะหมดเวลา (ตัวอย่างเช่นคำสั่งเฉพาะใช้เวลานานพอที่จะsudoหมดเวลา) หรือการป้อนsudoรหัสผ่านครั้งแรกจะมีอายุการใช้งานตลอดช่วงเวลาของสคริปต์ทั้งหมดหรือไม่

4
ทำไมชุด -e ไม่ทำงานภายใน subshells ด้วยวงเล็บ () ตามด้วย OR list ||?
ฉันใช้สคริปต์บางอย่างเช่นนี้เมื่อเร็ว ๆ นี้: ( set -e ; do-stuff; do-more-stuff; ) || echo failed นี่ดูดีสำหรับฉัน แต่มันใช้งานไม่ได้! ใช้ไม่ได้เมื่อคุณเพิ่มset -e ||หากปราศจากอย่างนั้นก็ใช้งานได้ดี: $ ( set -e; false; echo passed; ); echo $? 1 อย่างไรก็ตามหากฉันเพิ่มสิ่ง||นั้นset -eจะถูกละเว้น: $ ( set -e; false; echo passed; ) || echo failed passed การใช้เปลือกแยกที่แท้จริงจะทำงานตามที่คาดไว้: $ sh -c 'set -e; false; …

6
ออกจากเชลล์สคริปต์จากเชลล์ย่อย
ลองพิจารณาตัวอย่างนี้: stop () { echo "${1}" 1>&2 exit 1 } func () { if false; then echo "foo" else stop "something went wrong" fi } โดยปกติเมื่อfuncถูกเรียกมันจะทำให้สคริปต์หยุดทำงานซึ่งเป็นพฤติกรรมที่ตั้งใจไว้ อย่างไรก็ตามถ้ามันถูกดำเนินการใน sub-shell เช่น in result=`func` มันจะไม่ออกจากสคริปต์ ซึ่งหมายความว่ารหัสการโทรต้องตรวจสอบสถานะการออกของฟังก์ชั่นทุกครั้ง มีวิธีหลีกเลี่ยงสิ่งนี้หรือไม่? สิ่งนี้set -eมีไว้เพื่ออะไร?

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