Modify bash history from inside subshell in an interactive sessionAutomatic cleanup of Bash historyBash $PROMPT_COMMAND messing up scroll history displayHow can I programmatically add entries to Bash history and have timestamps work properly?Commands run when terminal is open do not appear in historyBash Executing Script from within Script Causes Echo and Read IssuesCross-session duplicate removal in bash command historyHow can I use vi to edit prompt line of a utility?Bash script order mixup in large redirect of outputshopt -s extdebug in .bashrc not working in script filesWhy is bash history substitution still enabled by default?

Do I have to worry about players making “bad” choices on level up?

What is the strongest case that can be made in favour of the UK regaining some control over fishing policy after Brexit?

Cannot populate data in lightning data table

Why does nature favour the Laplacian?

Find the coordinate of two line segments that are perpendicular

In gnome-terminal only 2 out of 3 zoom keys work

Phrase for the opposite of "foolproof"

How to verbalise code in Mathematica?

Help, my Death Star suffers from Kessler syndrome!

Why does processed meat contain preservatives, while canned fish needs not?

Will tsunami waves travel forever if there was no land?

Has any spacecraft ever had the ability to directly communicate with civilian air traffic control?

Where did the extra Pym particles come from in Endgame?

Can a creature tell when it has been affected by a Divination wizard's Portent?

TikZ how to make supply and demand arrows for nodes?

Does a creature that is immune to a condition still make a saving throw?

Transfer over $10k

How to figure out whether the data is sample data or population data apart from the client's information?

Is it possible to Ready a spell to be cast just before the start of your next turn by having the trigger be an ally's attack?

When and why did journal article titles become descriptive, rather than creatively allusive?

Why is current rating for multicore cable lower than single core with the same cross section?

Why do computer-science majors learn calculus?

Any examples of headwear for races with animal ears?

Why do Ichisongas hate elephants and hippos?



Modify bash history from inside subshell in an interactive session


Automatic cleanup of Bash historyBash $PROMPT_COMMAND messing up scroll history displayHow can I programmatically add entries to Bash history and have timestamps work properly?Commands run when terminal is open do not appear in historyBash Executing Script from within Script Causes Echo and Read IssuesCross-session duplicate removal in bash command historyHow can I use vi to edit prompt line of a utility?Bash script order mixup in large redirect of outputshopt -s extdebug in .bashrc not working in script filesWhy is bash history substitution still enabled by default?






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








1















I executed



history > before; (history -d $n); history > after


where $n is the number corresponding to the last command I typed in the same interactive session before executing this line,



The result is that the line marked $n is not removed from history. If I remove the parentheses so that the history -d runs in the current shell, it works as documented.



How to understand this behavior? Is it true that all scripts that manipulate history need to be sourced?










