Bash: ถ้า [tar = error] [ปิด]


-1

ฉันต้องการเชลล์สคริปต์เพื่อเขียนข้อความขึ้นอยู่กับว่าtarสำเร็จหรือล้มเหลว แต่สคริปต์นี้ทำงานไม่ถูกต้อง:

TAR=$(tar -cf Archiv.tar myfolder/ myotherfolder/)
if [ ! "$TAR" = "/dev/null" ]; then
   echo "success"
else
  echo "error - no such Directory or file"
fi

อะไรคือปัญหา?


2
คุณจะต้องอธิบายสิ่งที่สคริปต์ควรทำและสิ่งที่ "ไม่ทำงาน" หมายถึง ฉันไม่เข้าใจเลยว่าทำไมคุณถึงต้องการพิมพ์ "สำเร็จ" ถ้า tar พิมพ์ "/ dev / null" และข้อความอื่นเป็นอย่างอื่น
psusi

คำตอบ:


4

ฉันไม่ทราบถึงสถานการณ์ที่tarจะส่ง/dev/nullสัญญาณออกไปเป็นข้อผิดพลาดซึ่งเป็นวิธีที่รหัสของคุณพยายามตรวจหาข้อผิดพลาด นี่เป็นวิธีที่ถูกต้องในการตรวจสอบข้อผิดพลาด:

if tar -cf Archiv.tar myfolder/ myotherfolder/
then
    echo "success"
else
    echo "error - no such Directory or file"
fi

คุณอาจไม่ต้องการelseกรณีเพราะtarตัวเองจะบ่นในกรณีนั้น หากการใช้งานของคุณ/dev/nullควรจะระงับการtarร้องเรียนเพื่อให้คุณสามารถแทนที่ข้อความของคุณเองบรรทัดแรกควรเป็น:

if tar -cf Archiv.tar myfolder/ myotherfolder/ > /dev/null 2>&1

โปรดสังเกตว่าเราไม่ได้ใช้วงเล็บเหลี่ยมที่นี่ นั่นเป็นนามแฝงสำหรับคำสั่งเชลล์ในตัวที่เรียกว่าtest(1)เป็นการดำเนินการทางตรรกะและส่งกลับ 0 หรือไม่ใช่ศูนย์เพื่อส่งสัญญาณความสำเร็จหรือความล้มเหลวตามลำดับ ifในการตรวจสอบการเปิดสำหรับการนี้ 0 / ผลตอบแทนไม่ใช่ศูนย์ดังนั้นเพื่อที่จะตรวจสอบความสำเร็จของโปรแกรมเช่นtarที่ส่งกลับไม่ใช่ศูนย์ในความล้มเหลวคุณไม่จำเป็นต้องเกี่ยวข้องกับหรือนามแฝงของมันtest[

หากคุณได้รับการฝึกอบรมเกี่ยวกับภาษาการเขียนโปรแกรมที่จำเป็นต้องมีเครื่องหมายวรรคตอนล้อมรอบการifแสดงออกบางอย่างเพื่อให้ไม่มีเครื่องหมายวรรคตอนมารบกวนคุณที่นี่คุณสามารถเขียนบรรทัดแรกดังนี้:

tar -cf Archiv.tar myfolder/ myotherfolder/
if [ $? = 0 ]

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

นี่อาจจะชัดเจนกว่า แต่ก็สิ้นเปลืองไปหน่อย


ขอบคุณ Warren Young! และฉันสามารถ "ดำเนินการ" ได้หรือไม่? ตัวอย่าง: ถ้า [$ TAR = 0]
Jannyeis

@ Jannyeis: ฉันไม่แน่ใจว่าคุณหมายถึงอะไร หากคุณทำงานtarข้างใน$()เหมือนในรหัสต้นฉบับของคุณคุณจะจับเอาท์พุทของมัน ดังนั้นการเปรียบเทียบผลลัพธ์ที่เป็น 0 จึงไม่น่าจะทำสิ่งที่คุณต้องการ คุณสนใจรหัสสถานะทางออกที่นี่ไม่ใช่เอาท์พุทข้อความของโปรแกรม
Warren Young

0

ตามปกติมีอีกวิธีหนึ่งที่จะทำสิ่งที่คุณพยายามทำ
นี่เป็นวิธี (อาจกะทัดรัด) ในการทำ:

#!/bin/bash
TAR_COMMAND='tar -cf Archiv.tar myfolder/ myotherfolder/ 2>/dev/null'
MSG_OK='### Work well DONE ### '   # A more common way to use a variable
MSG_ERR='### OPS IT FAILS ###  '    

$TAR_COMMAND && echo $MSG_OK || echo $MSG_ERR

โน้ตสั้น ๆ

  • ถ้าคุณมีไม่จำเป็นต้องเก็บสถานะทางออก (หรือรหัสทางออก) ของคำสั่งของคุณคุณสามารถใช้งานได้ทันทีหลังจากที่ผู้ประกอบการและ , &&และ OR , || [ 1 ]
    ตรรกะ: cmd1 && cmd2, cmd2จะดำเนินการเฉพาะในกรณีที่cmd1ออกไม่มีข้อผิดพลาด (มีรหัสจบ0) แต่ด้วยcmd1 || cmd3, cmd3จะดำเนินการเฉพาะในกรณีที่cmd1จะออกมีข้อผิดพลาด (รหัสข้อผิดพลาดที่แตกต่างจาก0)

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

    mycommand               # you execute your command
    ExitCodeToUseLater=$?   # So I can use it later in the script
    # ... other stuffs ...
    [ $ExitCodeToUseLater = 0  ]  && echo "It was gone ok " 
    # ... again other stuffs ...
    [ $ExitCodeToUseLater = 0  ] || echo "# Never a time that it goes as I want"
  • ในการเขียนสคริปต์ bash รวมถึงใน makefiles [ 2a , 2b ]คุณสามารถค้นหาคำสั่งที่มีตัวเลือกมากมายที่เขียนในตัวแปรเพื่อให้สามารถอ่านโค้ดได้มากขึ้น (ดังที่คุณเห็นด้านบนของTAR_COMMANDตัวแปร) เขียนในเปลือกตัวแปร$MyVarมันจะเหมือนกันที่จะเขียนในเปลือกสิ่งที่เขียนอยู่ภายใน[ 3 ] มันทำงานในสคริปต์ด้วย คุณอาจต้องใส่ใจกับการขยาย bash และกฎการแทนที่ซึ่งคุณสามารถอ่านเพิ่มเติมman bashได้

  • /dev/nullเป็นอุปกรณ์ Null [ 4 ] , "แฟ้มอุปกรณ์ที่เหลือใช้ข้อมูลทั้งหมดที่เขียนไป แต่รายงานว่าการดำเนินการเขียนประสบความสำเร็จ" มันสามารถนำมาใช้เพื่อให้การป้อนข้อมูลที่ว่างเปล่าเพื่อสั่ง ( </dev/null) หรือผ่านใน "เงียบแน่นอน" ออกมาตรฐานหรือข้อผิดพลาดมาตรฐาน[ 5 ]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.