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

          Wikipedia:Vital articles Мазмуну Biography - Өмүр баян Philosophy and psychology - Философия жана психология Religion - Дин Social sciences - Коомдук илимдер Language and literature - Тил жана адабият Science - Илим Technology - Технология Arts and recreation - Искусство жана эс алуу History and geography - Тарых жана география Навигация менюсу

          Club Baloncesto Breogán Índice Historia | Pavillón | Nome | O Breogán na cultura popular | Xogadores | Adestradores | Presidentes | Palmarés | Historial | Líderes | Notas | Véxase tamén | Menú de navegacióncbbreogan.galCadroGuía oficial da ACB 2009-10, páxina 201Guía oficial ACB 1992, páxina 183. Editorial DB.É de 6.500 espectadores sentados axeitándose á última normativa"Estudiantes Junior, entre as mellores canteiras"o orixinalHemeroteca El Mundo Deportivo, 16 setembro de 1970, páxina 12Historia do BreogánAlfredo Pérez, o último canoneiroHistoria C.B. BreogánHemeroteca de El Mundo DeportivoJimmy Wright, norteamericano do Breogán deixará Lugo por ameazas de morteResultados de Breogán en 1986-87Resultados de Breogán en 1990-91Ficha de Velimir Perasović en acb.comResultados de Breogán en 1994-95Breogán arrasa al Barça. "El Mundo Deportivo", 27 de setembro de 1999, páxina 58CB Breogán - FC BarcelonaA FEB invita a participar nunha nova Liga EuropeaCharlie Bell na prensa estatalMáximos anotadores 2005Tempada 2005-06 : Tódolos Xogadores da Xornada""Non quero pensar nunha man negra, mais pregúntome que está a pasar""o orixinalRaúl López, orgulloso dos xogadores, presume da boa saúde económica do BreogánJulio González confirma que cesa como presidente del BreogánHomenaxe a Lisardo GómezA tempada do rexurdimento celesteEntrevista a Lisardo GómezEl COB dinamita el Pazo para forzar el quinto (69-73)Cafés Candelas, patrocinador del CB Breogán"Suso Lázare, novo presidente do Breogán"o orixinalCafés Candelas Breogán firma el mayor triunfo de la historiaEl Breogán realizará 17 homenajes por su cincuenta aniversario"O Breogán honra ao seu fundador e primeiro presidente"o orixinalMiguel Giao recibiu a homenaxe do PazoHomenaxe aos primeiros gladiadores celestesO home que nos amosa como ver o Breo co corazónTita Franco será homenaxeada polos #50anosdeBreoJulio Vila recibirá unha homenaxe in memoriam polos #50anosdeBreo"O Breogán homenaxeará aos seus aboados máis veteráns"Pechada ovación a «Capi» Sanmartín e Ricardo «Corazón de González»Homenaxe por décadas de informaciónPaco García volve ao Pazo con motivo do 50 aniversario"Resultados y clasificaciones""O Cafés Candelas Breogán, campión da Copa Princesa""O Cafés Candelas Breogán, equipo ACB"C.B. Breogán"Proxecto social"o orixinal"Centros asociados"o orixinalFicha en imdb.comMario Camus trata la recuperación del amor en 'La vieja música', su última película"Páxina web oficial""Club Baloncesto Breogán""C. B. Breogán S.A.D."eehttp://www.fegaba.com

          Vilaño, A Laracha Índice Patrimonio | Lugares e parroquias | Véxase tamén | Menú de navegación43°14′52″N 8°36′03″O / 43.24775, -8.60070