66

Bash scripts are very useful and can save a lot of programming time. So how do you start a bash script in a C++ program? Also if you know how to make user become the super-user that would be nice also. Thanks!

5 Answers 5

88

Use the system function.

system("myfile.sh"); // myfile.sh should be chmod +x
Sign up to request clarification or add additional context in comments.

8 Comments

Thanks but you forgot to include this: system("./myfile.sh");
The current directory . shouldn't be in your $PATH.
@KeithThompson The script doesn't have to be located in your current directory though. The point is, there's no requirement in the system function for prefixing scripts with ".".
@MehrdadAfshari: How about this. If the script is in the current directory, you should use ./. If it's somewhere in your $PATH, don't use ./. (. probably shouldn't be in $PATH, and definitely shouldn't be at the front of $PATH.)
system() must be used with caution. According to it's man page: Do not use system() from a program with set-user-ID or set-group-ID privileges, because strange values for some environment variables might be used to subvert system integrity. Use the exec(3) family of functions instead, but not execlp(3) or execvp(3). system() will not, in fact, work properly from programs with set-user-ID or set-group-ID privileges on systems on which /bin/sh is bash version 2, since bash 2 drops privileges on startup.
|
26
#include <stdio.h>
#include <stdlib.h>

// ....


system("my_bash_script.sh");

2 Comments

What if the bash script was to echo some text to tty? E.g. what if it were a "cat"? Could the c program have that output?
Does this wait until the process completes?
16

Since this is a pretty old question, and this method hasn't been added (aside from the system() call function) I guess it would be useful to include creating the shell script with the C binary itself. The shell code will be housed inside the file.c source file. Here is an example of code:

#include <stdio.h>
#include <stdlib.h>

#define SHELLSCRIPT "\
#/bin/bash \n\
echo -e \"\" \n\
echo -e \"This is a test shell script inside C code!!\" \n\
read -p \"press <enter> to continue\" \n\
clear\
"

int main() {

system(SHELLSCRIPT);
return 0;
}

Basically, in a nutshell (pun intended), we are defining the script name, fleshing out the script, enclosing them in double quotes (while inserting proper escapes to ignore double quotes in the shell code), and then calling that script's name, which in this example is SHELLSCRIPT using the system() function in main().

2 Comments

Fisrt, thank you for your kind sharing. I found that the program will not pause at this line "read -p \"press <enter> to continue\" \n\". Do you know why?
I apologize for the delay but, no I couldn't say for sure as I made sure it ran with my version of gcc at the time of posting.
10

The only standard mandated implementation dependent way is to use the system() function from stdlib.h.

Also if you know how to make user become the super-user that would be nice also.

Do you want the script to run as super-user or do you want to elevate the privileges of the C executable? The former can be done with sudo but there are a few things you need to know before you can go off using sudo.

Comments

5

StackOverflow: How to execute a command and get output of command within C++?

StackOverflow: (Using fork,pipe,select): ...nobody does things the hard way any more...

Also if you know how to make user become the super-user that would be nice also. Thanks!

sudo. su. chmod 04500. (setuid() & seteuid(), but they require you to already be root. E..g. chmod'ed 04***.)

Take care. These can open "interesting" security holes...

Depending on what you are doing, you may not need root. (For instance: I'll often chmod/chown /dev devices (serial ports, etc) (under sudo root) so I can use them from my software without being root. On the other hand, that doesn't work so well when loading/unloading kernel modules...)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.