Pass a value from a C variable to an embedded shell script?











up vote
3
down vote

favorite












Is this possible?



Here is an example:



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

char testString="blunt"

#define shellscript1 "
#/bin/bash n
printf "nHi! The passed value is: $1n" n
"

int main(){

system(shellscript1);

return 0;
}


Now I would like to pass a value from testString to shellscript1 without having to reserve to making a temporary external script.



I've been bashing my head, and I couldn't figure out how to do it. Does anyone have any ideas?










share|improve this question
























  • Do you want to pass testString as argument to shellscript1?
    – Cyrus
    Nov 10 at 9:10






  • 1




    you could use putenv and call the script with that variable instead of $1
    – Jean-François Fabre
    Nov 10 at 9:13








  • 3




    you could just popen("bash") and feed it your bash commands.
    – Jean-François Fabre
    Nov 10 at 9:14








  • 4




    This might help: C: Anyway to load parameters into a system() call or Passing variables to system function in C
    – Cyrus
    Nov 10 at 9:15








  • 1




    don't bash your head anymore when you can feed it to a python :)
    – Jean-François Fabre
    Nov 10 at 9:25















up vote
3
down vote

favorite












Is this possible?



Here is an example:



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

char testString="blunt"

#define shellscript1 "
#/bin/bash n
printf "nHi! The passed value is: $1n" n
"

int main(){

system(shellscript1);

return 0;
}


Now I would like to pass a value from testString to shellscript1 without having to reserve to making a temporary external script.



I've been bashing my head, and I couldn't figure out how to do it. Does anyone have any ideas?










share|improve this question
























  • Do you want to pass testString as argument to shellscript1?
    – Cyrus
    Nov 10 at 9:10






  • 1




    you could use putenv and call the script with that variable instead of $1
    – Jean-François Fabre
    Nov 10 at 9:13








  • 3




    you could just popen("bash") and feed it your bash commands.
    – Jean-François Fabre
    Nov 10 at 9:14








  • 4




    This might help: C: Anyway to load parameters into a system() call or Passing variables to system function in C
    – Cyrus
    Nov 10 at 9:15








  • 1




    don't bash your head anymore when you can feed it to a python :)
    – Jean-François Fabre
    Nov 10 at 9:25













up vote
3
down vote

favorite









up vote
3
down vote

favorite











Is this possible?



Here is an example:



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

char testString="blunt"

#define shellscript1 "
#/bin/bash n
printf "nHi! The passed value is: $1n" n
"

int main(){

system(shellscript1);

return 0;
}


Now I would like to pass a value from testString to shellscript1 without having to reserve to making a temporary external script.



I've been bashing my head, and I couldn't figure out how to do it. Does anyone have any ideas?










share|improve this question















Is this possible?



Here is an example:



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

char testString="blunt"

#define shellscript1 "
#/bin/bash n
printf "nHi! The passed value is: $1n" n
"

int main(){

system(shellscript1);

return 0;
}


Now I would like to pass a value from testString to shellscript1 without having to reserve to making a temporary external script.



I've been bashing my head, and I couldn't figure out how to do it. Does anyone have any ideas?







c bash arguments






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 10 at 10:04









Cyrus

44.5k43375




44.5k43375










asked Nov 10 at 9:07









Aleksandar Čolović

2916




2916












  • Do you want to pass testString as argument to shellscript1?
    – Cyrus
    Nov 10 at 9:10






  • 1




    you could use putenv and call the script with that variable instead of $1
    – Jean-François Fabre
    Nov 10 at 9:13








  • 3




    you could just popen("bash") and feed it your bash commands.
    – Jean-François Fabre
    Nov 10 at 9:14








  • 4




    This might help: C: Anyway to load parameters into a system() call or Passing variables to system function in C
    – Cyrus
    Nov 10 at 9:15








  • 1




    don't bash your head anymore when you can feed it to a python :)
    – Jean-François Fabre
    Nov 10 at 9:25


















  • Do you want to pass testString as argument to shellscript1?
    – Cyrus
    Nov 10 at 9:10






  • 1




    you could use putenv and call the script with that variable instead of $1
    – Jean-François Fabre
    Nov 10 at 9:13








  • 3




    you could just popen("bash") and feed it your bash commands.
    – Jean-François Fabre
    Nov 10 at 9:14








  • 4




    This might help: C: Anyway to load parameters into a system() call or Passing variables to system function in C
    – Cyrus
    Nov 10 at 9:15








  • 1




    don't bash your head anymore when you can feed it to a python :)
    – Jean-François Fabre
    Nov 10 at 9:25
















Do you want to pass testString as argument to shellscript1?
– Cyrus
Nov 10 at 9:10




Do you want to pass testString as argument to shellscript1?
– Cyrus
Nov 10 at 9:10




1




1




you could use putenv and call the script with that variable instead of $1
– Jean-François Fabre
Nov 10 at 9:13






you could use putenv and call the script with that variable instead of $1
– Jean-François Fabre
Nov 10 at 9:13






3




3




you could just popen("bash") and feed it your bash commands.
– Jean-François Fabre
Nov 10 at 9:14






