Unexpected behavior of Bash script: First executes function, afterwards executes aliasAlias and functionsIn...

What type of postprocessing gives the effect of people standing out

You'll find me clean when something is full

Contradiction with Banach Fixed Point Theorem

Exponential growth/decay formula: what happened to the other constant of integration?

How can atoms be electrically neutral when there is a difference in the positions of the charges?

Reason Why Dimensional Travelling Would be Restricted

Waiting for the gravy at a dinner table

Is there any relevance to Thor getting his hair cut other than comedic value?

How to count occurrences of Friday 13th

What is the difference between throw e and throw new Exception(e)?

Closure of presentable objects under finite limits

Creature spells vs. ability to convert a permanent into a creature

Called into a meeting and told we are being made redundant (laid off) and "not to share outside". Can I tell my partner?

What is a term for a function that when called repeatedly, has the same effect as calling once?

What if I store 10TB on azure servers and then keep the vm powered off?

Skis versus snow shoes - when to choose which for travelling the backcountry?

Can I become debt free or should I file for bankruptcy? How do I manage my debt and finances?

Where was Karl Mordo in Infinity War?

Is there a low-level alternative to Animate Objects?

Is divide-by-zero a security vulnerability?

What is better: yes / no radio, or simple checkbox?

Replacement ford fiesta radiator has extra hose

Make me a metasequence

As a new poet, where can I find help from a professional to judge my work?



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


Alias and functionsIn Bash, when to alias, when to script, and when to write a function?Bash function to scp a file not workingcalling Bash Function from alias definitionExecuting a Bash Script Function with SudoBash script works via terminal but not via main menuHow to save a function in bash for later use?Bash interactive - entire script writing to historyWhat is the correct way to assign a function containing chained commands to an alias in .bashrc?Why is an alias in a script being sourced in an interactive bash process not expanded?Writing a script containing just one function definition v.s. moving the code in function body to the script?













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 12 hours ago







      Nikhil

















      asked 12 hours ago









      NikhilNikhil

      310112




      310112






















          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 12 hours ago

























                answered 12 hours ago









                BodoBodo

                1,993314




                1,993314






























                    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

                    Couldn't open a raw socket. Error: Permission denied (13) (nmap)Is it possible to run networking commands...

                    VNC viewer RFB protocol error: bad desktop size 0x0I Cannot Type the Key 'd' (lowercase) in VNC Viewer...

                    Why not use the yoke to control yaw, as well as pitch and roll? Announcing the arrival of...