Unexpected behavior of Bash script: First executes function, afterwards executes alias












5















When I execute the following script



#!/usr/bin/env bash

main() {
shopt -s expand_aliases
alias Hi='echo "Hi from alias"'
Hi # Should Execute the alias
Hi # Should Execute the function
"Hi"
}

function Hi() {
echo "Hi from function"
}
main "$@"


Very first time it executes the function and then always executes as alias:



$ . Sample.sh
Hi from function
Hi from function
Hi from function
$ . Sample.sh
Hi from alias
Hi from function
Hi from function


Why is it so?





This does not happen in the following case



#!/usr/bin/env bash

function Hi() {
echo "Hi from function"
}

shopt -s expand_aliases
alias Hi='echo "Hi from alias"'
Hi # Should Execute the alias
Hi # Should Execute the function
"Hi"


Very first time it executes the function and then always executes as alias:



$ . Sample.sh
Hi from alias
Hi from function
Hi from function
$ . Sample.sh
Hi from alias
Hi from function
Hi from function









share|improve this question





























    5















    When I execute the following script



    #!/usr/bin/env bash

    main() {
    shopt -s expand_aliases
    alias Hi='echo "Hi from alias"'
    Hi # Should Execute the alias
    Hi # Should Execute the function
    "Hi"
    }

    function Hi() {
    echo "Hi from function"
    }
    main "$@"


    Very first time it executes the function and then always executes as alias:



    $ . Sample.sh
    Hi from function
    Hi from function
    Hi from function
    $ . Sample.sh
    Hi from alias
    Hi from function
    Hi from function


    Why is it so?





    This does not happen in the following case



    #!/usr/bin/env bash

    function Hi() {
    echo "Hi from function"
    }

    shopt -s expand_aliases
    alias Hi='echo "Hi from alias"'
    Hi # Should Execute the alias
    Hi # Should Execute the function
    "Hi"


    Very first time it executes the function and then always executes as alias:



    $ . Sample.sh
    Hi from alias
    Hi from function
    Hi from function
    $ . Sample.sh
    Hi from alias
    Hi from function
    Hi from function









    share|improve this question



























      5












      5








      5








      When I execute the following script



      #!/usr/bin/env bash

      main() {
      shopt -s expand_aliases
      alias Hi='echo "Hi from alias"'
      Hi # Should Execute the alias
      Hi # Should Execute the function
      "Hi"
      }

      function Hi() {
      echo "Hi from function"
      }
      main "$@"


      Very first time it executes the function and then always executes as alias:



      $ . Sample.sh
      Hi from function
      Hi from function
      Hi from function
      $ . Sample.sh
      Hi from alias
      Hi from function
      Hi from function


      Why is it so?





      This does not happen in the following case



      #!/usr/bin/env bash

      function Hi() {
      echo "Hi from function"
      }

      shopt -s expand_aliases
      alias Hi='echo "Hi from alias"'
      Hi # Should Execute the alias
      Hi # Should Execute the function
      "Hi"


      Very first time it executes the function and then always executes as alias:



      $ . Sample.sh
      Hi from alias
      Hi from function
      Hi from function
      $ . Sample.sh
      Hi from alias
      Hi from function
      Hi from function









      share|improve this question
















      When I execute the following script



      #!/usr/bin/env bash

      main() {
      shopt -s expand_aliases
      alias Hi='echo "Hi from alias"'
      Hi # Should Execute the alias
      Hi # Should Execute the function
      "Hi"
      }

      function Hi() {
      echo "Hi from function"
      }
      main "$@"


      Very first time it executes the function and then always executes as alias:



      $ . Sample.sh
      Hi from function
      Hi from function
      Hi from function
      $ . Sample.sh
      Hi from alias
      Hi from function
      Hi from function


      Why is it so?





      This does not happen in the following case



      #!/usr/bin/env bash

      function Hi() {
      echo "Hi from function"
      }

      shopt -s expand_aliases
      alias Hi='echo "Hi from alias"'
      Hi # Should Execute the alias
      Hi # Should Execute the function
      "Hi"


      Very first time it executes the function and then always executes as alias:



      $ . Sample.sh
      Hi from alias
      Hi from function
      Hi from function
      $ . Sample.sh
      Hi from alias
      Hi from function
      Hi from function






      bash scripting alias function






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 2 days ago







      Nikhil

















      asked 2 days ago









      NikhilNikhil

      310113




      310113






















          1 Answer
          1






          active

          oldest

          votes


















          10














          Alias expansion in a function is done when the function is read, not when the function is executed. The alias definition in the function is executed when the function is executed.



          See Alias and functions

          and https://www.gnu.org/software/bash/manual/html_node/Aliases.html



          This means, the alias will be defined when function main is executed, but when the function was read for the first time the alias was not yet defined. So the first time function main will execute function Hi three times.



          When you source the script for the second time, the alias is already defined from the previous run and can be expanded when the function definition is read. When you now call the function it is run with the alias expanded.



          The different behavior occurs only when the script is sourced with . Sample.sh, i.e. when it is run in the same shell several times. When you run it in a separate shell as ./Sample.sh it will always show the behavior of the first run.






          share|improve this answer

























            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
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f504258%2funexpected-behavior-of-bash-script-first-executes-function-afterwards-executes%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









            10














            Alias expansion in a function is done when the function is read, not when the function is executed. The alias definition in the function is executed when the function is executed.



            See Alias and functions

            and https://www.gnu.org/software/bash/manual/html_node/Aliases.html



            This means, the alias will be defined when function main is executed, but when the function was read for the first time the alias was not yet defined. So the first time function main will execute function Hi three times.



            When you source the script for the second time, the alias is already defined from the previous run and can be expanded when the function definition is read. When you now call the function it is run with the alias expanded.



            The different behavior occurs only when the script is sourced with . Sample.sh, i.e. when it is run in the same shell several times. When you run it in a separate shell as ./Sample.sh it will always show the behavior of the first run.






            share|improve this answer






























              10














              Alias expansion in a function is done when the function is read, not when the function is executed. The alias definition in the function is executed when the function is executed.



              See Alias and functions

              and https://www.gnu.org/software/bash/manual/html_node/Aliases.html



              This means, the alias will be defined when function main is executed, but when the function was read for the first time the alias was not yet defined. So the first time function main will execute function Hi three times.



              When you source the script for the second time, the alias is already defined from the previous run and can be expanded when the function definition is read. When you now call the function it is run with the alias expanded.



              The different behavior occurs only when the script is sourced with . Sample.sh, i.e. when it is run in the same shell several times. When you run it in a separate shell as ./Sample.sh it will always show the behavior of the first run.






              share|improve this answer




























                10












                10








                10







                Alias expansion in a function is done when the function is read, not when the function is executed. The alias definition in the function is executed when the function is executed.



                See Alias and functions

                and https://www.gnu.org/software/bash/manual/html_node/Aliases.html



                This means, the alias will be defined when function main is executed, but when the function was read for the first time the alias was not yet defined. So the first time function main will execute function Hi three times.



                When you source the script for the second time, the alias is already defined from the previous run and can be expanded when the function definition is read. When you now call the function it is run with the alias expanded.



                The different behavior occurs only when the script is sourced with . Sample.sh, i.e. when it is run in the same shell several times. When you run it in a separate shell as ./Sample.sh it will always show the behavior of the first run.






                share|improve this answer















                Alias expansion in a function is done when the function is read, not when the function is executed. The alias definition in the function is executed when the function is executed.



                See Alias and functions

                and https://www.gnu.org/software/bash/manual/html_node/Aliases.html



                This means, the alias will be defined when function main is executed, but when the function was read for the first time the alias was not yet defined. So the first time function main will execute function Hi three times.



                When you source the script for the second time, the alias is already defined from the previous run and can be expanded when the function definition is read. When you now call the function it is run with the alias expanded.



                The different behavior occurs only when the script is sourced with . Sample.sh, i.e. when it is run in the same shell several times. When you run it in a separate shell as ./Sample.sh it will always show the behavior of the first run.







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited 2 days ago

























                answered 2 days ago









                BodoBodo

                2,048416




                2,048416






























                    draft saved

                    draft discarded




















































                    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%2f504258%2funexpected-behavior-of-bash-script-first-executes-function-afterwards-executes%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

                    How to label and detect the document text images

                    Vallis Paradisi

                    Tabula Rosettana