2015-01-11 3 views
2

Я использую chdir(), чтобы сменить каталог на значение, переданное в качестве аргумента этой функции.Использование chdir() для изменения каталога с терминала

Я понимаю, что когда я запускаю свою программу на С, используя gcc myCd.c и ./a.out .., это изменяет каталог на родительский каталог «внутри» программы C (то есть дочерний процесс порождается для процесса a.out и смена каталога происходит в рамках этого дочернего процесса).

Что я хочу сделать, измените каталог на терминале с помощью этой программы на C. Я попытался написать сценарий оболочки для этого же, а затем найти его и запустить, который работает, но я хотел достичь этого, используя C.

+0

вы можете объяснить, что снабжаем сценарий? –

+0

на терминале, вводящем 'source scriptname' очень похоже '. scriptname 'Примечание: «источник» недоступен на каждом языке сценариев. Обычно он может быть найден в csh и bash – user3629249

+0

@ Anton.P, путем поиска сценария, который я имел в виду, запуская сценарий одним из двух способов: 1. '. myScript.sh' 2. 'source myScript.sh' Но, как указал @ user3629249, он не доступен на всех языках сценариев. Так что придется думать о еще одном выходе! –

ответ

3

Что вы пытаетесь сделать, не может быть сделано. Текущий рабочий каталог является атрибутом для каждого процесса.

Если вы запустите программу, которая меняет ее cwd, она не влияет на другие процессы, за исключением любых детей, которые она могла бы создать после chdir().

Правильный способ изменить рабочий каталог терминала - использовать команду cd, которую оболочка выполняет от вашего имени и остается в том же процессе. То есть, cd является одной из нескольких команд, которые оболочка не имеет fork(); это заставляет команду cd работать должным образом.

source В файле оболочки он запускается в процессе оболочки. Однако, если бы вы запускали скрипт без source, вы обнаружили бы ту же проблему, что и в программе C: оболочка вилки для создания процесса для запуска сценария, запуска и завершения, а затем оболочка продолжается, но без изменения ее cwd.

+0

Спасибо; эта информация помогает. –

1

это способ изменить текущую рабочую директорию в C

это требует файл unistd.h заголовка, которые будут включены

if(0 != chdir("pathToNewDirectory")) 
{ // then chdir failed 
    perror("chdir failed"); 
    // handle error 
} 
+0

Да, это точно так же, как я написал свою программу на C. И, как упоминалось в комментариях и ответах на этот пост, программа C будет порождена как отдельный процесс и не изменит каталог родительского процесса (терминала) –