share|improve this question






























    1















    I executed



    history > before; (history -d $n); history > after


    where $n is the number corresponding to the last command I typed in the same interactive session before executing this line,



    The result is that the line marked $n is not removed from history. If I remove the parentheses so that the history -d runs in the current shell, it works as documented.



    How to understand this behavior? Is it true that all scripts that manipulate history need to be sourced?










    share|improve this question


























      1












      1








      1








      I executed



      history > before; (history -d $n); history > after


      where $n is the number corresponding to the last command I typed in the same interactive session before executing this line,



      The result is that the line marked $n is not removed from history. If I remove the parentheses so that the history -d runs in the current shell, it works as documented.



      How to understand this behavior? Is it true that all scripts that manipulate history need to be sourced?










      share|improve this question
















      I executed



      history > before; (history -d $n); history > after


      where $n is the number corresponding to the last command I typed in the same interactive session before executing this line,



      The result is that the line marked $n is not removed from history. If I remove the parentheses so that the history -d runs in the current shell, it works as documented.



      How to understand this behavior? Is it true that all scripts that manipulate history need to be sourced?







      bash history






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Apr 21 at 13:15







      Weijun Zhou

















      asked Apr 21 at 11:18









      Weijun ZhouWeijun Zhou

      1,892431




      1,892431




















          1 Answer
          1






          active

          oldest

          votes


















          3














          Each shell process has its own idea of what the command-line history is. When an interactive shell exits it will write its remembered history to ~/.bash_history for the next shell to pick up, but that's the extent of cooperation between shell processes.



          In your command, the () makes the shell fork a copy of itself to run history -d command. The child process starts out with a copy of the parent's internal state, so it knows the history, and is able to make changes to its copy of it.



          However, when the subshell exits, its copy of the history (which was just rewritten) is discarded together with the rest of its internal state). The subshell knows it is a subshell, so it doesn't even bother to write ~/.bash_history.




          A script that is not sourced usually cannot manipulate history at all, because it is interpreted by a fresh non-interactive shell that doesn't even read ~/.bash_history at startup.



          You can get the shell to behave like an interactive shell by specifying it on the command line:



          #!/bin/bash -i
          echo something


          The shell that runs this script will append its commands (which includes both the shebang line and the echo something) to the ~/.bash_history it finds on disk. But of course that doesn't affect the in-memory history copy of the shell process you invoke the script from, and when it exits the changes the script made to ~/.bash_history will be lost anyway.






          share|improve this answer























          • Great answer. It would be better if some reference to manual pages or other documents are included.

            – Weijun Zhou
            Apr 21 at 16:08











          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%2f513653%2fmodify-bash-history-from-inside-subshell-in-an-interactive-session%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









          3














          Each shell process has its own idea of what the command-line history is. When an interactive shell exits it will write its remembered history to ~/.bash_history for the next shell to pick up, but that's the extent of cooperation between shell processes.



          In your command, the () makes the shell fork a copy of itself to run history -d command. The child process starts out with a copy of the parent's internal state, so it knows the history, and is able to make changes to its copy of it.



          However, when the subshell exits, its copy of the history (which was just rewritten) is discarded together with the rest of its internal state). The subshell knows it is a subshell, so it doesn't even bother to write ~/.bash_history.




          A script that is not sourced usually cannot manipulate history at all, because it is interpreted by a fresh non-interactive shell that doesn't even read ~/.bash_history at startup.



          You can get the shell to behave like an interactive shell by specifying it on the command line:



          #!/bin/bash -i
          echo something


          The shell that runs this script will append its commands (which includes both the shebang line and the echo something) to the ~/.bash_history it finds on disk. But of course that doesn't affect the in-memory history copy of the shell process you invoke the script from, and when it exits the changes the script made to ~/.bash_history will be lost anyway.






          share|improve this answer























          • Great answer. It would be better if some reference to manual pages or other documents are included.

            – Weijun Zhou
            Apr 21 at 16:08















          3














          Each shell process has its own idea of what the command-line history is. When an interactive shell exits it will write its remembered history to ~/.bash_history for the next shell to pick up, but that's the extent of cooperation between shell processes.



          In your command, the () makes the shell fork a copy of itself to run history -d command. The child process starts out with a copy of the parent's internal state, so it knows the history, and is able to make changes to its copy of it.



          However, when the subshell exits, its copy of the history (which was just rewritten) is discarded together with the rest of its internal state). The subshell knows it is a subshell, so it doesn't even bother to write ~/.bash_history.




          A script that is not sourced usually cannot manipulate history at all, because it is interpreted by a fresh non-interactive shell that doesn't even read ~/.bash_history at startup.



          You can get the shell to behave like an interactive shell by specifying it on the command line:



          #!/bin/bash -i
          echo something


          The shell that runs this script will append its commands (which includes both the shebang line and the echo something) to the ~/.bash_history it finds on disk. But of course that doesn't affect the in-memory history copy of the shell process you invoke the script from, and when it exits the changes the script made to ~/.bash_history will be lost anyway.






          share|improve this answer























          • Great answer. It would be better if some reference to manual pages or other documents are included.

            – Weijun Zhou
            Apr 21 at 16:08













          3












          3








          3







          Each shell process has its own idea of what the command-line history is. When an interactive shell exits it will write its remembered history to ~/.bash_history for the next shell to pick up, but that's the extent of cooperation between shell processes.



          In your command, the () makes the shell fork a copy of itself to run history -d command. The child process starts out with a copy of the parent's internal state, so it knows the history, and is able to make changes to its copy of it.



          However, when the subshell exits, its copy of the history (which was just rewritten) is discarded together with the rest of its internal state). The subshell knows it is a subshell, so it doesn't even bother to write ~/.bash_history.




          A script that is not sourced usually cannot manipulate history at all, because it is interpreted by a fresh non-interactive shell that doesn't even read ~/.bash_history at startup.



          You can get the shell to behave like an interactive shell by specifying it on the command line:



          #!/bin/bash -i
          echo something


          The shell that runs this script will append its commands (which includes both the shebang line and the echo something) to the ~/.bash_history it finds on disk. But of course that doesn't affect the in-memory history copy of the shell process you invoke the script from, and when it exits the changes the script made to ~/.bash_history will be lost anyway.






          share|improve this answer













          Each shell process has its own idea of what the command-line history is. When an interactive shell exits it will write its remembered history to ~/.bash_history for the next shell to pick up, but that's the extent of cooperation between shell processes.



          In your command, the () makes the shell fork a copy of itself to run history -d command. The child process starts out with a copy of the parent's internal state, so it knows the history, and is able to make changes to its copy of it.



          However, when the subshell exits, its copy of the history (which was just rewritten) is discarded together with the rest of its internal state). The subshell knows it is a subshell, so it doesn't even bother to write ~/.bash_history.




          A script that is not sourced usually cannot manipulate history at all, because it is interpreted by a fresh non-interactive shell that doesn't even read ~/.bash_history at startup.



          You can get the shell to behave like an interactive shell by specifying it on the command line:



          #!/bin/bash -i
          echo something


          The shell that runs this script will append its commands (which includes both the shebang line and the echo something) to the ~/.bash_history it finds on disk. But of course that doesn't affect the in-memory history copy of the shell process you invoke the script from, and when it exits the changes the script made to ~/.bash_history will be lost anyway.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Apr 21 at 14:47









          Henning MakholmHenning Makholm

          48626




          48626












          • Great answer. It would be better if some reference to manual pages or other documents are included.

            – Weijun Zhou
            Apr 21 at 16:08

















          • Great answer. It would be better if some reference to manual pages or other documents are included.

            – Weijun Zhou
            Apr 21 at 16:08
















          Great answer. It would be better if some reference to manual pages or other documents are included.

          – Weijun Zhou
          Apr 21 at 16:08





          Great answer. It would be better if some reference to manual pages or other documents are included.

          – Weijun Zhou
          Apr 21 at 16:08

















          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%2f513653%2fmodify-bash-history-from-inside-subshell-in-an-interactive-session%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 write a 12-bar blues melodyI-IV-V blues progressionHow to play the bridges in a standard blues progressionHow does Gdim7 fit in C# minor?question on a certain chord progressionMusicology of Melody12 bar blues, spread rhythm: alternative to 6th chord to avoid finger stretchChord progressions/ Root key/ MelodiesHow to put chords (POP-EDM) under a given lead vocal melody (starting from a good knowledge in music theory)Are there “rules” for improvising with the minor pentatonic scale over 12-bar shuffle?Confusion about blues scale and chords

          What if the end-user didn't have the required library?What is setup.py?What is a clean, pythonic way to have multiple constructors in Python?What does Ruby have that Python doesn't, and vice versa?What is the reason for having '//' in Python?How do I create a namespace package in Python?How to package shared objects that python modules depend on?setuptools vs. distutils: why is distutils still a thing?Navigation in Windows 10 vs code not going to virtualenv library when the same library is installed at user levelPython create package for local usePackaging a project that uses multiple python versionsWhy is permission denied on pip install except for when “--user” is included at end of command?

          Why did Thanos need his ship to help him in the battle scene?Which actor plays Thanos in the Avengers mid-credits scene?Are there economic implications portrayed in comics where the buildings and cities are ruined almost daily?Old X-Men comic where team travels to alien world with a ring-like sun that needs recharging?Why does Ego need help sleeping?Is there an objective answer to who “the strongest Avenger” is?How did Banner get unstuck?Why did Thanos get hit?How did Thanos (or anyone) know the Infinity Stones would give him this power?Did Thanos leave Eitri alive for his after-sales service?In Avengers 1, why does Thanos need Loki?