ทำไมไม่ส่งออกตัวแปรในบรรทัดเดียวกับที่คุณกำหนดไว้


44

จากอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้าคืออะไร?

shellcheck บอกให้คุณไม่ส่งออกตัวแปรในบรรทัดเดียวกับที่คุณกำหนด

ฉันสงสัยว่าทำไม

ไม่คำแนะนำที่เดียวกันนำไปใช้กับalias, declare, export, local, readonlyและtypeset?




9
กฎ shellcheck ที่เป็นปัญหาคือ SC2155 มีเอกสารที่ดีงามที่ shellcheck คือวิกิพีเดีย
phunehehe

3
นอกจากนี้เชลล์รุ่นเก่าบางรุ่นจะไม่ยอมรับexportและกำหนดค่าร่วมกัน Heirloom บอร์นเชลล์ตัวอย่างเช่นเอาท์พุทเป็น "foo = 2 ไม่ได้เป็นตัวบ่งชี้ข้อผิดพลาด"
Dennis Williamson

คำตอบ:


54

ปัญหาก็คือว่าในคำสั่งทุบตีทุกคนมีเพียงหนึ่งรหัสทางออก เมื่อคุณexport foo="$(false)"รหัสทางออกของfalseถูกยกเลิกเพียง ถ้าคุณทำแทน

foo="$(false)"
export foo

คำสั่งแรกที่ล้มเหลวสามารถดำเนินการได้เช่นการerrexitตั้งค่า

การประกาศและการกำหนดสตริงตัวอักษรเช่นexport foo='bar'ไม่ทำให้เกิดปัญหานี้ แต่การเปลี่ยนแปลงนั้นเป็นสิ่งเดียวที่คงที่ในการพัฒนาซอฟต์แวร์และมันเป็นเพียงการทำความสะอาดที่ดีในการพิสูจน์ข้อความดังกล่าวในอนาคตโดยแยกออกเป็นส่วน ๆ

foo="$(false)$(true)"นอกเหนือไปจากคำสั่งที่ได้รับมอบหมายเฉพาะที่คุณพูดถึงนอกจากนี้ยังมีคำสั่งหลายในการกำหนดเดียวเช่น ดูpipefailในman bashสำหรับอีกกับดักดังกล่าว

สิ่งที่ต้องจำก็คือลำดับของการประกาศและการมอบหมายนั้นบางครั้งเกี่ยวข้องกัน ตัวอย่างเช่นคุณต้องการประกาศตัวแปรก่อนกำหนด (น่าเสียดายที่ไม่สามารถประกาศตัวแปรได้ก่อนที่จะกำหนดเป็นครั้งแรก)local readonly


ดังนั้นหากมีการตั้งค่าตัวแปรจากตัวอักษรและไม่มีรหัสทางออกที่จะทิ้งไม่มีอะไรผิดปกติกับการทำมันทั้งหมดในบรรทัดเดียว
Monty Harder

1
เท่าที่ข้อผิดพลาดเกี่ยวกับ shellcheck นี้ไม่เกี่ยวข้อง แต่เมื่อคำตอบที่ถูกลบตอนนี้มีครึ่งขวาระหว่างกันเชลล์เป้าหมายไม่สนับสนุนไวยากรณ์การมอบหมายexportดังนั้นหลายปีที่ผ่านมาได้รับภูมิปัญญาเกี่ยวกับการทำเช่นนี้หากล่ามตัวหนึ่งน่าจะเป็นเชลล์เป้าหมาย
JdeBP

@JdeBP โปรดทราบว่าเชลล์เป้าหมายได้สนับสนุนfoo=$(cmd) export fooแม้ว่าจะมีข้อแม้เดียวกันกับcmdสถานะการออกที่หายไป (แต่ทำให้เชลล์ออกจากการทำงานหากไม่สามารถset -eทำได้)
Stéphane Chazelas

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