Eval and exec with variable substitution












0















I'd like to execute a statement to start a server. For that I have an environment variable to determine which server is to be started. I was given this command as a starting point:



eval "exec gunicorn --chdir /this/dir package.sub:call_main() -b 0.0.0.0:80"


As I have a few kinds of servers to start up, I would like to parameterise the script. And after searching around, I found out the quotations are redundant. So what I have now is:



APP=main
eval exec gunicorn --chdir /this/dir package.sub:call_${APP}() -b 0.0.0.0:80


This, however produces a syntax error near unexpected token '('. Ideally I would even like to have a default argument like ${APP:-main}, but I guess that is possible once the syntax error issue is resolved.



What is wrong with the statement above? Additionally, is eval or even exec needed here?









share







New contributor




Felix is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.

























    0















    I'd like to execute a statement to start a server. For that I have an environment variable to determine which server is to be started. I was given this command as a starting point:



    eval "exec gunicorn --chdir /this/dir package.sub:call_main() -b 0.0.0.0:80"


    As I have a few kinds of servers to start up, I would like to parameterise the script. And after searching around, I found out the quotations are redundant. So what I have now is:



    APP=main
    eval exec gunicorn --chdir /this/dir package.sub:call_${APP}() -b 0.0.0.0:80


    This, however produces a syntax error near unexpected token '('. Ideally I would even like to have a default argument like ${APP:-main}, but I guess that is possible once the syntax error issue is resolved.



    What is wrong with the statement above? Additionally, is eval or even exec needed here?









    share







    New contributor




    Felix is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.























      0












      0








      0








      I'd like to execute a statement to start a server. For that I have an environment variable to determine which server is to be started. I was given this command as a starting point:



      eval "exec gunicorn --chdir /this/dir package.sub:call_main() -b 0.0.0.0:80"


      As I have a few kinds of servers to start up, I would like to parameterise the script. And after searching around, I found out the quotations are redundant. So what I have now is:



      APP=main
      eval exec gunicorn --chdir /this/dir package.sub:call_${APP}() -b 0.0.0.0:80


      This, however produces a syntax error near unexpected token '('. Ideally I would even like to have a default argument like ${APP:-main}, but I guess that is possible once the syntax error issue is resolved.



      What is wrong with the statement above? Additionally, is eval or even exec needed here?









      share







      New contributor




      Felix is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.












      I'd like to execute a statement to start a server. For that I have an environment variable to determine which server is to be started. I was given this command as a starting point:



      eval "exec gunicorn --chdir /this/dir package.sub:call_main() -b 0.0.0.0:80"


      As I have a few kinds of servers to start up, I would like to parameterise the script. And after searching around, I found out the quotations are redundant. So what I have now is:



      APP=main
      eval exec gunicorn --chdir /this/dir package.sub:call_${APP}() -b 0.0.0.0:80


      This, however produces a syntax error near unexpected token '('. Ideally I would even like to have a default argument like ${APP:-main}, but I guess that is possible once the syntax error issue is resolved.



      What is wrong with the statement above? Additionally, is eval or even exec needed here?







      bash terminal environment-variables exec eval





      share







      New contributor




      Felix is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.










      share







      New contributor




      Felix is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.








      share



      share






      New contributor




      Felix is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 6 mins ago









      FelixFelix

      1011




      1011




      New contributor




      Felix is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      Felix is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      Felix is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






















          1 Answer
          1






          active

          oldest

          votes


















          0














          In your second piece of code, you have removed the double quotes around the argument to eval. Don't do that. Removing them would make () special to the shell (it starts a sub-shell).



          Instead:



          APP=main
          eval "exec gunicorn --chdir /this/dir package.sub:call_$APP() -b 0.0.0.0:80"


          Note that ${APP} and $APP is identical in every way except when immediately followed by a character that is valid in a variable name (as in "${APP}x"). Here, the {...} is not needed.



          I'm uncertain why you want the exec in there, it doesn't seem neccesary.





          share























            Your Answer








            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "106"
            };
            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',
            autoActivateHeartbeat: false,
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            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
            });


            }
            });






            Felix is a new contributor. Be nice, and check out our Code of Conduct.










            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f498745%2feval-and-exec-with-variable-substitution%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









            0














            In your second piece of code, you have removed the double quotes around the argument to eval. Don't do that. Removing them would make () special to the shell (it starts a sub-shell).



            Instead:



            APP=main
            eval "exec gunicorn --chdir /this/dir package.sub:call_$APP() -b 0.0.0.0:80"


            Note that ${APP} and $APP is identical in every way except when immediately followed by a character that is valid in a variable name (as in "${APP}x"). Here, the {...} is not needed.



            I'm uncertain why you want the exec in there, it doesn't seem neccesary.





            share




























              0














              In your second piece of code, you have removed the double quotes around the argument to eval. Don't do that. Removing them would make () special to the shell (it starts a sub-shell).



              Instead:



              APP=main
              eval "exec gunicorn --chdir /this/dir package.sub:call_$APP() -b 0.0.0.0:80"


              Note that ${APP} and $APP is identical in every way except when immediately followed by a character that is valid in a variable name (as in "${APP}x"). Here, the {...} is not needed.



              I'm uncertain why you want the exec in there, it doesn't seem neccesary.





              share


























                0












                0








                0







                In your second piece of code, you have removed the double quotes around the argument to eval. Don't do that. Removing them would make () special to the shell (it starts a sub-shell).



                Instead:



                APP=main
                eval "exec gunicorn --chdir /this/dir package.sub:call_$APP() -b 0.0.0.0:80"


                Note that ${APP} and $APP is identical in every way except when immediately followed by a character that is valid in a variable name (as in "${APP}x"). Here, the {...} is not needed.



                I'm uncertain why you want the exec in there, it doesn't seem neccesary.





                share













                In your second piece of code, you have removed the double quotes around the argument to eval. Don't do that. Removing them would make () special to the shell (it starts a sub-shell).



                Instead:



                APP=main
                eval "exec gunicorn --chdir /this/dir package.sub:call_$APP() -b 0.0.0.0:80"


                Note that ${APP} and $APP is identical in every way except when immediately followed by a character that is valid in a variable name (as in "${APP}x"). Here, the {...} is not needed.



                I'm uncertain why you want the exec in there, it doesn't seem neccesary.






                share











                share


                share










                answered 1 min ago









                KusalanandaKusalananda

                128k16241398




                128k16241398






















                    Felix is a new contributor. Be nice, and check out our Code of Conduct.










                    draft saved

                    draft discarded


















                    Felix is a new contributor. Be nice, and check out our Code of Conduct.













                    Felix is a new contributor. Be nice, and check out our Code of Conduct.












                    Felix is a new contributor. Be nice, and check out our Code of Conduct.
















                    Thanks for contributing an answer to Unix & Linux Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f498745%2feval-and-exec-with-variable-substitution%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

                    サソリ

                    広島県道265号伴広島線

                    Setup Asymptote in Texstudio