การนำ dry-run ไปใช้ในสคริปต์ทุบตี


15

วิธีหนึ่งจะใช้ตัวเลือกแห้งรันในสคริปต์ทุบตี?

ฉันสามารถคิดถึงการห่อคำสั่งทุกคำสั่งในคำสั่ง if และ echoing คำสั่งแทนที่จะเรียกใช้ถ้าสคริปต์รันด้วยการรันแบบแห้ง

อีกวิธีหนึ่งคือการกำหนดฟังก์ชั่นแล้วส่งการเรียกแต่ละคำสั่งผ่านฟังก์ชันนั้น

สิ่งที่ต้องการ:

function _run () {
    if [[ "$DRY_RUN" ]]; then
        echo $@
    else
        $@
    fi
}

`_run mv /tmp/file /tmp/file2`

`DRY_RUN=true _run mv /tmp/file /tmp/file2`

นี่เป็นสิ่งที่ผิดและมีวิธีที่ดีกว่าในการทำเช่นนี้?


ดังนั้นคุณต้องการพิมพ์สิ่งที่คำสั่งจะทำ (รวมถึงค่าของ $ VARIABLES) โดยไม่ต้องดำเนินการตามคำสั่งจริง ฉันใช้บางอย่างเช่น_run()ฟังก์ชั่นของคุณบางครั้งด้วย 'set -xv' แต่ฉันชอบวิธีที่ดีกว่า
Stefan Lasiewski

ใช่แล้ว ฉันสงสัยว่าถ้าไม่มีตัวแปรภายในคุณสามารถตั้งค่าเป็น bash ได้ดังนั้นคำสั่งจะไม่ทำงานจริง ๆ แทนที่จะส่งผ่านฟังก์ชั่น
Andrei Serdeliuc

2
ไม่มีเหตุผลที่คำถามนี้ควรถูกทำเครื่องหมายว่าเป็นชุมชน wiki
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

Bash เป็นเปลือก ไม่มีเหตุผลที่จะทำแห้ง ฉันไม่คิดว่าจะมีวิธีที่ดีกว่าในการทำมากกว่าที่คุณทำไปแล้ว
d -_- b

คำตอบ:


2

ดูBashFAQ / 050: ฉันพยายามใส่คำสั่งในตัวแปร แต่กรณีที่ซับซ้อนมักจะล้มเหลว! สำหรับการสนทนาในหัวข้อนี้

แม้ว่าตอนนี้จะถูกลบออกส่วนวิธีการเพิ่มความสามารถในการทดสอบไปยังโปรแกรมอาจยังคงมีประโยชน์


ไม่ใช่ทางเลือก แต่ดูเหมือนว่าเป็นแหล่งข้อมูลที่ยอดเยี่ยมสำหรับการทดสอบและการทำงานกับโปรแกรมทุบตีอีกต่อไป
Andrei Serdeliuc

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

มันจะมีประโยชน์มากขึ้นถ้าคำตอบนี้สรุปประเด็นสำคัญของบทความนี้ คำตอบหนึ่งบรรทัดยังคงเป็นคำตอบที่ไม่ดี
Mark Booth

4

ฉันต้องการเล่นกับคำตอบจาก @Dennis Williamson นี่คือสิ่งที่ฉันได้รับ:

Run () {
    if [ "$TEST" ]; then
        echo "$*"
        return 0
    fi

    eval "$@"
}

เป็นสิ่งที่สำคัญที่นี่และจะดีกว่าแล้วก็ทำeval "$@" ส่งคืนพารามิเตอร์ทั้งหมดและส่งคืนพารามิเตอร์ทั้งหมดโดยไม่มี whitespace / quoting$*$@$*

$ mkdir dir
$ touch dir/file1 dir/file2
$ FOO="dir/*"
$ TEST=true Run ls -l $FOO
ls -l dir/file1 dir/file2
$ Run ls -l $FOO
-rw-r--r--  1 stefanl  stefanl  0 Jun  2 21:06 dir/file1
-rw-r--r--  1 stefanl  stefanl  0 Jun  2 21:06 dir/file2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.