Почему переменная PWD указывает на домашний каталог в файле?

#c #linux #file #path

#c #linux #файл #путь

Вопрос:

У меня есть файл заголовка, в котором у меня есть функция load_files(), которая должна скопировать определенный файл из каталога проекта в некоторый путь на компьютере пользователя. Проблема в том, что я не могу найти файл в каталоге моего проекта, я даже не могу найти каталог проекта. Вот мой код.

 void load_database_files(const char * prog_dir) {
  char cmd[100];
  const char * proj_path = getenv("PWD");
  sprintf(cmd, "cp -r %s%s %s", proj_path, "/src/database/warehouse.db", prog_dir);
  system(cmd);
  exit(1);
}
 

Я ожидал бы, что PWD укажет на каталог проекта, откуда я мог бы найти файл, но вместо этого он возвращает путь к $HOME . Как я могу обойти это? Я использую среду разработки gnome-builder IDE. Если мне нужно предоставить какую-либо другую соответствующую информацию, пожалуйста, дайте мне знать.

Комментарии:

1. У меня есть файл заголовка load_files() , load_files() который, глядя на используемый стиль, называется функцией в C or C и на многих языках программирования

2. на более легкой ноте, лучше распечатать cmd , прежде чем использовать in system(cmd); , чтобы быть уверенным, что мы правильно вызываем.

3. Ах, извините, я это исправил). Да, я, вероятно, должен сделать это для правильной отладки.

4. Вы также должны использовать snprintf() (и проверять случаи, когда конечная строка будет слишком длинной для хранения cmd ) вместо sprintf() .

5. @Shawn Да, я планировал изменить это позже. Есть идеи, как я могу обойти проблему PWD?

Ответ №1:

Прочитайте документацию оболочки. PWD это переменная среды, в которой оболочка хранит путь к своему текущему каталогу. Итак, если вы находитесь дома (допустим, это так /home/user1 ) и chdir $HOME/projects/project_a , оболочка сохранит /home/user1/projects/project_a в переменной PWD . Оболочка всегда обновляет эту переменную, когда вы выполняете внутреннюю команду оболочки cd , поэтому у вас есть две альтернативы:

  • Используйте другое имя переменной для каталога вашего проекта. Допустим, у вашего проекта есть имя babilony , и он находится в $HOME/projects . Хорошим именем было бы использовать переменную среды, например BABILONY_HOME , и инициализировать ее в вашей .profile строке, например
 export BABILONY_HOME="$HOME/projects/babilony"
 

а затем используйте следующую защиту:

 void load_database_files(const char * prog_dir) {
  char cmd[100];
  const char * proj_path = getenv("BABILONY_HOME"); /* this will point to your project's base directory */
  sprintf(cmd, "cp -r %s%s %s", proj_path, "/src/database/warehouse.db", prog_dir);
  /* this would expand to 'cp -r /home/user1/projects/babilony/src/database/warehouse.db <prog_dir>' */
  system(cmd);
  exit(1);
}
 

но не используйте PWD переменную, поскольку она меняется каждый раз, когда вы перемещаетесь по файловой системе.