เหตุใดการกำหนดค่าจึงใช้ตัวแปรเป็นอาร์กิวเมนต์


10

เป็นVAR=value ./configureเช่นเดียวกับ./configure VAR=value?

ในกรณีแรกเชลล์ตั้งค่าตัวแปรสภาพแวดล้อมและในวินาทีที่สคริปต์กำหนดค่าจะใช้สตริง'VAR=value'เป็นอาร์กิวเมนต์จากนั้นจึงตั้งค่าตัวแปร ฉันสงสัยว่าการกำหนดค่าจะทำอย่างอื่นกับตัวแปร (อาจเพิกเฉยหรือกรองค่าบางอย่าง) และทำไมมันจึงใช้ตัวแปรเป็นอาร์กิวเมนต์ในตอนแรก

คำตอบ:


12

ในกรณีนี้

VAR=value ./configure

พฤติกรรมขึ้นอยู่กับเปลือกปัจจุบันของคุณในขณะที่อยู่ในนี้

./configure VAR=value

ลักษณะการทำงานขึ้นอยู่กับ configure-script นักพัฒนาบางคนชอบแบบหลังเพราะพวกเขาต้องการเลือกว่าจะตั้งค่าตัวแปรภายในสคริปต์หรือไม่แทนที่จะให้ใครบางคนตั้งค่าตัวแปรของสคริปต์จากภายนอกอย่างน่าอัศจรรย์

ในทางปฏิบัติมีความแตกต่างเพียงเล็กน้อยเพราะ

  • คนส่วนใหญ่ที่ทำการกำหนดค่ากำลังเรียกใช้จาก POSIX เชลล์ซึ่งพฤติกรรมเดิม "เพิ่งใช้งานได้" และ
  • สคริปต์กำหนดค่าส่วนใหญ่ไม่ได้ยกเลิกการตั้งค่าตัวแปรสภาพแวดล้อมที่มีอยู่และ
  • ตัวแปรสภาพแวดล้อมทั่วไป (อยู่ภายนอก automake) มีการใช้งานที่ยาวนาน

ตัวอย่างเช่นข้อความทุบตีกำหนดค่าสคริปต์--helpแสดงสิ่งนี้:

Some influential environment variables:
  DEBUGGER_START_FILE
              location of bash debugger initialization file
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  LIBS        libraries to pass to the linker, e.g. -l<library>
  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
              you have headers in a nonstandard directory <include dir>
  CPP         C preprocessor
  YACC        The `Yet Another C Compiler' implementation to use. Defaults to
              the first program found out of: `bison -y', `byacc', `yacc'.
  YFLAGS      The list of arguments that will be passed by default to $YACC.
              This script will default YFLAGS to the empty string to avoid a
              default value of `-d' given by some make applications.

และในแต่ละกรณีทั้งวิธีการตั้งค่าตัวแปรงาน

แต่โปรดคำนึงถึงความชอบของนักพัฒนาในกรณีที่มีคนตัดสินใจที่จะ "ปรับปรุง" สิ่งต่าง ๆ

อ่านเพิ่มเติม:

AC_ARG_VARแมโครจะใช้ในการประกาศโดยเฉพาะอย่างยิ่งตัวแปร (สภาพแวดล้อม) เป็นอาร์กิวเมนต์สำหรับสคริปต์ที่ให้มันมีรายละเอียดและการใช้งานโดยเฉพาะอย่างยิ่ง ในขณะที่คุณสมบัตินี้ได้รับการเพิ่มเข้ามาค่อนข้างเร็วในประวัติศาสตร์ของ autoconfแต่มันสำคัญมาก สะท้อนถึงการมีอยู่ล่าสุดของมันแมโครไม่ต้องการตัวAS_HELP_STRINGช่วยเหลือและรับพารามิเตอร์สองตัวเท่านั้น: ชื่อของตัวแปรและสตริงที่พิมพ์ระหว่าง. / config --help:

AC_ARG_VAR(var-name, help-string)

และแสดงความคิดเห็นเกี่ยวกับการปฏิบัติที่ยาวนาน:

โดยค่าเริ่มต้นกำหนดค่ารับตัวแปรจากสภาพแวดล้อมเช่นสคริปต์ sh อื่น ๆ ส่วนใหญ่จะถูกละเว้น สิ่งที่ไม่ควรถูกประกาศผ่านแมโครนี้ วิธีนี้พวกเขาถูกทำเครื่องหมายเป็นตัวแปรที่มีค่า

ตัวแปรที่ระบุว่ามีค่าจะได้รับการแทนที่ใน Makefile.inโดยไม่ต้องเรียกชัดเจนAC_SUBSTแต่นั่นไม่ใช่ส่วนที่สำคัญที่สุดของคำนิยาม สิ่งสำคัญคือตัวแปรถูกแคชไว้

  • 7.2 การตั้งค่าตัวแปรเอาต์พุต (
    อธิบายเอกสาร autoconf) AC_ARG_VARอีกครั้งแสดงการตั้งค่าของนักพัฒนา:

    ค่าของตัวแปรเมื่อเปิดใช้งานการกำหนดค่าจะถูกบันทึกไว้ในแคชรวมถึงหากไม่ได้ระบุในบรรทัดคำสั่ง แต่ผ่านสภาพแวดล้อม ในขณะที่การกำหนดค่าสามารถสังเกตเห็นคำจำกัดความของ CC ใน './configure CC = bizarre-cc' เป็นไปไม่ได้ที่จะสังเกตเห็นมันใน 'CC = bizarre-cc ./configure' ซึ่งน่าเสียดายที่ผู้ใช้ส่วนใหญ่ทำ


คุณอาจต้องการอธิบายว่าenv VAR=value ./configureเกี่ยวข้องกับอย่างไรVAR=value ./configure
Kusalananda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.