ฉันจะรับฟังก์ชั่น / นามแฝงที่กำหนดในสคริปต์ทุบตีที่ดาวน์โหลดจากเซิร์ฟเวอร์ (และดำเนินการ) เพื่อทำงานได้อย่างไร


1

ฉันมี.bashrcที่ฉันย้ายไปยังเซิร์ฟเวอร์เพื่อให้ฉันสามารถดาวน์โหลดและรันผ่านwget:

wget -O - http://xxx.github.io/dotfiles/bashrc | bash

มันได้รับการดำเนินการ แต่ฟังก์ชั่นและนามแฝงใด ๆ ที่กำหนดไว้ในสคริปต์นั้นไม่ทำงาน

มีวิธีใดที่จะทำให้ฟังก์ชั่นของฉันถูกกำหนดเหมือนที่มันจะเป็นถ้าสคริปต์นั้นรันในเครื่อง?


2
ปัญหาคือการทุบตีจะถูกดำเนินการเป็นลูกของเปลือกที่คุณดำเนินการคำสั่งนั้น ฟังก์ชันและนามแฝงในไฟล์ที่ดาวน์โหลดถูกกำหนดไว้ในสภาพแวดล้อมของกระบวนการลูกนั้น แต่ไม่ใช่สภาพแวดล้อมของผู้ปกครอง . bashrcวิธีเดียวที่ฉันรู้ว่าจะได้รับการนิยามเหล่านั้นลงในสภาพแวดล้อมที่เปลือกของคุณคือการบันทึกไฟล์ที่ดาวน์โหลดมาแล้วแหล่งที่มาของมันเช่น
garyjohn

คำตอบ:


1

ดังที่garyjohn อธิบายไว้ในความคิดเห็นของเขาปัญหาเกี่ยวกับ

wget   (ตัวเลือกและ args)   | ทุบตี
อย่างน้อยที่สุดก็คือบางเชลล์ (เห็นได้ชัดว่าเป็นหนึ่งในนั้น) ไพพ์ไลน์ ( ) บังคับให้คำสั่งส่วนประกอบทั้งหมดเข้าสู่กระบวนการแยกกัน เมื่อคุณรันกระบวนการเชลล์ bash ที่เพิ่งเกิดใหม่จะเป็นกระบวนการแยกจากเชลล์หลัก, หลัก, เชิงโต้ตอบ ฟังก์ชั่นนามแฝง ฯลฯ ที่กำหนดไว้ในเอาต์พุตของคำสั่งทางด้านซ้ายจะถูกกำหนดไว้ใน bash shell ใหม่ - ซึ่งจะออกโดยไม่อ่านคำสั่งใด ๆ จากเทอร์มินัล / แป้นพิมพ์ของคุณ เชลล์โดยไม่มีฟังก์ชั่น ฯลฯcmd1 | cmd2something | bash

ดังที่ garyjohn แนะนำวิธีหนึ่งในการแก้ปัญหานี้และรับฟังก์ชั่น, นามแฝง, อื่น ๆ ที่กำหนดไว้ในเชลล์หลักของคุณคือการดาวน์โหลดคำสั่งลงในไฟล์ เช่น,

wget -O - http://xxx.github.io/dotfiles/bashrc > bashrc  && bashrc && rm bashrc

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

.   <(wget -O - http://xxx.github.io/dotfiles/bashrc)

จะกำหนดฟังก์ชันนามแฝง ฯลฯ โดยไม่ต้องสร้างไฟล์ชั่วคราว


อีกวิธีคือ

wget -O - http://xxx.github.io/dotfiles/bashrc   |  . / dev / stdin
สิ่งนี้จะไม่ทำงานสำหรับทุบตี (เพราะทำตาม  . คำสั่งในเชลล์ย่อย) แต่มันอาจใช้ได้กับเชลล์อื่น ๆ (เช่น ksh)


แน่นอนว่าคำเตือนมาตรฐานจะมีผล: ระมัดระวังการดำเนินการคำสั่งที่คุณดาวน์โหลดจากเว็บ หากคุณใช้เซิร์ฟเวอร์ที่เพิ่มความแข็งบนเครือข่ายท้องถิ่นข้างต้นอาจค่อนข้างปลอดภัย มิฉะนั้นถ้าใครบางคนแฮ็คเว็บเซิร์ฟเวอร์คุณกำลังเปิดประตูให้เขาเรียกใช้คำสั่งโดยพลการบนเครื่องของคุณ มันจะปลอดภัยกว่า (แม้ว่าจะน่าเบื่อกว่าชัดเจนกว่า) ในการดาวน์โหลดคำสั่งลงในไฟล์แล้วทำการตรวจสอบมัน จากนั้นหากการตรวจสอบถูกต้องคุณสามารถแหล่งไฟล์


ที่เกี่ยวข้อง: ใช้sourceคำสั่งที่มีการโต้ตอบ
G-Man

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