อะไรคือความหมายของ $ {GZIP_BINDIR - '/ bin'} ในการทุบตี?


13

ใครสามารถอธิบายความหมายของคำสั่งนี้ได้บ้าง

PATH="${GZIP_BINDIR-'/bin'}:$PATH"; export PATH

คำตอบ:


19

${GZIP_BINDIR-'/bin'}เป็นbashรูปแบบการขยายพารามิเตอร์ จากman bash:

${parameter:-word}
              Use Default Values.  If parameter is unset or null, 
the expansion of word is substituted.  Otherwise, the  value  of parameter
is substituted.

ทันทีก่อนหน้าส่วนของหน้านี้จะมี (ขอบคุณ @jwodder สำหรับการแจ้งเตือน):

Omitting the colon results in a test only for a parameter that is unset.

ในฐานะที่เป็น manpage GZIP_BINDIRกล่าวว่ามันจะตั้งค่าเริ่มต้นของตัวแปร หากGZIP_BINDIRมีค่าตั้งก่อนหน้านี้ (นอกเหนือ null ในขณะที่คุณไม่ได้ใช้:) แล้วว่าค่าจะใช้มิฉะนั้นจะถูกใช้เป็นค่าของตัวแปร/binGZIP_BINDIR

ในทางกลับกันหากคุณต้องการทดสอบค่าว่างให้ใช้รูปแบบนี้ (รวม:):

${GZIP_BINDIR:-'/bin'}

หลังจากนั้น$PATHจะขยายไปยังค่าที่มันเคยเป็นมาก่อน ดังนั้นหากPATHก่อนหน้านี้มี:

/usr/sbin:/usr/bin

ตอนนี้คุณPATHจะ ( GZIP_BINDIRไม่ได้ตั้งค่าการพิจารณา):

/bin:/usr/sbin:/usr/bin

export PATHจะทำให้สิ่งนี้PATHพร้อมใช้งานสำหรับกระบวนการลูกทั้งหมด


" ฉันคิดว่าคุณพลาด:ใน${GZIP_BINDIR-'/bin'} " ไม่จำเป็น ${parameter-word}ถูกต้องเช่นกัน แต่ดูเหมือนจะไม่อยู่ในหน้าคน
nyuszika7h

@ nyuszika7h ใช่ .. ฉันไม่เคยรู้มาก่อนเลยว่าทำไมมันไม่รวมอยู่ใน manpage ..
heemayl

ใน manpage ทุบตีบนคอมพิวเตอร์ของฉันวรรคด้านขวาเหนือส่วนที่:-กล่าวว่า: "เมื่อไม่ได้ดำเนินการ substring การขยายตัวโดยใช้รูปแบบการบันทึกไว้ด้านล่าง (เช่น :-) ทดสอบทุบตีสำหรับพารามิเตอร์ที่เป็น unset หรือโมฆะ. ไม่ใส่ลำไส้ใหญ่ ผลลัพธ์ในการทดสอบเฉพาะสำหรับพารามิเตอร์ที่ไม่ได้ตั้งค่า "
jwodder

คุณสามารถรวมการตั้งค่าPATHและexportคำสั่งเดียวเข้าด้วยกันดังนี้:export PATH="${GZIP_BINDIR-'/bin'}:$PATH"
Paddy Landau

8

ไม่มีเครื่องหมายโคลอนอยู่ข้างหน้าเครื่องหมายขีดคั่นภายในการขยายพารามิเตอร์${GZIP_BINDIR-'/bin'}หรือไม่

โครงสร้างแบบนี้มักจะเขียนด้วยเครื่องหมายโคลอน${GZIP_BINDIR:-'/bin'}ซึ่งหมายความว่า "ถ้า $ GZIP_BINDIR เป็นค่า NULL หรือ unset ให้ตั้งค่าเป็น '/ bin'"

อย่างไรก็ตามไวยากรณ์ที่คุณให้มานั้นถูกต้อง แต่หายาก ${GZIP_BINDIR-'/bin'}(ไม่มีเครื่องหมายโคลอน) หมายความว่า "ถ้า $ GZIP_BINDIR ไม่ได้ตั้งค่าให้ตั้งเป็น '/ bin'" หากมีการตั้งค่า (ได้รับการประกาศ) แต่ไม่มีอะไรที่ได้รับมอบหมาย (เช่นมันเป็นโมฆะ) ไม่มีอะไรจะถูกแทรก

อาจมีข้อผิดพลาดที่นี่แม้ว่าในขณะที่โคลอนตามการสร้างตัวแปร (... } :$ PATH ... ) จะยังคงถูกแทรกหากตั้งค่า $ GZIP_BINDIR แต่เป็น NULL เนื่องจากสิ่งนี้จะเพิ่มโคลอนที่จุดเริ่มต้นของ $ PATH มันจะทำให้ไดเรกทอรีปัจจุบันถูกค้นหาก่อน

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

ในการปล่อยให้ $ PATH ไม่เปลี่ยนแปลงหากมีการตั้งค่า $ GZIP_BINDIR แต่เป็น NULL (ว่าง) ไวยากรณ์ที่ถูกต้องจะเป็น ${GZIP_BINDIR-'/bin:'}$PATH; export PATH

ในการปล่อยให้ $ PATH ไม่เปลี่ยนแปลงถ้า $ GZIP_BINDIR ไม่ได้ตั้งค่าไว้หรือถูกตั้งค่าไว้ แต่ NULL ไวยากรณ์ที่ถูกต้องจะเป็น ${GZIP_BINDIR:-'/bin:'}$PATH; export PATH


2

คำสั่งนี้อัพเดตตัวแปร PATH

PATHเป็นตัวแปรสภาพแวดล้อมระบุชุดของไดเรกทอรีที่โปรแกรมปฏิบัติการตั้งอยู่

PATH="${GZIP_BINDIR-'/bin'}:$PATH";

นี่เป็นการเพิ่มค่าของตัวแปรอื่นGZIP_BINDIRถ้าออกจาก PATH ก่อนหน้านี้ให้ใช้ / bin แทนและเพิ่มไปที่ PATH

export PATH

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

คุณต้องทราบว่านี่ไม่คงที่และคุณจะหลวมเมื่อคุณออกจากเปลือกของคุณ

ในการทำให้การแก้ไข PATH นี้เป็นแบบถาวรคุณต้องต่อท้ายบรรทัดเหล่านี้กับคุณ .bashrc

gedit .bashrc

และเพิ่มบรรทัด

export PATH="${GZIP_BINDIR-'/bin'}:$PATH"

จากนั้นเรียกใช้คำสั่ง

source .bashrc

GZIP_BINDIR เป็นตัวแปร
Maythux

สิ่งที่ไม่ถูกต้อง ไม่ฉันไม่ได้? ของฉันถูกลดระดับลงด้วย
Maythux

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