Những gì bạn đang cố gắng làm là không thể. Lý do cho điều này là trong hệ thống POSIX (Linux, OSX, v.v.), một quy trình con không thể sửa đổi môi trường của một quy trình mẹ. Điều này bao gồm sửa đổi thư mục làm việc của quy trình mẹ và các biến môi trường.
Khi bạn ở trên dòng lệnh và bạn thực thi tập lệnh Node của mình, quy trình hiện tại của bạn ( bash
, zsh
bất cứ điều gì) tạo ra một quy trình mới có môi trường riêng của nó, thường là bản sao của môi trường hiện tại của bạn (có thể thay đổi điều này thông qua lệnh gọi hệ thống ; nhưng điều đó nằm ngoài phạm vi của câu trả lời này), cho phép quá trình đó làm bất cứ điều gì cần làm một cách hoàn toàn riêng biệt. Khi quy trình con thoát ra, quyền kiểm soát được trao lại cho quy trình của shell của bạn, nơi môi trường không bị ảnh hưởng.
Có rất nhiều lý do cho điều này, nhưng đối với một, hãy tưởng tượng rằng bạn thực thi một tập lệnh trong nền (qua ./foo.js &
) và khi nó chạy, nó bắt đầu thay đổi thư mục làm việc của bạn hoặc ghi đè của bạn PATH
. Đó sẽ là một cơn ác mộng.
Nếu bạn cần thực hiện một số hành động yêu cầu thay đổi thư mục làm việc của shell, bạn sẽ cần viết một hàm trong shell của mình. Ví dụ: nếu bạn đang chạy Bash, bạn có thể đặt điều này vào ~/.bash_profile
:
do_cool_thing() {
cd "/Users"
echo "Hey, I'm in $PWD"
}
và sau đó điều thú vị này có thể làm được:
$ pwd
/Users/spike
$ do_cool_thing
Hey, I'm in /Users
$ pwd
/Users
Ngoài ra, nếu bạn cần thực hiện những việc phức tạp hơn, bạn luôn có thể gọi tập lệnh nodejs của mình từ hàm đó.
Đây là cách duy nhất bạn có thể hoàn thành những gì bạn đang cố gắng làm.