Не удается передать определенные bashrc аргументы терминалу

#python #c #bash

#python #c #баш #c #bash

Вопрос:

Я пытаюсь написать код, который автоматизирует некоторые программы Heasoft от Nasa — это не имеет значения -,

heainit определяется в bashrc как:

 export HEADAS=~/heasoft-6.27.2/x86_64-pc-linux-gnu-libc2.31
alias heainit='. $HEADAS/headas-init.sh
  

поэтому всякий раз, когда я пишу heainit на терминале, он работает довольно хорошо. Однако всякий раз, когда я пытался передать «heainit» терминалу через c или Python, сам код работает, но он не запускает программу!

Я думаю, что alise не создает там фактического пути, но я перепробовал все возможности, о которых я говорил.

в c я пытался:

 #include <iostream>
#include <stdlib.h>
#include <string.h>
#include <cstdlib>
#include <string>
#include <sstream>
using namespace std;
int main(int argc, char** argv){ string ind, outd;
const char* heainit = "/home/karim/heasoft-6.27.2/x86_64-pc-linux-gnu-libc2.31/headas-init.sh" ; 
system(heainit);
return 0;
} 
  

и

 int main(string, char*){
 string ind, outd;
 std::string HEADAS = "/home/karim/heasoft-6.27.2/x86_64-pc-linux-gnu-libc2.31";
 std::string str = std::string(". //")   HEADAS   std::string("/headas-init.sh");
 const char *c = str.c_str(". /home/karim/heasoft-6.27.2/x86_64-pc-linux-gnu-libc2.31/heafas-init.sh");
 system(const char* c);
 return 0;
 }
  

в python я пытался:

 import os
import subprocess
os.system("heainit")
subprocess.run("heainit",capture_output=True)
  

и

 HEADAS=~/heasoft-6.27.2/x86_64-pc-linux-gnu-libc2.31
heainit="."   "t"   HEADAS   "/headas-init.sh"
subprocess.run(heainit, shell=True)
  

Моей последней попыткой было написать сценарий bash:

 #!/bin/bash
export HEADAS=~/heasoft-6.27.2/x86_64-pc-linux-gnu-libc2.31
export HEADAS
alias heainit='. $HEADAS/headas-init.sh'
heainit
  

и в приглашении отображается следующее: ./hea.sh: line 6: heainit: command not found

всякий раз, когда я выполняю любой из вышеупомянутых кодов с помощью любой другой команды, например, например, «ls -l», он работает отлично: «)) Я еще не знаю, как мне передать этот аргумент (за ним должны следовать другие при запуске программы) терминалу, и я не знаю, что я долженне хватает идти. Возможно, проблема тривиальна, но я застрял там надолго.

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

1. Вы понимаете, что . делает в оболочке? Какой смысл получать скрипт из system() вызова? Зачем вам это делать? В любом случае это никак не влияет на текущий процесс.

2. Каково содержимое файла? Это только установка переменных среды или фактическое создание каких-либо побочных эффектов?

3. Насколько я понимаю. запустите или откройте файл через оболочку.

4. запуск файла инициирует программу, которая выполняет временной анализ данных, собранных заранее, но это требует времени или аргументов вручную, и это отнимает много времени для почти 113 000 временных событий. Таким образом, я хочу автоматизировать этот процесс с помощью python или c , но для этого все равно требуется сначала запустить программу.

Ответ №1:

всякий раз, когда я пытался передать «heainit» терминалу через c или Python, сам код работает, но он не запускает программу!

heainit является alias . Итак, во-первых: system вызов запускает оболочку в неинтерактивном режиме, в котором alias игнорируется, и, во-вторых: скорее всего, у вас есть if [[ $- ~= *i* ]] поверх вашего bashrc для возврата, когда оболочка не является интерактивной. Короче говоря: an alias не является командой и предназначена для запуска только в интерактивной оболочке. псевдонимы оболочки bash вручную

Если вы хотите работать heainit с терминала, вы можете создать исполняемый PATH файл. Или вы могли бы создать функцию и добавить ее /etc/bash.bashrc перед интерактивной проверкой или как /etc/profile.d/* .

Тем не менее, это, скорее всего, ничего не решит, поскольку файл является исходным кодом. system() вызов и subprocess() запуск подпроцесса, среда подпроцесса не влияет на родительскую среду. Итак, если эта оценка верна, поиск файла фактически ничего не делает, поскольку он отправляет его в подпроцесс, который не влияет на текущую среду. Решением было бы написать анализатор файла (либо полноценный анализатор и интерпретатор оболочки, либо что-то более простое, в зависимости от содержимого файла) и проанализировать текст из файла внутри текущего процесса.