คำนำหน้าสำหรับแต่ละเอาต์พุตของคำสั่งบนรันไทม์


16

ฉันกำลังพยายามสร้างสคริปต์แบบแยกส่วน ฉันมีหลายสคริปต์ / คำสั่งที่เรียกจากสคริปต์เดียว
ฉันต้องการคำนำหน้าเอาต์พุตของแต่ละคำสั่งแยกกัน

Examle:

ไฟล์ของฉันคือallcommands.sh / command1.sh / command2.sh

command1.shเอาต์พุต
file exists
file moved

command2.shเอาต์พุต
file copied
file emptied

allcommands.shรันสคริปต์command1.shและcommand2.sh

ฉันต้องการคำนำหน้าแต่ละเอาต์พุตของสคริปต์ทั้งสองนี้:
[command1] file exists
[command1] file moved
[command2] file copied
[command2] file emptied


ลองเรียกใช้แต่ละคำสั่งsed "s/\^/command1 /"
ไพพ์

โปรดยกตัวอย่างพร้อมข้อมูลที่ฉันให้ ฉันไม่เข้าใจsedฟังก์ชันการทำงานจริงๆ ฉันขอโทษ.
Ivan Dokov

คำตอบ:


21

ฉันคิดว่าสิ่งที่คุณทำใน allcommands.sh ของคุณคือ:

command1.sh
command2.sh

เพียงแค่ relace มันด้วย

command1.sh | sed "s/^/[command1] /"
command2.sh | sed "s/^/[command2] /"

9

ตัวอย่างน้อยที่สุดของallcommands.sh:

#!/bin/bash
for i in command{1,2}.sh; do
    ./"$i" | sed 's/^/['"${i%.sh}"'] /'
done

ด้วยcommand1.shและcommand2.shสามารถเรียกใช้งานได้และในไดเรกทอรีเดียวกันเพียงแค่echoใช้สตริงที่ต้องการสิ่งนี้จะให้ผลลัพธ์ของเชลล์:

$ ./command1.sh 
file exists
file moved
$ ./command2.sh 
file copied
file emptied
$ ./allcommands.sh 
[command1] file exists
[command1] file moved
[command2] file copied
[command2] file emptied

sedสลายอย่างรวดเร็ว

sed 's/^/['"${i%.sh}"'] /'
  • s/ เข้าสู่โหมด "จับคู่รูปแบบ regexp และแทนที่"
  • ^/ หมายถึง "จับคู่จุดเริ่มต้นของทุกบรรทัด"
  • ${i%.sh}เกิดขึ้นในบริบทของเชลล์และหมายถึง " $iแต่ตัดส่วนต่อท้าย.sh"
  • ['"${i%.sh}"'] /ในตอนแรกพิมพ์ a [จากนั้นออกจากบริบทที่ยกมาเพื่อจับ$iตัวแปรจากเชลล์จากนั้นป้อนอีกครั้งเพื่อสิ้นสุดด้วย]a และเว้นวรรค

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