#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
(или как бы он ни назывался). Похоже, проблема заключается в настройке среды, а не в C3. @speedster01: Хм, я не любитель Bash, поэтому я не знаю, но, скорее всего, это
.bashrc
не влияет на вспомогательную оболочку, созданную из программы C . Также обратите внимание, что ссылка на скрипт ссылается наsh
notbash
. Даже еслиsh
это ссылка наbash
него, она может вести себя по-другому при вызове assh
. Возможно, это некоторые указатели для изучения.
Ответ №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. ИМХО, это правильный ответ с кодом и пояснениями. И в любом случае он содержит слишком много кода, чтобы поместиться в комментарии…