Невозможно прочитать переменные в сценарии оболочки, работающем на C

#c #shell #sh

#c #оболочка #sh

Вопрос:

У меня есть сценарий оболочки, который выглядит следующим образом:

 #!/bin/sh

TESTOUTDIR=/home/speedster/test_dir

echo "Hello"
echo $TESTOUTDIR
  

Когда я запускаю это непосредственно из командной строки, он выводит «Hello» и переменную TESTOUTDIR, которую я установил, как ожидалось.

Теперь я запускаю это из программы на C . Моя программа выглядит следующим образом:

 #include <bits/stdc  .h>
using namespace std;

int main(int argc, char const *argv[]) {
    string runCommand = "/test.sh";
    system(runCommand.c_str());
}
  

Когда я запускаю это, я получаю вывод только как «Привет». Переменная не печатается. Что я могу сделать, чтобы исправить это?

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

1. Как вы установили $TESTOUTDIR ? Вы export отредактировали его?

2. Попробуйте TESTOUTDIR=foo my_prog . Попробуйте echo $TESTOUTDIR перед запуском my_prog (или как бы он ни назывался). Похоже, проблема заключается в настройке среды, а не в C

3. @speedster01: Хм, я не любитель Bash, поэтому я не знаю, но, скорее всего, это .bashrc не влияет на вспомогательную оболочку, созданную из программы C . Также обратите внимание, что ссылка на скрипт ссылается на sh not bash . Даже если sh это ссылка на bash него, она может вести себя по-другому при вызове as sh . Возможно, это некоторые указатели для изучения.

Ответ №1:

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

Я протестировал ваш код, и TESTOUTDIR переменная печатается нормально для меня. Ниже приведено то, что я запустил для тестирования вашего кода:

 $ cat test.sh
#!/bin/sh

TESTOUTDIR=/home/speedster/test_dir

echo "Hello"
echo $TESTOUTDIR
  
 $ cat test.cpp 
#include <bits/stdc  .h>
using namespace std;

int main(int argc, char const *argv[]) {
    string runCommand = "./test.sh";
    system(runCommand.c_str());
}
  
 $ g   test.cpp -o test_exec
$ ./test_exec 
Hello
/home/speedster/test_dir
  

Я протестировал ваш код на Ubuntu 18.04 с g 7.5.0.

Мой sh исполняемый файл представляет собой символическую ссылку на dash , которая является оболочкой POSIX. Я также протестировал изменение вашего shebang в test.sh на #!/bin/bash , и я продолжал видеть, что вы TESTOUTDIR напечатаны, как и ожидалось.

Я предлагаю вам подтвердить, /test.sh что содержит ожидаемое содержимое.

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

1. ИМХО, это правильный ответ с кодом и пояснениями. И в любом случае он содержит слишком много кода, чтобы поместиться в комментарии…