การแทนที่ฟังก์ชันที่ผู้ใช้กำหนดด้วยชื่อเดียวกันกับคำสั่งระบบ


14

ฟังก์ชันนี้มีอยู่ในหนึ่งในผู้ใช้ของฉัน ~ / .bashrc:

function rm()
{
        ls $*
        echo "rm?"
        read ans
        if [ "$ans" == 'y' ]; then
                /bin/rm $*
        fi
}

ในสคริปต์ ksh ของฉันที่ผู้ใช้จำเป็นต้องเรียกใช้ฉันมีบรรทัดดังนี้:

[[ "$KEEP" = "" ]] && \rm $FILE

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

ฉันพบคำถาม & การตอบคำถาม superuser นี้แต่การแก้ปัญหาจะใช้กับฟังก์ชั่นบิวอินเท่านั้นไม่ใช่คำสั่งระบบ

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

คำตอบ:


13

คุณสามารถใช้commandเพื่อหลีกเลี่ยงการค้นหาฟังก์ชัน bash ปกติ

command rm

ตัวอย่างที่ไม่ทำลาย:

$ alias which='which -s'
$ function which { echo "which $@?" ; }
$ which which
which -s which?
$ command which which
/usr/bin/which

หรือเรียกมันว่าใช้env( เรียกใช้งานโปรแกรมแรกด้วยชื่อที่กำหนดใน$PATHหรือโดยการระบุพา ธ เต็ม

/usr/bin/env rm
/bin/rm

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

@acm ตามที่ฉันเขียนคุณสามารถไปตามenvเส้นทางได้ RM=$( /usr/bin/env which rm ); [much more code]; $RM some_file;นอกจากนี้คุณสามารถกำหนดตำแหน่งของเครื่องมือแต่ละครั้งและเก็บไว้ในตัวแปรเช่น คุณสามารถเปลี่ยนวิธีการเรียกใช้งานสคริปต์ของคุณได้ โดยปกติแล้วฟังก์ชั่นและนามแฝงจะไม่ได้รับมรดกมิฉะนั้นพวกเขาจะทำลายสคริปต์ตลอดเวลา
Daniel Beck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.