วิธีส่งคำสั่งจำนวนมากไปยัง shell และรอให้คำสั่งด้านหลังลงท้ายด้วย [ปิด]


16

ฉันมีคำสั่งประมาณ 20 คำสั่งและฉันต้องส่งสิ่งนี้ทั้งหมดไปยัง Unix shell และคัดลอกผลลัพธ์ แต่ฉันไม่รู้ว่าจะทำอย่างไร

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

คำสั่ง 1 - เชื่อมต่อกับเซิร์ฟเวอร์

รอจนกว่าคำสั่ง 1 เสร็จสิ้น

คำสั่ง 2 - อัปเดตข้อมูลทั้งหมดจากเซิร์ฟเวอร์ 1 เสร็จสิ้น

รอ.

3 คำสั่ง รับพารามิเตอร์

... และคำสั่งอื่น ๆ อีกมากมาย

ฉันพยายามด้วยcmd1 | cmd2 | cmd3 และ cmd1 & cmd2 & cmd3และcmd1;cmd2

ปัญหาเกิดcmd1จากการเชื่อมต่อกับ RNC (องค์ประกอบเครือข่าย) และใช้เวลา 15 วินาทีในการcmd2รับสัญญาณ แต่ทำงานสำหรับคำสั่งแรก เบาะแสใด ๆ วิธีการเรียกใช้นี้


3
ใช้สคริปต์หรือไม่? หรือ&&ระหว่างคำสั่ง
แบร์นฮาร์ด

คำตอบ:


20

โดยปกติแล้วเพียงแค่cmd1;cmd2;cmd3;cmd4(ถ้าคุณต้องการเขียนมันในหนึ่งบรรทัด) หรือใช้cmd1 && cmd2 && cmd3 && cmd4ถ้าคุณไม่ต้องการเรียกใช้ cmd3 เมื่อ cmd2 ล้มเหลว

หรือ;คุณสามารถเขียนหนึ่งคำสั่งต่อบรรทัด

cmd1
cmd2
cmd3
cmd4

หากคุณต้องการให้คำสั่งรันแบบขนานในพื้นหลังคุณสามารถใช้

cmd1 &
cmd2 &
cmd3 &
cmd4 &
wait # for cmd1-4 to finish

วิธีใดวิธีหนึ่งเหล่านี้สามารถใส่ในเชลล์สคริปต์ได้ มีความแตกต่างเล็กน้อยระหว่างสิ่งที่คุณเขียนในเชลล์สคริปต์และสิ่งที่คุณเขียนในเชลล์จริง


MM ปัญหาเมื่อฉันส่งcmd1มันต้องเสร็จประมาณ 6 วินาทีปัญหาเมื่อมันส่งcmd2และcmd1มันยังคงพิสูจน์ว่ามันล้มเหลว
Jonathan Raul Tapia Lopez

4
ในcmd1;cmd2กรณี (หรือcmd1 && cmd2สำหรับเรื่องนั้น) cmd2 จะไม่ทำงานจนกว่า cmd1 จะออก (และทำให้เสร็จสิ้นอย่างน่าจะเป็น) ดังนั้นไม่ควรมีปัญหาใด ๆ - โปรดใช้ถ้อยคำของคุณใหม่หรือแสดงตัวอย่างที่ผู้คนสามารถทำซ้ำได้จริง
frostschutz

ตกลงฉันจะแก้ไขคำถาม ขอบคุณ
Jonathan Raul Tapia Lopez

2

คุณอาจต้องการตรวจสอบsleepหากสภาพแวดล้อมของคุณอนุญาต cmd1 && sleep 10s && cmd2ลำดับที่สมบูรณ์ก็จะเป็นสิ่งที่ชอบ
นี่คือที่เกี่ยวข้องหน้าคนสำหรับการนอนหลับ


