คำสั่งที่ออกด้วยสถานะศูนย์ (ไม่ใช่ / bin / true)?


11

ฉันมี Makefile ที่เรียกใช้เครื่องมือที่ใช้เวลาสักครู่ มันทำให้ฉันสามารถแทนที่คำสั่งที่ใช้:

make TOOL=alternative-tool

ฉันต้องการข้ามขั้นตอนนั้นใน Makefile ดังนั้นฉันกำลังมองหาคำสั่งที่ออกด้วยสถานะ 0 และนั่นมีผลข้างเคียงเล็กน้อย

เห็นได้ชัดว่าฉันสามารถใช้trueแต่ก็ค่อนข้างสับสน:

make TOOL=true

สิ่งนั้นอ่านราวกับว่าฉันต้องการเรียกใช้เครื่องมือ แต่ฉันทำไม่ได้

มีไฟล์เรียกทำงานที่ติดตั้งมาให้เป็นค่าเริ่มต้นซึ่งไม่ได้อยู่ใน/bin/trueสถานะ 0 และมีชื่อที่พิมพ์ง่ายและพิมพ์ง่ายหรือไม่?


Makefiles สนับสนุนความเห็นgnu.org/software/make/manual/html_node/Makefile-Contents.html ใส่ความคิดเห็นต่อหน้าบรรทัดและบันทึกรหัสของคุณ ที่ช่วยลดความสับสนและอธิบายว่าทำไมคุณใช้วิธีการบางอย่าง
Freiheit

1
สายอะไร TOOL=trueจะอยู่ในบรรทัดคำสั่งเมื่ออัญเชิญทำให้อาจจะบันทึกไว้ใน README อยู่บริเวณใกล้เคียง บรรทัดจริงที่เรียกใช้เครื่องมืออยู่ในไฟล์ make-7000 (บุคคลที่สาม)
Roger Lipscombe

คำตอบ:


42

แม้ว่าคุณจะขอสิ่งที่ไม่ใช่/bin/true"แต่การแทนที่trueด้วยชื่อเต็ม/bin/trueเพื่อแสดงว่าเป็นtrueโปรแกรมมากกว่าความหมายอื่น ๆ ของ" ความจริง "อาจเป็นทางออกที่ดีที่สุด

ความกังวลของคุณคือการที่trueใน

make TOOL=true

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

make TOOL=/bin/true

แล้วนั่นคือคำสั่งอย่างไม่น่าสงสัย ใครบางคนอาจจะผิดTOOL=trueจะหมายถึงว่าบางที่ใดที่หนึ่งเครื่องมืออื่น ๆ ที่มีจุดมุ่งหมาย แต่ไม่มี misreading ดังกล่าวTOOL=/bin/trueมีแนวโน้มที่


ฉันไม่แน่ใจว่าเมื่อ:ใดซึ่งเป็น shell builtin แต่ไม่ใช่คำสั่งภายนอกจะทำงาน เฮนนิ่ง Makholmมีรายงานว่ามันจะปรากฏขึ้นในการทำงาน แต่ผมคิดว่ามันไม่ทำงานในทุกสถานการณ์และคุณพบว่ามันไม่ได้ทำงานให้กับคุณ

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


1
การใช้:ดูเหมือนว่าจะทำงานได้ดีสำหรับฉัน makeวางไข่เชลล์เพื่อเรียกใช้คำสั่งแต่ละคำสั่งเสมอหลังจากเสร็จสิ้นการแทนที่ของมันเอง
hmakholm ออกเดินทางจากโมนิก้า

@HenningMakholm ขอขอบคุณฉันแก้ไขแล้ว คุณอาจต้องการโพสต์คำตอบ Lok Lam Chengได้ให้ความเห็นเกี่ยวกับคำถามที่จะแนะนำ:แต่ควรเป็นคำตอบ (โดยเฉพาะอย่างยิ่งถ้าถูกต้อง) และความคิดเห็นนั้นไม่ได้อธิบายว่าทำไมคนเราควรคาดหวังให้มันทำงาน ในไดเรกทอรีที่มีhello.cและไม่มีการ Makefile ที่make helloคอมไพล์hello.cไปhelloผมพบว่าmake CC=: helloประพฤติตามสิ่งที่คุณพูด
Eliah Kagan

2
น่าเสียดายสำหรับ Makefile นี้โดยเฉพาะ (ใช้erlang.mk ) การใช้:ไม่ได้ผล การมีความชัดเจนเกี่ยวกับ/bin/trueอาจเป็นวิธีที่ดีที่สุดที่จะทำ
Roger Lipscombe

7

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

make TOOL=echo

ผมคิดว่านี่เป็นบางครั้งที่มีประโยชน์เมื่อมันสำคัญอย่างหนึ่งได้รับการเตือนว่าหนึ่งในการปราบปรามการกระทำสิ่งที่TOOLมิฉะนั้นจะทำ หากไม่มี-sหรือเทียบเท่าmakeปล่อยข้อมูลที่ซ้ำซ้อนเนื่องจากทั้งสองmakeและechoคำสั่งรันโดยmakeแยกเอาต์พุต ตัวอย่างเช่นเมื่อฉันทำงานmake CC=echo helloในไดเรกทอรีที่มีhello.cและไม่มี makefile ฉันจะได้รับecho hello.c -o helloเป็นบรรทัดแรกของการส่งออกและhello.c -o helloเป็นที่สอง แต่บิลด์บางตัวใช้ (หรือผู้ใช้อาจเพิ่ม) -sแล้วก็มีประโยชน์ ให้เพียงmake -s CC=echo hello hello.c -o hello
Eliah Kagan

(ซึ่งอาจยังมีประโยชน์หากคำสั่งเกี่ยวข้องกับการขยายเชลล์เพื่อให้คุณสามารถทราบแนวคิดที่ชัดเจนของสิ่งที่กำลังรันอยู่หากสนใจ)
muru

5

คุณสามารถสร้างคำสั่งของคุณเองได้โดยไม่ทำอะไรเลยนอกจากคืนสถานะเป็นศูนย์ออก ตัวเลือกบางอย่าง:

  • ลิงก์สัญลักษณ์ที่มีชื่ออย่างเหมาะสมเพื่อ /bin/true

  • สคริปต์เชลล์ว่าง

  • โปรแกรม C ที่ว่างเปล่าเกือบ:

    int main() {
        return 0;
    }

ชื่อที่ดีสำหรับโปรแกรมดังกล่าวคือ noop หรือ no-op
arp

0

สร้างลิงก์สัญลักษณ์ในไดเร็กทอรีการทำงานไปที่ / bin / true ที่ชื่อคล้ายskipๆ ดังนั้น...

skip -> /bin/true

จากนั้นบรรทัดสามารถเป็น ...

make TOOL=./skip

-2

นี่คือวิธีที่จะทำกับตัวละครอีกเล็กน้อย:

function T() { /bin/true; }

หลังจากที่คุณได้ทำมันเมื่อคุณสามารถ Tre-ดำเนินการได้โดยใช้เพียงแค่ชื่อ

false; T; echo $?

3
คุณกรุณาอธิบายวิธีการที่ฟังก์ชั่นนี้สามารถเรียกใช้จากค่าตัวแปร Make (เพื่อใช้ในสถานการณ์ที่เป็นปัญหา) ได้อย่างไร?
David Foerster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.