chdir (<thư mục>) không thay đổi thư mục sau khi thoát khỏi shell


8

Tôi muốn tạo một Cchương trình đơn giản để thay đổi thư mục dự án của tôi. Nội dung của nó như sau:

#include <unistd.h>
int main()
{
    chdir("/home/enedil/projects/algo");
    return 0;
}

Tôi đã biên dịch nó bằng lệnh sau ( pro.clà tên tệp của nó):

gcc pro.c -o /usr/local/bin/pro

Không có lỗi cũng không có cảnh báo. Nhưng khi tôi chạy nó, nó không thay đổi thư mục. Tại sao?


1
Bạn có thể sử dụng bí danh thay thế -alias proj='cd ~/enedil/projects/algo'
Michael Durrant

@MichaelDurrant oh, ý bạn là cd ~/projects/algogì? Đó là một ý tưởng!
enedil

1
Đây là do thiết kế!
Thorbjørn Ravn Andersen

Câu trả lời:


15

Chương trình của bạn thực hiện chính xác những gì bạn nói với nó để làm: nó thay đổi thư mục làm việc cho bản thân để /home/enedil/projects/algo. Nhưng một khi nó thoát ra, thư mục làm việc của shell được khôi phục.

Tôi đoán những gì bạn muốn đạt được là thay đổi thư mục làm việc của tiến trình cha, tức là shell, mà không cần dùng đến một cách đơn giản cd. Có một phương pháp , nhưng như tác giả của nó nói: đừng làm điều đó.


8
Nitpick, nhưng thư mục làm việc của shell không được khôi phục, vì nó không bao giờ thay đổi. Shell chỉ đơn giản là một quá trình, giống như chương trình. Mỗi chương trình có thư mục làm việc riêng của nó.
Patrick

1
@Patrick, đúng. Về mặt khái niệm chính xác hơn sẽ là thư mục làm việc của bạn được khôi phục, trong đó quy trình của bạn được "khôi phục" (đang hoạt động ở nền trước).
Paul Draper

5

Thư mục làm việc hiện tại là cục bộ của quá trình. Vì vậy, những gì bạn muốn là không thể.


1

Bạn cũng có thể sử dụng CDPATHbiến môi trường. Như đã giải thích trong man bash:

   CDPATH The search path for the cd command.  This is  a  colon-separated
          list  of  directories  in  which the shell looks for destination
          directories specified by the cd  command.   A  sample  value  is
          ".:~:/usr".

Vì vậy, ví dụ, bạn có thể thêm dòng này vào ~/.profile:

CDPATH=~/projects

Bây giờ bạn có thể chạy cd projectstừ bất kỳ thư mục và di chuyển đến ~/projects.


0

Để làm điều này cho shell, sử dụng sourcelệnh (bí danh là .). Nó sẽ chạy ứng dụng trong ngữ cảnh của shell hiện tại thay vì tạo bối cảnh shell mới. Đây là cách bạn có thể thiết lập các biến môi trường. Nếu bạn nhận thấy tất cả các tập lệnh khởi động trong /etc/rc.dhoặc /etc/init.d, bạn sẽ thấy rất nhiều tập lệnh được bao gồm bởi các tập lệnh khác với lệnh

. /etc/init.d/rcvars

Các .nguyên nhân gây ra kịch bản /etc/init.d/rcvarsđể bất cứ điều gì nó thay đổi vẫn tồn tại trong môi trường hiện tại.


1
Bạn không thể chạy chương trình C theo cách này, chỉ một tập lệnh shell.
John Kugelman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.