Использование chdir() для изменения каталога из терминала

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

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

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


person Ashwin Tumma    schedule 11.01.2015    source источник
comment
Можете ли вы объяснить, что такое источник сценария?   -  person Anton.P    schedule 11.01.2015
comment
при вводе терминала «исходное имя сценария» очень похоже на «. scriptname' Примечание: 'source' доступен не во всех языках сценариев. Обычно его можно найти в csh и bash   -  person user3629249    schedule 11.01.2015
comment
@Anton.P, под источником сценария я имел в виду запуск сценария одним из двух способов: 1. . myScript.sh 2. source myScript.sh Но, как указал @user3629249, он доступен не на каждом языке сценариев. Так что придется придумать еще один выход!   -  person Ashwin Tumma    schedule 11.01.2015


Ответы (2)


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

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

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

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

person wallyk    schedule 11.01.2015

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

для этого необходимо включить заголовочный файл unistd.h

if( 0 != chdir( "pathToNewDirectory" ) )
{ // then chdir failed
    perror( "chdir failed" );
   // handle error
}
person user3629249    schedule 11.01.2015
comment
Да, точно так же я написал свою программу на C. И, как упоминалось в комментариях и ответах, относящихся к этому сообщению, программа C будет создана как отдельный процесс и не изменит каталог родительского процесса (терминала) - person Ashwin Tumma; 11.01.2015