Score:0

ส่งออกพารามิเตอร์ env ใหม่โดยไม่ต้องส่งออกไปยังเทอร์มินัล

ธง cn

ฉันกำลังพยายามเรียกใช้สคริปต์และ bash export กำลังส่งข้อความเมื่อฉันไม่ต้องการเพราะมันทำลายเอาต์พุต ฉันต้องเรียกใช้สคริปต์ที่แยกข้อมูลบางอย่างแล้วแทรกลงในสภาพแวดล้อมคำสั่งถัดไป เช่น การรับความลับ AWS สำหรับ awscli และส่งผ่านไปยังสภาพแวดล้อม aws อย่างโปร่งใส ฉันได้รับผลลัพธ์ที่ไม่สอดคล้องกันและฉันก็ไม่แน่ใจว่าทำไม

$ ./bin/aws-creds จำลอง
AWS_ACCESS_KEY_ID=mock1234
AWS_SECRET_ACCESS_KEY=mock1234
AWS_CREDS=สำเร็จ

$ ddt aws-creds จำลอง
AWS_ACCESS_KEY_ID=mock1234
AWS_SECRET_ACCESS_KEY=mock1234
AWS_CREDS=สำเร็จ

เอาต์พุตทั้งสองเท่ากัน ซึ่งดีมาก ลองเรียกใช้และใช้การส่งออกกับเอาต์พุต

$ ส่งออก $(./bin/aws-creds จำลอง)
$ ส่งออก $ (จำลอง ddt aws-creds)
AWS_ACCESS_KEY_ID=mock1234
AWS_SECRET_ACCESS_KEY=mock1234
AWS_CREDS=สำเร็จ
ประกาศ -x .... สิ่งพิเศษมากมายจากสภาพแวดล้อมของฉัน

รอสักครู่? คำสั่งทั้งสองเมื่อส่งออกโดยใช้ subshell $(...) ดูเหมือนจะทำสิ่งต่าง ๆ และนี่คือสิ่งที่ฉันต้องการแก้ไข ฉันต้องการสคริปต์ ./bin ตัวแรก ไม่มีเอาต์พุต แต่พารามิเตอร์ใหม่ทั้งหมดถูกแทรกลงในสภาพแวดล้อมของเชลล์ ดูเหมือนว่าสคริปต์ที่ฉันเขียน 'ddt' ไม่ทำงานในลักษณะเดียวกันด้วยเหตุผลบางประการ

ใครช่วยอธิบายสาเหตุและอาจแนะนำวิธีแก้ไขได้บ้าง

ph flag
`ddt` อาจส่งออกไปที่ stderr แทนที่จะเป็น stdout; ดู["ไม่ได้บันทึกเอาต์พุตในตัวแปร bash" ใน Stackoverflow](https://stackoverflow.com/questions/37115949/output-not-captured-in-bash-variable) คำเตือน: การใช้ stderr ของคำสั่งเป็นอาร์กิวเมนต์เพื่อ `export` อาจทำให้พยายามส่งออกข้อความแสดงข้อผิดพลาดจริง... ซึ่งไม่สมเหตุสมผลเลย
cn flag
คุณพูดถูกจริงๆ กอร์ดอน ฉันไม่เห็นความผิดพลาดนั้นเลย ขอบคุณมากที่ช่วยฉัน! โปรดใส่สิ่งนี้เป็นคำตอบเพื่อที่ฉันจะได้ทำเครื่องหมายว่าถูกต้อง! คำสั่ง 'ddt' ได้รับการกำหนดค่าไม่ถูกต้องเพื่อใช้ stderr เนื่องจากข้อผิดพลาดในการคัดลอก/วาง การส่งออกไปยัง stdout ใช้งานได้
Score:1
ธง ph

[ขยายความจากความคิดเห็น:] The ดีดีที คำสั่งกำลังส่งเอาต์พุตไปยังข้อผิดพลาดมาตรฐาน (stderr) แทนที่จะเป็นเอาต์พุตมาตรฐาน (stdout) และ $( ) จับ stdout เท่านั้น โดยทั่วไปมีสองวิธีในการแก้ไขปัญหานี้:

  1. ตัวเลือกที่ดีกว่าคือการแก้ไข ดีดีที ดังนั้นมันจึงส่งค่าตัวแปรไปที่ stdout แทนที่จะเป็น stderr
  2. หากไม่สามารถทำได้ คุณสามารถเพิ่ม 2>&1 หลังจาก ดีดีที คำสั่ง เพื่อเปลี่ยนเส้นทาง stderr ไปที่ stdout (และอนุญาต $( ) เพื่อจับมัน) แต่นี่ก็เสี่ยงว่าถ้า ดีดีที พิมพ์ข้อผิดพลาดที่เกิดขึ้นจริง จะดำเนินการต่อและพยายาม ส่งออก ข้อความเหล่านั้นด้วยผลลัพธ์ที่คาดเดาไม่ได้ (และอาจไม่เป็นที่พึงปรารถนา)

ดูคำถาม "เอาต์พุตไม่ได้บันทึกในตัวแปร bash" ใน Stackoverflow.

โพสต์คำตอบ

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