เรียกใช้สคริปต์ในเชลล์ปัจจุบันโดยไม่ต้อง ก่อนคำสั่ง


26

หากสคริปต์ควรถูกดำเนินการในเชลล์ปัจจุบันสามารถทำได้โดยการเพิ่มจุดก่อนคำสั่ง:

   . ./somescript.sh

มีวิธีทำเช่นนี้โดยไม่ต้องพิมพ์จุดทุกครั้งหรือไม่ ตัวอย่างเช่นคำสั่งเปลี่ยนเป็น parent parent จากสคริปต์เอง?

คำตอบ:


22

อาจไม่ใช่สิ่งที่คุณต้องการ แต่คุณสามารถทำได้:

alias somescript.sh='. ./somescript.sh'

2
สิ่งนี้แก้ปัญหาของฉันได้อย่างสมบูรณ์แบบ ขอขอบคุณ!
alu

8

มีวิธีทำเช่นนี้โดยไม่ต้องพิมพ์จุดทุกครั้งหรือไม่ ตัวอย่างเช่นคำสั่งเปลี่ยนเป็น parent parent จากสคริปต์เอง?

ฉันไม่คิดว่ามี (นอกเหนือจากการพิมพ์source somescript.shแต่นั่นอาจไม่ใช่สิ่งที่คุณกำลังมองหา ^^)

หากคุณรันสคริปต์ตามปกติด้วย./somescript.shดังนั้นเชลล์จะ forks และเรียกใช้งานคำสั่งนี้ มันส่งคำสั่งไปยังเคอร์เนลแล้วเคอร์เนลตัดสินใจว่าจะดำเนินการคำสั่งนี้โดยการแยก#!บรรทัดภายในสคริปต์ เคอร์เนลจะเปิดตัวล่ามที่ระบุ (ในกรณีนี้อาจเป็นbashsubshell) ดังนั้นการปรับเปลี่ยนที่somescript.shทำกับสภาพแวดล้อมของมันจะถูกแยกในเชลล์ย่อยโดยไม่มีผลกระทบกับพาเรนต์เชลล์

หากคุณต้องการให้เชลล์อ่านสคริปต์โดยไม่ต้องเปิดใช้กระบวนการอื่นคุณต้องบอกด้วยการใช้คำสำคัญ.หรือsource


ขอบคุณสำหรับคำอธิบายโดยละเอียด :) ตอนนี้ฉันเห็นแล้วว่าไม่มีทางที่จะทำสิ่งนี้จากสคริปต์ที่เรียกว่า แต่โชคดีที่เชลล์พาเรนต์สามารถบอกไม่ให้สร้างเชลล์ย่อยด้วยaliasคำสั่งเหมือนสกอตต์ที่แนะนำ
alu

1

หากคุณดำเนินการ./somescript.shเป็นโปรแกรมภายนอกจะไม่สามารถทำสิ่งใดในกระบวนการเชลล์ที่กำลังทำงานอยู่เช่นการเข้าถึงตัวแปรที่ไม่ได้ถูกเอ็กซ์พอร์ตการตั้งค่าตัวแปรการเปลี่ยนไดเรกทอรีปัจจุบัน ฯลฯ ไม่มีวิธีแก้ไขปัญหานี้

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

. ./somescript.shคุณจำเป็นต้องใช้ คุณสามารถซ่อนที่อยู่ด้านหลังนามแฝงหรือฟังก์ชั่นได้หากต้องการ แต่ต้องกำหนดนามแฝงหรือฟังก์ชันอีกครั้งในพาเรนต์เชลล์


0

ฉันคิดว่าสคริปต์ที่คุณพยายามเรียกใช้นั้นไม่สามารถใช้งานได้ chmod a+x somescript.shจะเพิ่มบิตเรียกใช้งานสำหรับผู้ใช้กลุ่มและอื่น ๆ (ugo) ลงในไฟล์ บรรทัดแรกของไฟล์จะต้องมี #! #!/bin/bashแถวที่ด้านบนเช่น

ls -l somescript.shจะแสดง rwx triplets (อ่าน / เขียน / เรียกใช้) สำหรับไฟล์ มันจะต้อง x อย่างน้อยในชุดแรกสมมติว่าคุณเป็นเจ้าของไฟล์


สคริปต์ทำงานได้ดี แต่ฉันต้องการเรียกใช้งานในเชลล์ปัจจุบันเพื่อให้สามารถแก้ไขตัวแปรสภาพแวดล้อมของเชลล์ได้
alu

หากการส่งออกตัวแปรที่คุณต้องการในสคริปต์ไม่ทำงานเช่นexport PATH=$PATH:/usr/local/binการเพิ่ม / usr / local / bin ไปยัง $ PATH ของคุณคุณต้องทำการจัดหาไฟล์เพื่อเปลี่ยนตัวแปรสภาพแวดล้อมการทำงานของคุณ คำถามนี้เป็นคำถามที่ว่า "ฉันจะเปลี่ยนตัวแปรสภาพแวดล้อมของฉันในเชลล์ที่กำลังรันจากสคริปต์ทุบตีโดยทางโปรแกรมได้อย่างไร" สคริปต์. ./somescript.shกำลังดำเนินการได้ดี - คุณกำลังใช้คำสั่ง dot to source ในไฟล์ tcsh ใช้ "source" สำหรับสิ่งเดียวกัน
AR Diederich

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

จุดอาจถูกลืมได้ง่ายซึ่งสามารถเปลี่ยนลักษณะการทำงานของสคริปต์ได้อย่างสมบูรณ์
alu

0
export PATH=$PATH:.

การรันคำสั่งนั้นในเชลล์หรือเพิ่มลงในไฟล์คอนฟิกูเรชันเชลล์ของคุณจะผนวกไดเร็กทอรีปัจจุบันเข้ากับตัวแปร PATH ตัวแปร PATH คือรายการของไดเรกทอรีที่เชลล์ของคุณจะมองหาไบนารีเพื่อดำเนินการเมื่อคุณออกคำสั่ง

สิ่งนี้จะอนุญาตให้คุณเรียกใช้ไฟล์ปฏิบัติการใด ๆ ในไดเรกทอรีปัจจุบันโดยไม่ต้อง ./


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