SHELL-FORMAT คืออะไรใน envsubst?


19

เมื่อฉันสะดุดenvsubstฉันต้องการใช้มันเพื่อแทนที่เฉพาะตัวแปรและสงสัยว่าพารามิเตอร์ SHELL-FORMAT อาจเป็นสิ่งที่ต้องการ แต่ฉันไม่สามารถใช้งานได้

น่าเสียดายที่หน้าmanและinfoไม่ให้ตัวอย่างการใช้งานใด ๆ และพูดเพียง

หากกำหนด SHELL-FORMAT เฉพาะตัวแปรสภาพแวดล้อมที่อ้างอิงใน SHELL-FORMAT เท่านั้นที่จะถูกแทนที่

ซึ่งไม่ได้บอกวิธีการอ้างอิงพวกเขา

คำตอบ:


20

ตามที่ระบุโดยข้อความคุณเพียงแค่ต้องอ้างอิง (เช่นโดย$VARNAMEหรือ${VARNAME}) ตัวแปรเช่นเดียวกับในคำสั่งเชลล์ปกติ อย่างไรก็ตามคุณต้องตรวจสอบให้แน่ใจว่าเชลล์ไม่ได้ขยายไปก่อน

นี่คือตัวอย่างที่แสดงให้เห็นถึงสิ่งนี้ (สมมติว่าexport FOO=BAR):

$ echo '$FOO$FOO2' | envsubst
BAR

อย่างที่คุณเห็น $ FOO2 ถูกแทนที่ด้วย "" เนื่องจากไม่ได้กำหนดไว้ ตอนนี้เราสามารถ จำกัด การแทนที่นั้นเพียง $ FOO โดย:

$ echo '$FOO$FOO2' | envsubst '$FOO'
BAR$FOO2

ใช้""แทน''จะนำไปสู่การทดแทนก่อนที่จะต้องการ:

echo '$FOO$FOO2' | envsubst "$FOO"
$FOO$FOO2

(จำนวนนี้เป็นการเรียกที่มีประสิทธิภาพenvsubst "BAR"ซึ่งตรวจพบว่าไม่มีตัวแปรดังนั้นจึงไม่มีการแทนที่)

ดังที่man-page กล่าวไว้ตัวแปรทั้งหมดที่อ้างถึงSHELL-FORMATจะถูกแทนที่ดังนั้นเราสามารถทำสิ่งนี้ได้:

echo '$FOO$FOO2$FOO3' | envsubst '$FOO some more text ${FOO3}'
BAR$FOO2

อย่างที่คุณเห็นSHELL-FORMATมันค่อนข้างยืดหยุ่น

ในที่สุดพารามิเตอร์--variablesช่วยให้คุณประเมินตัวแปรที่เลือกสำหรับการทดแทนโดยSHELL-FORMAT:

envsubst --variables '$FOO some more text ${FOO3}'
FOO
FOO3

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

$ envsubst --variables "$FOO"
(empty string returned)

ตามที่ระบุไว้ใน - manหน้าenvsubstไม่ประมวลผล stdinput ใด ๆ เมื่อ--variablesมีอยู่


8

นี่คือตัวอย่างที่ช่วยให้ฉันเข้าใจวิธีการใช้อย่างถูกต้อง มันน่าแปลกใจสำหรับฉันที่ envsubstonly แทนที่ตัวแปรที่กล่าวถึงในพารามิเตอร์

$ export FOOX="foox"
$ export FOOY="fooy"
$ export FOOZ="fooz"

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst            
x foox y fooy z fooz

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOX'
x foox y $FOOY z $FOOZ

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOX $FOOZ'
x foox y $FOOY z fooz

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOZ $FOOY'
x $FOOX y fooy z fooz

ฉันไม่เข้าใจว่า SHELL-FORMAT นั้นมีความหมายเหมือนกัน แต่ยังไม่รู้ว่าทำไมมันถึงมีชื่อแบบนั้น แต่หลังจากการทดลองข้างต้นฉันคิดว่าฉันรู้ว่ามันทำอะไร


สิ่งนี้ช่วยฉันได้มากหลังจากอ่านตัวอย่างเหล่านั้นจากความช่วยเหลือและข้อมูลของมนุษย์รู้เพียงว่ามีรูปแบบของเชลล์ แต่ไม่ทราบวิธีประกาศ!
zw963

0

การใช้คำฟุ่มเฟือยเป็นความสับสนเล็กน้อย หากต้องการใส่ข้อความช่วยเหลืออีกครั้งอย่างพิถีพิถัน:

SHELL-FORMATเป็นอาร์กิวเมนต์บรรทัดคำสั่งข้อความเพิ่มเติมที่มีการอ้างอิงถึงตัวแปรสภาพแวดล้อม $เพื่ออ้างอิงตัวแปรสภาพแวดล้อมในข้อความคำนำหน้าชื่อตัวแปรด้วย ตัวอย่างเช่น: Hello $FOO World $BARตัวแปรสภาพแวดล้อมของการอ้างอิงและFOO BARส่วนที่เหลือของสตริงจะถูกละเว้น หากSHELL-FORMATอาร์กิวเมนต์บรรทัดคำสั่งมีอยู่แล้วเมื่อการทดแทนตัวแปรเกิดขึ้นกับข้อความที่ได้รับผ่าน stdin จะถูก จำกัด เฉพาะตัวแปรที่อ้างอิงในSHELL-FORMATอาร์กิวเมนต์บรรทัดคำสั่ง

เพื่อที่จะตอบคำถามของคุณอย่างชัดเจน: $คำนำหน้าชื่อตัวแปรที่มี

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