sleep / wait จะมีประโยชน์ก็ต่อเมื่อคุณทราบล่วงหน้าว่าโปรแกรมก่อนหน้านี้นานแค่ไหน (ซึ่งอาจเกิดกระบวนการแบ็กกราวด์) จะเสร็จสิ้นและออก (IE The Halting Problem) หรือถ้าคุณรับประกันว่าคุณต้องการขัดจังหวะและเรียกใช้คำสั่งที่สอง ผ่านไปแล้วซึ่งอาจเกิดขึ้นหากทั้งสองแบบอะซิงโครนัส แต่คุณยังต้องการเวลาระหว่างสิ่งนั้น เป็นไปได้ว่ามันไม่ใช่สิ่งที่คุณต้องการ อาจพูดได้ว่าใช้งานได้จริง แต่มันไม่น่าเชื่อถือ
Justin Reeves

1

เพียงแค่ใช้สคริปต์ไฟล์ที่มีคำสั่งให้รันหนึ่งไฟล์เช่น:

#!/bin/sh

command-01
command-02
...
command-20

บรรทัดแรก (shebang) บอกเพื่อเรียกใช้คำสั่งต่อไปใช้/bin/shให้ปฏิบัติการแฟ้ม ( chmod u+x your-little-script) ./my-little-scriptแล้วคุณสามารถเรียกใช้งานโดย ด้วยวิธีนี้คุณจะไม่ต้องละทิ้ง ;-)

อ่านคู่มือสำหรับเชลล์มันมีภาษาโปรแกรมเต็มรูปแบบ ตรวจสอบbash(1)ถ้านั่นคือสิ่งที่มีอยู่หรืออื่น ๆ ksh(1)เปลือกกร พวกเขามีคุณสมบัติที่มีประโยชน์มากมายสำหรับการควบคุมการไหลของการควบคุมในสคริปต์ (หรือแบบโต้ตอบสำหรับเรื่องนั้น)


ขอบคุณ แต่ฉันไม่สามารถใช้ scritps
Jonathan Raul Tapia Lopez

ทำไม? ในกรณีใด ๆ เว้นแต่นี้เป็นมากสภาพแวดล้อมฟาสซิสต์คุณควรจะสามารถไปยังแหล่งสคริปต์: source your-little-script(หรือ. your-little-scriptสั้น)
vonbrand

ด้วยเหตุนี้ฉันจึงไม่สามารถเข้าถึงระบบยูนิกซ์ที่ฉันมีเหมือนโปรแกรมขนาดเล็กที่อนุญาตให้เรียกใช้คำสั่ง cmd ในบรรทัดและรับผลลัพธ์ด้วยเสียงกรีดร้องและสำหรับการใช้งาน Im gonna ใช้กับคำสั่งนี้
Jonathan Raul Tapia Lopez

ตกลงนั่นจะอธิบายสิ่งต่าง ๆ ได้เล็กน้อย ... สภาพแวดล้อมต้นทาง / ปลายทางของคำสั่งของคุณคืออะไร คุณใช้อะไรในการจัดส่งคำสั่งเพื่อดำเนินการ สภาพแวดล้อมระยะไกลคืออะไร? มีการตั้งค่าของคุณที่นั่น (คุณมีบัญชีปกติที่คุณสามารถเข้าถึงผ่านsshหรือPuTTYอาจ?
vonbrand

-1

คุณสามารถเรียกใช้บางอย่างเช่นexpectในเครื่องคอมพิวเตอร์ของคุณเพื่อส่งcmd1และรอให้เสร็จก่อนที่จะออกcmd2ฯลฯ คุณต้องคิดระยะเวลาที่เหมาะสมเพื่อรอหรือเอาท์พุทเฉพาะที่ระบุว่าคำสั่งจะทำเพื่อเขียนที่เหมาะสม คาดว่าสคริปต์

แน่นอนcmd1; cmd2; cmd3; cmd4ในหนึ่งคำสั่งจะดำเนินการคำสั่งในลำดับหนึ่งหลังจากที่อื่น

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