you could just popen("bash") and feed it your bash commands.
– Jean-François Fabre
Nov 10 at 9:14






4




4




This might help: C: Anyway to load parameters into a system() call or Passing variables to system function in C
– Cyrus
Nov 10 at 9:15






This might help: C: Anyway to load parameters into a system() call or Passing variables to system function in C
– Cyrus
Nov 10 at 9:15






1




1




don't bash your head anymore when you can feed it to a python :)
– Jean-François Fabre
Nov 10 at 9:25




don't bash your head anymore when you can feed it to a python :)
– Jean-François Fabre
Nov 10 at 9:25












1 Answer
1






active

oldest

votes

















up vote
4
down vote



accepted










Using the environment is possibly the simplest way to achieve it.



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

char testString="blunt";
#define shellscript1 "bash -c 'printf "nHi! The passed value is: $testStringn"'"
int main()
{
if(0>setenv("testString",testString,1)) return EXIT_FAILURE;
if(0!=system(shellscript1)) return EXIT_FAILURE;
return 0;
}


There are other ways, like generating the system argument in a buffer (e.g., with sprintf) or not using system.



system treats its argument like a a string to come after "/bin/sh", "-c". In my answer to using system() with command line arguments in C I coded up a simple my_system alternative that takes the arguments as a string array.



With it, you can do:



#define shellscript1 "printf "nHi! The passed value is: $1n" n"
char testString="blunt";
int main()
{
if(0!=my_system("bash", (char*){"bash", "-c", shellscript1, "--", testString,0})) return EXIT_FAILURE;
return 0;
}





share|improve this answer



















  • 1




    thanks for coding our comments into reality :) I'm running windows so I couldn't risk to post a non-working solution.
    – Jean-François Fabre
    Nov 10 at 9:23








  • 1




    @Jean-FrançoisFabre Added a slightly more original solution so I'm not just copying the comments. :)
    – PSkocik
    Nov 10 at 9:38






  • 1




    of course there was no snark in my answer as you probably understood, but I prefered to re-state it. Good answer
    – Jean-François Fabre
    Nov 10 at 9:39












  • @PSkocik beautiful and elegant solution. Thank you, kind sir.
    – Aleksandar Čolović
    Nov 10 at 9:44











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














 

draft saved


draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53237490%2fpass-a-value-from-a-c-variable-to-an-embedded-shell-script%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes








up vote
4
down vote



accepted










Using the environment is possibly the simplest way to achieve it.



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

char testString="blunt";
#define shellscript1 "bash -c 'printf "nHi! The passed value is: $testStringn"'"
int main()
{
if(0>setenv("testString",testString,1)) return EXIT_FAILURE;
if(0!=system(shellscript1)) return EXIT_FAILURE;
return 0;
}


There are other ways, like generating the system argument in a buffer (e.g., with sprintf) or not using system.



system treats its argument like a a string to come after "/bin/sh", "-c". In my answer to using system() with command line arguments in C I coded up a simple my_system alternative that takes the arguments as a string array.



With it, you can do:



#define shellscript1 "printf "nHi! The passed value is: $1n" n"
char testString="blunt";
int main()
{
if(0!=my_system("bash", (char*){"bash", "-c", shellscript1, "--", testString,0})) return EXIT_FAILURE;
return 0;
}





share|improve this answer



















  • 1




    thanks for coding our comments into reality :) I'm running windows so I couldn't risk to post a non-working solution.
    – Jean-François Fabre
    Nov 10 at 9:23








  • 1




    @Jean-FrançoisFabre Added a slightly more original solution so I'm not just copying the comments. :)
    – PSkocik
    Nov 10 at 9:38






  • 1




    of course there was no snark in my answer as you probably understood, but I prefered to re-state it. Good answer
    – Jean-François Fabre
    Nov 10 at 9:39












  • @PSkocik beautiful and elegant solution. Thank you, kind sir.
    – Aleksandar Čolović
    Nov 10 at 9:44















up vote
4
down vote



accepted










Using the environment is possibly the simplest way to achieve it.



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

char testString="blunt";
#define shellscript1 "bash -c 'printf "nHi! The passed value is: $testStringn"'"
int main()
{
if(0>setenv("testString",testString,1)) return EXIT_FAILURE;
if(0!=system(shellscript1)) return EXIT_FAILURE;
return 0;
}


There are other ways, like generating the system argument in a buffer (e.g., with sprintf) or not using system.



system treats its argument like a a string to come after "/bin/sh", "-c". In my answer to using system() with command line arguments in C I coded up a simple my_system alternative that takes the arguments as a string array.



With it, you can do:



#define shellscript1 "printf "nHi! The passed value is: $1n" n"
char testString="blunt";
int main()
{
if(0!=my_system("bash", (char*){"bash", "-c", shellscript1, "--", testString,0})) return EXIT_FAILURE;
return 0;
}





