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;
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 source
d?
bash history
add a comment |
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 source
d?
bash history
add a comment |
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 source
d?
bash history
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 source
d?
bash history
bash history
edited Apr 21 at 13:15
Weijun Zhou
asked Apr 21 at 11:18
Weijun ZhouWeijun Zhou
1,892431
1,892431
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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.
Great answer. It would be better if some reference to manual pages or other documents are included.
– Weijun Zhou
Apr 21 at 16:08
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
Great answer. It would be better if some reference to manual pages or other documents are included.
– Weijun Zhou
Apr 21 at 16:08
add a comment |
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.
Great answer. It would be better if some reference to manual pages or other documents are included.
– Weijun Zhou
Apr 21 at 16:08
add a comment |
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.
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.
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
add a comment |
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
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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