質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

473閲覧

C言語でシェルスクリプトを呼び、シェルスクリプト内で設定した環境変数を、プロセスが終わっても覚えたままにさせたい

HoriemonHack

総合スコア54

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

2クリップ

投稿2022/05/19 11:14

編集2022/05/19 11:15

C言語でシェルスクリプトを呼び、シェルスクリプト内で環境変数を設定させようとしています。
しかし、以下のコードでは、1つ目のsystem()が終了すると、環境変数を忘れてしまいます。

2つ目のsystem("./app");で起動させるアプリにも環境変数を踏襲したい場合、どのような工夫が必要ですか?

main.cc

c

1#include <iostream> 2#include <stdlib.h> 3#include <string.h> 4 5int main(){ 6 system("source ./Initenv.sh"); 7 system("./app"); 8 return 0; 9} 10

Initenv.sh

sh

1export HOGE=hanako

ただし、制約条件としては、Initenv.sh、appは変更できず、Cソースコードの中で環境変数の再設定は禁止されています。(環境変数の変更は、Initenv.shを真とすることになっており、ソースコードメンテナンスの都合上、Cに同じ環境変数の設定文を書いて二重メンテになるのを避ける)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/05/19 11:17 編集

環境変数は親プロセスから子プロセスへ引き継がれますが、逆はありません。 標準入出力など別の手段を使って親プロセスに渡し、親プロセスで改めて設定してください。 それが禁止されているのであれば、禁止を解除するよう働きかけるか、あきらめるより他ないでしょう。
otn

2022/05/19 12:14 編集

プロセスが終わると環境変数も消えることを知っていながら、何故systemを2回に分けて呼ぼうと思ったのか不思議です。
BeatStar

2022/05/20 09:02 編集

質問者さん、今回の処理を仕様と思ったきっかけや背景を書いた方がいいかもしれません。 たとえば「Initenv.shを社内の先輩から受け取って、『これで○○しろ』という指示がありました。しかし私は○○の処理をするとなると~という部分で10回ほど動かす必要があるため、効率化を図るためにapp.exeを作り、これを実行して人間の代わりに行おうと思っています。ですが…」みたいに背景を提示するとわかりやすく丁度いい回答が得られるかもしれません。 なんていうか、今の質問だとXY問題になっているような気がします。空を飛ぶことが目的なのに、『道具無しで空を飛ぶこと』に固執してこれ以外は認めない!!!と意固地になっているような妙な感じに取れます。失礼ですが。 背景を提示すれば、本来の目的を考えられるので愚直な方法は取れなくても問題解決はできるかもしれません。
guest

回答2

0

ベストアンサー

main.cc

c

1#include <stdlib.h> 2#include <string.h> 3 4int main(){ 5 system(". ./Initenv.sh && ./app"); 6 // system("./app"); 7 return 0; 8}

app

bash

1echo $HOGE

実行

bash

1$ g++ -std=gnu++17 -Wall -Wextra -g main.cc -o main && ./main 2hanako

投稿2022/05/19 11:39

melian

総合スコア19798

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2022/05/19 12:07 編集

まぁ、 bash$ (. ./Initenv.sh && ./main) でも良さげではありますが(main.cc 内で system("./Initenv.sh"); を実行する必要がなくなります)。
guest

0

環境変数の変更は、Initenv.shを真とすることになっており

でしたら、「C言語のソースコードの中でInitenv.shを読み取って環境変数を設定する」というようにすればいいのではないでしょうか。

投稿2022/05/19 11:32

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問