share|improve this answer



















  • 1




    thanks for coding our comments into reality :) I'm running windows so I couldn't risk to post a non-working solution.
    – Jean-François Fabre
    Nov 10 at 9:23








  • 1




    @Jean-FrançoisFabre Added a slightly more original solution so I'm not just copying the comments. :)
    – PSkocik
    Nov 10 at 9:38






  • 1




    of course there was no snark in my answer as you probably understood, but I prefered to re-state it. Good answer
    – Jean-François Fabre
    Nov 10 at 9:39












  • @PSkocik beautiful and elegant solution. Thank you, kind sir.
    – Aleksandar Čolović
    Nov 10 at 9:44













up vote
4
down vote



accepted







up vote
4
down vote



accepted






Using the environment is possibly the simplest way to achieve it.



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

char testString="blunt";
#define shellscript1 "bash -c 'printf "nHi! The passed value is: $testStringn"'"
int main()
{
if(0>setenv("testString",testString,1)) return EXIT_FAILURE;
if(0!=system(shellscript1)) return EXIT_FAILURE;
return 0;
}


There are other ways, like generating the system argument in a buffer (e.g., with sprintf) or not using system.



system treats its argument like a a string to come after "/bin/sh", "-c". In my answer to using system() with command line arguments in C I coded up a simple my_system alternative that takes the arguments as a string array.



With it, you can do:



#define shellscript1 "printf "nHi! The passed value is: $1n" n"
char testString="blunt";
int main()
{
if(0!=my_system("bash", (char*){"bash", "-c", shellscript1, "--", testString,0})) return EXIT_FAILURE;
return 0;
}





share|improve this answer














Using the environment is possibly the simplest way to achieve it.



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

char testString="blunt";
#define shellscript1 "bash -c 'printf "nHi! The passed value is: $testStringn"'"
int main()
{
if(0>setenv("testString",testString,1)) return EXIT_FAILURE;
if(0!=system(shellscript1)) return EXIT_FAILURE;
return 0;
}


There are other ways, like generating the system argument in a buffer (e.g., with sprintf) or not using system.



system treats its argument like a a string to come after "/bin/sh", "-c". In my answer to using system() with command line arguments in C I coded up a simple my_system alternative that takes the arguments as a string array.



With it, you can do:



#define shellscript1 "printf "nHi! The passed value is: $1n" n"
char testString="blunt";
int main()
{
if(0!=my_system("bash", (char*){"bash", "-c", shellscript1, "--", testString,0})) return EXIT_FAILURE;
return 0;
}






share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 10 at 9:34

























answered Nov 10 at 9:19









PSkocik

31.6k54569




31.6k54569








  • 1




    thanks for coding our comments into reality :) I'm running windows so I couldn't risk to post a non-working solution.
    – Jean-François Fabre
    Nov 10 at 9:23








  • 1




    @Jean-FrançoisFabre Added a slightly more original solution so I'm not just copying the comments. :)
    – PSkocik
    Nov 10 at 9:38






  • 1




    of course there was no snark in my answer as you probably understood, but I prefered to re-state it. Good answer
    – Jean-François Fabre
    Nov 10 at 9:39












  • @PSkocik beautiful and elegant solution. Thank you, kind sir.
    – Aleksandar Čolović
    Nov 10 at 9:44














  • 1




    thanks for coding our comments into reality :) I'm running windows so I couldn't risk to post a non-working solution.
    – Jean-François Fabre
    Nov 10 at 9:23








  • 1




    @Jean-FrançoisFabre Added a slightly more original solution so I'm not just copying the comments. :)
    – PSkocik
    Nov 10 at 9:38






  • 1




    of course there was no snark in my answer as you probably understood, but I prefered to re-state it. Good answer
    – Jean-François Fabre
    Nov 10 at 9:39












  • @PSkocik beautiful and elegant solution. Thank you, kind sir.
    – Aleksandar Čolović
    Nov 10 at 9:44








1




1




thanks for coding our comments into reality :) I'm running windows so I couldn't risk to post a non-working solution.
– Jean-François Fabre
Nov 10 at 9:23






thanks for coding our comments into reality :) I'm running windows so I couldn't risk to post a non-working solution.
– Jean-François Fabre
Nov 10 at 9:23






1




1




@Jean-FrançoisFabre Added a slightly more original solution so I'm not just copying the comments. :)
– PSkocik
Nov 10 at 9:38




@Jean-FrançoisFabre Added a slightly more original solution so I'm not just copying the comments. :)
– PSkocik
Nov 10 at 9:38




1




1




of course there was no snark in my answer as you probably understood, but I prefered to re-state it. Good answer
– Jean-François Fabre
Nov 10 at 9:39






of course there was no snark in my answer as you probably understood, but I prefered to re-state it. Good answer
– Jean-François Fabre
Nov 10 at 9:39














@PSkocik beautiful and elegant solution. Thank you, kind sir.
– Aleksandar Čolović
Nov 10 at 9:44




@PSkocik beautiful and elegant solution. Thank you, kind sir.
– Aleksandar Čolović
Nov 10 at 9:44


















 

draft saved


draft discarded



















































 


draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53237490%2fpass-a-value-from-a-c-variable-to-an-embedded-shell-script%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Guess what letter conforming each word

Port of Spain

Run scheduled task as local user group (not BUILTIN)