สิ่งที่คุณพยายามทำนั้นไม่มีทางเป็นไปได้ เหตุผลก็คือในระบบ POSIX (Linux, OSX ฯลฯ ) กระบวนการลูกไม่สามารถแก้ไขสภาพแวดล้อมของกระบวนการหลักได้ ซึ่งรวมถึงการแก้ไขไดเร็กทอรีการทำงานของกระบวนการพาเรนต์และตัวแปรสภาพแวดล้อม
เมื่อคุณอยู่ใน commandline และคุณจะไปดำเนินการ Node สคริปต์ของคุณกระบวนการปัจจุบันของคุณ ( bash
, zsh
สิ่ง) spawns กระบวนการใหม่ที่มีมันเป็นสภาพแวดล้อมที่ตัวเองมักจะสำเนาของสภาพแวดล้อมในปัจจุบันของคุณ (มันเป็นไปได้ที่จะเปลี่ยนผ่านระบบโทรศัพท์ ; แต่อยู่นอกเหนือขอบเขตของการตอบกลับนี้) ทำให้กระบวนการดังกล่าวสามารถทำสิ่งที่จำเป็นต้องทำด้วยการแยกอย่างสมบูรณ์ เมื่อกระบวนการย่อยออกการควบคุมจะถูกส่งกลับไปยังกระบวนการของเชลล์โดยที่สภาพแวดล้อมไม่ได้รับผลกระทบ
มีสาเหตุหลายประการสำหรับสิ่งนี้ แต่สำหรับหนึ่งลองนึกดูว่าคุณเรียกใช้สคริปต์ในพื้นหลัง (ผ่าน./foo.js &
) และในขณะที่ทำงานสคริปต์ก็เริ่มเปลี่ยนไดเร็กทอรีการทำงานของคุณหรือแทนที่PATH
ไฟล์. นั่นคงเป็นฝันร้าย
หากคุณจำเป็นต้องดำเนินการบางอย่างที่ต้องเปลี่ยนไดเร็กทอรีการทำงานของเชลล์คุณจะต้องเขียนฟังก์ชันในเชลล์ของคุณ ตัวอย่างเช่นหากคุณใช้ Bash คุณสามารถใส่สิ่งนี้ไว้ใน~/.bash_profile
:
do_cool_thing() {
cd "/Users"
echo "Hey, I'm in $PWD"
}
แล้วสิ่งที่ยอดเยี่ยมนี้ก็ทำได้:
$ pwd
/Users/spike
$ do_cool_thing
Hey, I'm in /Users
$ pwd
/Users
หากคุณต้องการทำสิ่งที่ซับซ้อนมากขึ้นนอกจากนี้คุณสามารถเรียกใช้สคริปต์ nodejs จากฟังก์ชันนั้นได้ตลอดเวลา
นี่เป็นวิธีเดียวที่คุณจะทำได้ในสิ่งที่คุณพยายามทำ