Using local parameter with the same name of a special one within a function












0















As I like to use descriptive parameter names, I often tried to use variable names already used by Zsh itself.



As it took me into trouble in the past, I now wrap my script in a main function named after the script. Then I declare all my local parameter using the local keyword.



But some parameters seems to not allow hiding them in the local scope:



function foo
{
local commands=(bar baz)
local status=0

echo ${(F)commands}
echo $status
}


Here, the local commands parameter is used in place of the special one.



But as the status parameter is read-only, I got the following error:




zdm:6: read-only variable: status




I think that the local keyword allow to use a special parameter in a local scope but it does not change the way it was declared.










share|improve this question



























    0















    As I like to use descriptive parameter names, I often tried to use variable names already used by Zsh itself.



    As it took me into trouble in the past, I now wrap my script in a main function named after the script. Then I declare all my local parameter using the local keyword.



    But some parameters seems to not allow hiding them in the local scope:



    function foo
    {
    local commands=(bar baz)
    local status=0

    echo ${(F)commands}
    echo $status
    }


    Here, the local commands parameter is used in place of the special one.



    But as the status parameter is read-only, I got the following error:




    zdm:6: read-only variable: status




    I think that the local keyword allow to use a special parameter in a local scope but it does not change the way it was declared.










    share|improve this question

























      0












      0








      0








      As I like to use descriptive parameter names, I often tried to use variable names already used by Zsh itself.



      As it took me into trouble in the past, I now wrap my script in a main function named after the script. Then I declare all my local parameter using the local keyword.



      But some parameters seems to not allow hiding them in the local scope:



      function foo
      {
      local commands=(bar baz)
      local status=0

      echo ${(F)commands}
      echo $status
      }


      Here, the local commands parameter is used in place of the special one.



      But as the status parameter is read-only, I got the following error:




      zdm:6: read-only variable: status




      I think that the local keyword allow to use a special parameter in a local scope but it does not change the way it was declared.










      share|improve this question














      As I like to use descriptive parameter names, I often tried to use variable names already used by Zsh itself.



      As it took me into trouble in the past, I now wrap my script in a main function named after the script. Then I declare all my local parameter using the local keyword.



      But some parameters seems to not allow hiding them in the local scope:



      function foo
      {
      local commands=(bar baz)
      local status=0

      echo ${(F)commands}
      echo $status
      }


      Here, the local commands parameter is used in place of the special one.



      But as the status parameter is read-only, I got the following error:




      zdm:6: read-only variable: status




      I think that the local keyword allow to use a special parameter in a local scope but it does not change the way it was declared.







      parameters zsh






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Jan 1 at 23:57









      Damien FlamentDamien Flament

      515721




      515721
























          1 Answer
          1






          active

          oldest

          votes


















          1














          To use a special parameter name within a local scope, you have to hide it explicitly using the -h flag of the typeset builtin:



          typeset -h status


          As you want to declare it as local, use the local keyword which also supports that flag:



          local -h status


          You can also use the private keyword from the zsh/param/private module:



          zmodload zsh/param/private

          private -h status


          The -h flag



          From the Zsh manual:




          -h



          Hide: only useful for special parameters (those marked <S> in the table in Parameters Set By The Shell), and for local parameters with the same name as a special parameter, though harmless for others.



          A special parameter with this attribute will not retain its special effect when made local. Thus after typeset -h PATH, a function containing typeset PATH will create an ordinary local parameter without the usual behaviour of PATH.



          Alternatively, the local parameter may itself be given this attribute; hence inside a function typeset -h PATH creates an ordinary local parameter and the special PATH parameter is not altered in any way.



          It is also possible to create a local parameter using typeset +h special, where the local copy of special will retain its special properties regardless of having the -h attribute.



          Global special parameters loaded from shell modules (currently those in zsh/mapfile and zsh/parameter) are automatically given the -h attribute to avoid name clashes.




          Local parameters



          For a more understandable explanation, see the Zsh manual page about the local parameters.






          share|improve this answer























            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',
            autoActivateHeartbeat: false,
            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%2f53999874%2fusing-local-parameter-with-the-same-name-of-a-special-one-within-a-function%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









            1














            To use a special parameter name within a local scope, you have to hide it explicitly using the -h flag of the typeset builtin:



            typeset -h status


            As you want to declare it as local, use the local keyword which also supports that flag:



            local -h status


            You can also use the private keyword from the zsh/param/private module:



            zmodload zsh/param/private

            private -h status


            The -h flag



            From the Zsh manual:




            -h



            Hide: only useful for special parameters (those marked <S> in the table in Parameters Set By The Shell), and for local parameters with the same name as a special parameter, though harmless for others.



            A special parameter with this attribute will not retain its special effect when made local. Thus after typeset -h PATH, a function containing typeset PATH will create an ordinary local parameter without the usual behaviour of PATH.



            Alternatively, the local parameter may itself be given this attribute; hence inside a function typeset -h PATH creates an ordinary local parameter and the special PATH parameter is not altered in any way.



            It is also possible to create a local parameter using typeset +h special, where the local copy of special will retain its special properties regardless of having the -h attribute.



            Global special parameters loaded from shell modules (currently those in zsh/mapfile and zsh/parameter) are automatically given the -h attribute to avoid name clashes.




            Local parameters



            For a more understandable explanation, see the Zsh manual page about the local parameters.






            share|improve this answer




























              1














              To use a special parameter name within a local scope, you have to hide it explicitly using the -h flag of the typeset builtin:



              typeset -h status


              As you want to declare it as local, use the local keyword which also supports that flag:



              local -h status


              You can also use the private keyword from the zsh/param/private module:



              zmodload zsh/param/private

              private -h status


              The -h flag



              From the Zsh manual:




              -h



              Hide: only useful for special parameters (those marked <S> in the table in Parameters Set By The Shell), and for local parameters with the same name as a special parameter, though harmless for others.



              A special parameter with this attribute will not retain its special effect when made local. Thus after typeset -h PATH, a function containing typeset PATH will create an ordinary local parameter without the usual behaviour of PATH.



              Alternatively, the local parameter may itself be given this attribute; hence inside a function typeset -h PATH creates an ordinary local parameter and the special PATH parameter is not altered in any way.



              It is also possible to create a local parameter using typeset +h special, where the local copy of special will retain its special properties regardless of having the -h attribute.



              Global special parameters loaded from shell modules (currently those in zsh/mapfile and zsh/parameter) are automatically given the -h attribute to avoid name clashes.




              Local parameters



              For a more understandable explanation, see the Zsh manual page about the local parameters.






              share|improve this answer


























                1












                1








                1







                To use a special parameter name within a local scope, you have to hide it explicitly using the -h flag of the typeset builtin:



                typeset -h status


                As you want to declare it as local, use the local keyword which also supports that flag:



                local -h status


                You can also use the private keyword from the zsh/param/private module:



                zmodload zsh/param/private

                private -h status


                The -h flag



                From the Zsh manual:




                -h



                Hide: only useful for special parameters (those marked <S> in the table in Parameters Set By The Shell), and for local parameters with the same name as a special parameter, though harmless for others.



                A special parameter with this attribute will not retain its special effect when made local. Thus after typeset -h PATH, a function containing typeset PATH will create an ordinary local parameter without the usual behaviour of PATH.



                Alternatively, the local parameter may itself be given this attribute; hence inside a function typeset -h PATH creates an ordinary local parameter and the special PATH parameter is not altered in any way.



                It is also possible to create a local parameter using typeset +h special, where the local copy of special will retain its special properties regardless of having the -h attribute.



                Global special parameters loaded from shell modules (currently those in zsh/mapfile and zsh/parameter) are automatically given the -h attribute to avoid name clashes.




                Local parameters



                For a more understandable explanation, see the Zsh manual page about the local parameters.






                share|improve this answer













                To use a special parameter name within a local scope, you have to hide it explicitly using the -h flag of the typeset builtin:



                typeset -h status


                As you want to declare it as local, use the local keyword which also supports that flag:



                local -h status


                You can also use the private keyword from the zsh/param/private module:



                zmodload zsh/param/private

                private -h status


                The -h flag



                From the Zsh manual:




                -h



                Hide: only useful for special parameters (those marked <S> in the table in Parameters Set By The Shell), and for local parameters with the same name as a special parameter, though harmless for others.



                A special parameter with this attribute will not retain its special effect when made local. Thus after typeset -h PATH, a function containing typeset PATH will create an ordinary local parameter without the usual behaviour of PATH.



                Alternatively, the local parameter may itself be given this attribute; hence inside a function typeset -h PATH creates an ordinary local parameter and the special PATH parameter is not altered in any way.



                It is also possible to create a local parameter using typeset +h special, where the local copy of special will retain its special properties regardless of having the -h attribute.



                Global special parameters loaded from shell modules (currently those in zsh/mapfile and zsh/parameter) are automatically given the -h attribute to avoid name clashes.




                Local parameters



                For a more understandable explanation, see the Zsh manual page about the local parameters.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Jan 2 at 0:11









                Damien FlamentDamien Flament

                515721




                515721
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • 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%2fstackoverflow.com%2fquestions%2f53999874%2fusing-local-parameter-with-the-same-name-of-a-special-one-within-a-function%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

                    MongoDB - Not Authorized To Execute Command

                    How to fix TextFormField cause rebuild widget in Flutter

                    in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith