chdir (<directory>) tidak mengubah direktori setelah keluar ke shell

8

Saya ingin membuat Cprogram sederhana untuk berubah ke direktori proyek saya. Isinya sebagai berikut:

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

Saya mengkompilasinya dengan perintah berikut ( pro.cadalah nama file-nya):

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

Tidak ada kesalahan atau peringatan. Tetapi ketika saya menjalankannya, itu tidak mengubah direktori. Mengapa?

enedil
sumber
1
Anda bisa menggunakan alias sebagai gantinya -alias proj='cd ~/enedil/projects/algo'
Michael Durrant
@MichaelDurrant oh, maksudmu cd ~/projects/algo? Itu ide!
enedil
1
Ini dengan desain!
Thorbjørn Ravn Andersen

Jawaban:

15

Program Anda tidak persis apa yang Anda katakan untuk melakukan: ia mengubah direktori kerja untuk dirinya sendiri untuk /home/enedil/projects/algo. Tapi begitu keluar, direktori kerja shell dipulihkan.

Saya kira apa yang ingin Anda capai adalah mengubah direktori kerja dari proses induk, yaitu shell, tanpa menggunakan cara yang sederhana cd. Ada metode , tetapi seperti yang dikatakan penulisnya: jangan lakukan itu.

Kempniu
sumber
8
Nitpick, tetapi direktori kerja shell tidak dipulihkan, karena itu tidak pernah berubah. Shell hanyalah sebuah proses, sama seperti programnya. Setiap program memiliki direktori kerjanya sendiri.
Patrick
1
@ Patrick, benar. Secara konseptual lebih akurat adalah direktori kerja Anda dipulihkan, karena proses Anda "dipulihkan" (aktif di latar depan).
Paul Draper
5

Direktori kerja saat ini bersifat lokal untuk proses. Jadi, apa yang Anda inginkan tidak mungkin.

vinc17
sumber
1

Anda juga dapat menggunakan CDPATHvariabel lingkungan. Sebagaimana dijelaskan dalam 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".

Jadi, misalnya, Anda dapat menambahkan baris ini ke ~/.profile:

CDPATH=~/projects

Anda sekarang dapat menjalankan cd projectsdari direktori mana saja dan pindah ke ~/projects.

BLIELI
sumber
0

Untuk melakukan ini untuk shell, gunakan sourceperintah (alias ke .). Ini akan menjalankan aplikasi dalam konteks shell saat ini daripada membuat konteks shell baru. Ini adalah bagaimana Anda dapat mengatur variabel lingkungan juga. Jika Anda melihat semua skrip startup di /etc/rc.datau /etc/init.d, Anda akan melihat banyak skrip yang disertakan oleh skrip lain dengan perintah

. /etc/init.d/rcvars

The .menyebabkan script /etc/init.d/rcvarssehingga apa pun yang berubah tetap berlangsung dalam lingkungan saat ini.

Walter
sumber
1
Anda tidak dapat menjalankan program C dengan cara ini, hanya skrip shell.
John Kugelman