Bash मध्ये !! आणि !$: history expansion कसे वापरावे
!! मागील command पुन्हा चालवते, तर !$ तिचा शेवटचा argument देते. Bash मधील उपयुक्त सहा history expansions आणि command चालवण्यापूर्वी दाखवणारे :p जाणून घ्या.
What bash history expansion does
Bash history expansion rebuilds an earlier command line from your shell history before bash runs it. !! repeats the previous command. !$ inserts the last argument of the previous command. The substitution is textual and it happens first, before bash splits the line into words, so what comes back is the exact characters you typed the first time.
Six forms cover almost everything you will do on a server:
!!repeats the whole previous line, andsudo !!runs it again as root.!$is the last argument of the previous line.!*is every argument of the previous line.!nruns history entry number n, and!-ncounts backwards from where you are now.!stringruns the most recent command that started withstring.^old^newreruns the previous line with the firstoldreplaced bynew.
Everything below is typed at an interactive prompt on your own server. History expansion is switched off in scripts, which the last section explains.
एकदा टाइप केलेला लांब path
हा असा प्रसंग आहे की ही पद्धत वापरल्याचा त्वरित फायदा होतो. तुम्ही release directory तयार करत आहात आणि path इतका लांब आहे की तो दुसऱ्यांदा टाइप केल्यास typo होण्याची शक्यता वाढते.
sudo mkdir -p /srv/www/app/releases/2026-08-07
sudo chown -R deploy:deploy !$
ls -ld !$
sudo -u deploy nano !$/config.envप्रत्येक ओळ चालवण्यापूर्वी, expansion मधून तयार झालेली ओळ bash छापतो:
sudo chown -R deploy:deploy /srv/www/app/releases/2026-08-07तो echo तुमची पडताळणी आहे. command चे output वाचण्यापूर्वी तो वाचा, कारण bash ने !$ चा अर्थ काय लावला हे पाहण्याची तुम्हाला मिळणारी तीच एक संधी असते.
ही साखळी कार्य करते कारण bash तुम्ही टाइप केलेला !$ नव्हे, तर expanded ओळ history मध्ये साठवतो. त्यामुळे line 3 तिचा शेवटचा argument expanded line 2 मधून घेते आणि line 4 तो line 3 मधून घेते. line 4 हेही दाखवते की designator नंतर text येऊ शकतो: !$/config.env च्या शेवटी /config.env असलेला path तयार होतो, कारण word designator / वर थांबतो.
त्याच session मधील आणखी एक उदाहरण. file संपादित केल्यानंतर, ती असलेली directory list करायची आहे:
ls -l !$:h:h हा head modifier आहे. तो path मधील शेवटचा component काढून टाकतो; हेच काम dirname करते. :t फक्त शेवटचा component ठेवते, :r extension काढून टाकते आणि :e फक्त extension ठेवते.
!! आणि sudo !! वापरून मागील command पुन्हा चालवा
तुम्ही sudo विसरता आणि service manager ते सांगतो:
systemctl restart nginxFailed to restart nginx.service: Interactive authentication required.sudo !!Bash !! च्या जागी मागील ओळीतील मजकूर ठेवतो. त्यामुळे shell sudo systemctl restart nginx चालवतो.
!! म्हणजे मागील ओळ जशीच्या तशी. ती ओळ काहीही असू शकते. याच ठिकाणी नेहमीची चूक होते. मागील command अयशस्वी झाला असे तुम्हाला वाटते. पण त्यानंतर तुम्ही cd किंवा history चालवलेले असू शकते. अयशस्वी command दोन ओळी आधीचा देखील असू शकतो. अशा वेळी sudo !! चुकीचा command root privileges सह चालवतो. खात्री नसल्यास तो आधी print करा:
sudo !!:p:p expanded line print करतो, पण ती चालवत नाही. print केलेली ओळ तुमच्या history मध्ये जोडली जाते. ती योग्य असल्यास, पुढील ओळीवर साधा !! चालवून ती execute करता येते.
!$ सह शेवटचा argument पुन्हा वापरा
!$ हा मागील ओळीतील शेवटचा शब्द आहे. तुम्ही सर्वाधिक वापरणार असलेला हा प्रकार आहे, कारण शेवटचा शब्द सामान्यतः तुम्ही ज्या गोष्टीवर काम करत असता ती असते: path किंवा service name.
sudo systemctl status nginx
sudo systemctl reload !$येथे दोन गोष्टी लोकांना आश्चर्यचकित करतात.
पहिली गोष्ट म्हणजे !$ हा शेवटचा शब्द आहे. तो तुमच्या मनातील शेवटचा argument असेलच असे नाही. मागील ओळ redirection ने संपली असल्यास, शेवटचा शब्द हा redirect target असतो:
sudo nginx -T > /tmp/nginx-dump.conf
less !$हा प्रकार योग्य परिणाम देतो. परंतु journalctl -u nginx > /tmp/log.txt नंतर !$ हे /tmp/log.txt असते, nginx नाही. प्रतिध्वनित झालेली ओळ वाचा.
दुसरी गोष्ट म्हणजे expansion मजकूराच्या पातळीवर होते, त्यामुळे variable पुन्हा unexpanded स्वरूपात येतो. ls $HOME/backups नंतर !$ तुम्हाला $HOME/backups ही अक्षरे देते आणि bash त्यांचा पुन्हा सामान्य parameter म्हणून विस्तार करते. हा क्रम लक्षात ठेवा: history expansion ही parameter expansion आणि $( ) सह command substitution यांच्याआधी चालते. त्यामुळे तिला values दिसत नाहीत; फक्त मजकूर दिसतो.
शेजारील प्रकार माहीत असणे उपयुक्त आहे. !^ हा पहिला argument आहे, !:2 हा दुसरा आहे आणि !:2-4 ही range आहे. !!:$ हा !$ लिहिण्याचा लांब प्रकार आहे.
मजकूर लागू करण्यापूर्वी पाहायचा असल्यास Alt-. दाबा. किंवा Esc आणि त्यानंतर . दाबा. Readline मागील command चा शेवटचा argument थेट prompt मध्ये घालते. तेथे तुम्ही त्यात बदल करू शकता. मागील command च्या आधीच्या command च्या शेवटच्या argument कडे जाण्यासाठी ते पुन्हा दाबा. तुम्ही Enter दाबेपर्यंत काहीही चालवले जात नाही.
प्रत्येक argument !* सह पुढे पाठवा
!* हा मागील ओळीतील पहिल्या शब्दाव्यतिरिक्त प्रत्येक शब्द आहे.
stat /srv/www/app/shared/config.env /srv/www/app/shared/secrets.env
sudo chmod 600 !*“पहिल्या शब्दाव्यतिरिक्त” हा भाग महत्त्वाचा आहे. !* शब्द 0 वगळतो आणि इतर काहीही वगळत नाही, त्यामुळे options paths सोबत पुढे जातात. ls -l file1 file2 नंतर, !* हे -l file1 file2 असते. त्यामुळे sudo chmod 600 !* अयशस्वी होते, कारण chmod ला argument म्हणून -l मिळते. शब्दांची क्रमवारी शून्यापासून मोजा आणि त्याऐवजी slice वापरा: !!:2* म्हणजे शब्द 2 पासून शेवटपर्यंत.
sudo सोबतही हाच सापळा आहे. sudo chown deploy:deploy /srv/www/app नंतर, शब्द 0 हे sudo आणि शब्द 1 हे chown असते. त्यामुळे !* पुढील command ला chown deploy:deploy /srv/www/app देते. तुम्हाला बहुधा हे अपेक्षित नव्हते.
स्थितीनुसार !n आणि !-n वापरून कमांड निवडा
history प्रत्येक नोंदीच्या सुरुवातीला क्रमांक देऊन यादी दाखवते.
history 5 512 sudo nginx -t
513 sudo systemctl reload nginx
514 ss -tulpn
515 sudo tail -f /var/log/nginx/error.log
516 history 5!513 नोंद 513 पुन्हा चालवते. !-2 तुम्ही सध्या टाइप करत असलेल्या ओळीपासून मोजल्यावर दोन ओळी मागची नोंद चालवते; त्यामुळे !-1 आणि !! यांचा अर्थ समान असतो.
वापरण्यापूर्वी लगेच क्रमांक तपासा. तुम्ही काहीही चालवता, त्यात विचार न करता चालवलेले ls देखील समाविष्ट आहे, तेव्हा !-2 प्रत्येक वेळी वेगळ्या ठिकाणी निर्देश करते. एका session मध्ये absolute क्रमांक स्थिर असतात. मात्र त्याच मशीनवरील दुसऱ्या session मध्ये तेच क्रमांक नसतात. पुढील login वेळी history file पुन्हा वाचल्यानंतरही ते क्रमांक बदललेले असू शकतात. काल लक्षात ठेवलेला क्रमांक आज वेगळ्या कमांडकडे निर्देश करतो.
!string या prefix ने कमांड पुन्हा चालवा
!string, string ने सुरू होणारी सर्वात अलीकडील कमांड चालवते.
!ssयामुळे वरील यादीतील ss -tulpn पुन्हा चालते. ही कमांड Linux सर्व्हरवर कोणते पोर्ट खुले आहेत येथे वर्णन केलेली listening socket तपासणी करते. !?string? ओळीच्या सुरुवातीऐवजी तिच्या कोणत्याही ठिकाणी जुळते. त्यामुळे argument आठवत असेल पण कमांडचे नाव आठवत नसेल, तरी ते उपयुक्त ठरते.
Prefix मोठा ठेवा. !s हे ss, sudo, systemctl किंवा shutdown यांपैकी सर्वात अलीकडे चालवलेल्या कमांडशी जुळेल. कमांड चालवेपर्यंत नेमकी कोणती कमांड निवडली आहे हे कळणार नाही. !string:p जुळणारी कमांड न चालवता ती दाखवते. काहीही जुळले नाही, तर bash bash: !ss: event not found दाखवते आणि काहीही चालवत नाही. हा सुरक्षित परिणाम आहे.
^old^new ने एक टायपो दुरुस्त करा
sudo systemctl status ngnixUnit ngnix.service could not be found.^ngnix^nginxShell मागील ओळ पुन्हा चालवतो आणि पहिल्या ngnix च्या जागी nginx ठेवतो. फक्त पहिला जुळणारा भाग बदलला जातो. प्रत्येक जुळणारा भाग बदलण्यासाठी मोठा प्रकार !!:gs/ngnix/nginx/ वापरा. येथे s चा अर्थ substitute आणि g चा अर्थ संपूर्ण ओळीवर ही कृती करा असा आहे.
ते चालवण्यापूर्वी expansion छापा
Expansion मुळे अनपेक्षित command चालण्याचा अपघात टाळण्यासाठी दोन सवयी उपयोगी पडतात.
पहिली सवय म्हणजे :p, जी तुम्ही आधी पाहिली आहे. ती expansion च्या शेवटी जोडा. मग bash result चालवण्याऐवजी तो छापतो: !!:p किंवा !systemctl:p. छापलेली ओळ तुमच्या history मध्ये जाते. त्यामुळे त्यानंतर !! चालवल्यास तुम्ही नुकतेच पाहिलेले काम प्रत्यक्ष चालते.
दुसरी पद्धत अधिक सुरक्षित आहे. कारण काहीही लक्षात ठेवावे लागत नाही आणि ती प्रत्येक expansion ला लागू होते:
shopt -s histverifyही ओळ ~/.bashrc मध्ये ठेवा. histverify सेट केले असल्यास Enter दाबल्यावर expansion चालत नाही. Bash expanded ओळ तुमच्या prompt मध्ये परत लिहितो. त्यामुळे तुम्ही ती वाचून संपादित करू शकता. ती चालवण्यासाठी दुसऱ्यांदा Enter दाबा. यासाठी एक अतिरिक्त कीस्ट्रोक लागतो, पण अशा प्रकारच्या अपघातांची संपूर्ण शक्यता दूर होते. यासाठी readline आवश्यक आहे. त्यामुळे हे interactive prompt वरच कार्य करते; इतरत्र नाही.
काम करण्याची दुसरी पद्धत Ctrl-R आहे. ती कधीही expansion करत नाही. Ctrl-R दाबा आणि command चा काही भाग टाइप करा. Prompt बदलून reverse-i-search prompt होतो आणि तुम्ही टाइप करत असताना सर्वात अलीकडील जुळणारी command दाखवतो. जुन्या जुळणाऱ्या commands पाहण्यासाठी पुन्हा Ctrl-R दाबा. दाखवलेली ओळ चालवण्यासाठी Enter दाबा. Search रद्द करून मूळ prompt परत मिळवण्यासाठी Ctrl-G दाबा. Left arrow key दाबल्यास search संपतो आणि जुळलेली ओळ prompt मध्ये editing साठी ठेवली जाते.
Command आधी पाहायची असल्यास Ctrl-R वापरा. Command एक ओळ जुनी असेल आणि ती अजूनही स्क्रीनवर वाचता येत असेल, तर !! आणि !$ वापरा.
echo "done!" event not found असे का दाखवते
echo "deploy done!"bash: !": event not foundकोटिंगचे निराकरण होण्यापूर्वी history expansion चालते आणि double quotes ! या अक्षराचे संरक्षण करत नाहीत. केवळ single quotes आणि backslash हे संरक्षण करतात. त्यामुळे echo 'deploy done!' तुमच्या अपेक्षेप्रमाणे output देते. backslash देखील expansion थांबवतो; परंतु double quotes मध्ये bash तो backslash output मध्ये ठेवतो. त्यामुळे single quotes हा स्वच्छ उपाय आहे.
पासवर्डच्या बाबतीत ही समस्या विशेषतः गंभीर ठरते, कारण मजबूत पासवर्डमध्ये अनेकदा ! असते. mysql -u app -p"S3cret!pass" सारखी command event-not-found त्रुटीमुळे अयशस्वी होऊ शकते. किंवा history मधील एखादी नोंद जुळल्यास ती कोणतीही सूचना न देता वेगळी string पाठवू शकते. single quotes वापरा. त्याहून चांगले म्हणजे tool ला prompt दाखवू द्या, जेणेकरून secret command line वर येणार नाही. ही सवय account hygiene च्या इतर पद्धतींसोबत ठेवावी: नवीन VPS वरील सुरुवातीच्या दहा मिनिटांसाठी नवीन VPS वरील पहिली दहा मिनिटे पहा. नवीन box वर keys आणि passwords कसे हाताळावेत, हे त्यात सांगितले आहे.
! अक्षरांनी भरलेला text block paste करणार असाल, तर session साठी expansion set +H ने बंद करा आणि set -H ने पुन्हा सुरू करा.
HISTSIZE, HISTFILESIZE आणि तुमचा history कुठे संग्रहित केला जातो
दोन variables आहेत. त्यांची नावे सारखी असल्यामुळे त्यांच्यात अनेकदा गोंधळ होतो.
HISTSIZEम्हणजे चालू shell memory मध्ये किती commands ठेवतो.HISTFILESIZEम्हणजे disk वरील file मध्ये किती lines ठेवल्या जातात,~/.bash_historyजोपर्यंतHISTFILEवेगळे सांगत नाही.
shell बंद झाल्यावर file लिहिली जाते. त्या वेळी ती HISTFILESIZE lines पर्यंत truncated केली जाते. Ubuntu मधील default ~/.bashrc मध्ये 1000 आणि 2000 values सेट केलेल्या असतात. तुमच्या system मध्ये प्रत्यक्षात कोणत्या values आहेत ते तपासा:
grep HIST ~/.bashrc
echo "$HISTSIZE $HISTFILESIZE $HISTFILE"तुमच्या !string searches मध्ये तुम्ही निश्चितपणे चालवलेल्या commands सापडत नसतील, तर दोन्ही values वाढवा. 10000 आणि 20000 या values सामान्य आहेत आणि त्यासाठी जवळजवळ कोणताही अतिरिक्त खर्च होत नाही, कारण file plain text असते. Negative value म्हणजे कोणतीही मर्यादा नाही.
तुम्ही आठवडाभरानंतर server वर परत येता तेव्हा timestamps उपयुक्त ठरतात:
export HISTTIMEFORMAT='%F %T 'त्यानंतर history प्रत्येक entry च्या आधी date आणि time दाखवते. याचे कारण bash प्रत्येक command च्या आधी epoch seconds असलेली comment line file मध्ये लिहू लागते.
एकाच वेळी एकापेक्षा जास्त terminals वापरल्यावर history गायब होते, ही सामान्य तक्रार आहे. प्रत्येक shell आपली स्वतंत्र list memory मध्ये ठेवतो आणि बंद होताना ती लिहितो. त्यामुळे histappend नसल्यास शेवटी बंद होणारा shell इतर shells ने जतन केलेली माहिती overwrite करतो. दोन settings हे दुरुस्त करतात:
shopt -s histappend
export PROMPT_COMMAND='history -a'histappend मुळे shell आपली list file बदलण्याऐवजी तिच्या शेवटी add करतो. history -a प्रत्येक prompt नंतर नवीन lines append करते. त्यामुळे session व्यवस्थित बंद न होता kill झाले तरी त्यातील commands file मध्ये राहतात. Ubuntu मधील default ~/.bashrc मध्ये histappend आधीच सेट केलेले आहे. तुम्ही जितक्या अधिक machines चालवता तितके हे महत्त्वाचे ठरते, कारण history प्रत्येक user साठी प्रत्येक machine वर स्वतंत्रपणे संग्रहित केला जातो. त्यामुळे एका workstation वरून अनेक servers व्यवस्थापित करताना तुम्हाला हवा असलेला !$ कदाचित दुसऱ्या host वरच असू शकतो.
Bash history मध्ये secrets ठेवणे टाळणे
HISTCONTROL कोणत्या ओळी जतन करायच्या हे ठरवते.
ignorespaceने space ने सुरू होणारी प्रत्येक ओळ वगळली जाते.ignoredupsमागील ओळीसारखीच असलेली ओळ वगळते.ignorebothवरील दोन्ही कृती करते.erasedupsजतन केल्या जाणाऱ्या ओळीची प्रत्येक जुनी प्रत काढून टाकते.
export HISTCONTROL=ignorebothignorespace सक्रिय असल्यास, सुरुवातीला दिलेला एक space command ला memory मधील यादीबाहेर ठेवतो. त्यामुळे तो file पर्यंतही पोहोचत नाही. त्यावर अवलंबून राहण्यापूर्वी echo "$HISTCONTROL" ने त्याची value तपासा. Ubuntu चा default user .bashrc, ignoreboth सेट करतो. परंतु root shell किंवा minimal image मध्ये ते unset असू शकते. अशा वेळी सुरुवातीचा space काहीही परिणाम करत नाही आणि ती ओळ इतर कोणत्याही ओळीसारखी जतन केली जाते.
यामुळे नेमके कशाचे संरक्षण होते, याबाबत स्वतःशी प्रामाणिक रहा. ती ओळ ~/.bash_history मध्ये जतन होत नाही. Process चालू असताना ती ps च्या output मध्ये दिसत राहते. त्यामुळे त्या मशीनवरील कोणताही अन्य user ती तेथे वाचू शकतो. sudo ने चालवलेला command system log मध्ये नोंदवला जातो. History file साध्या text स्वरूपात असते. त्यामुळे तिचा mode 600 ठेवा आणि हे लक्षात ठेवा की तुमची home directory वाचू शकणारी कोणतीही व्यक्ती तुमचे मागील काही हजार commands वाचू शकते.
संवेदनशील माहिती आधीच यादीत असल्यास, ती entry काढून file पुन्हा लिहा:
history
history -d 517
history -whistory -d ती entry memory मधून काढते आणि history -w सध्याची यादी file वर लिहिते. history -c संपूर्ण यादी साफ करते. Secrets ऐवजी अनावश्यक commands साठी संबंधित setting HISTIGNORE आहे: HISTIGNORE='ls:pwd:history:clear' अशा ओळी यादीत येऊ देत नाही, त्यामुळे तुमच्या searches मध्ये उपयुक्त results मिळतात.
शेल स्क्रिप्टमध्ये history expansion काहीही का करत नाही
History expansion ही interactive shells साठी असते. स्क्रिप्ट non-interactive shell मध्ये चालते. त्या shell मध्ये history list enabled नसते आणि expansion बंद असते. त्यामुळे !! आणि !$ हे ओळीतील सामान्य मजकूर म्हणूनच राहतात. स्क्रिप्टमध्ये sudo !! दिल्यास sudo !! नावाची command अक्षरशः चालवण्याचा प्रयत्न करते आणि तो अयशस्वी होतो.
तुम्ही सध्या वापरत असलेल्या कोणत्याही shell मध्ये हे तपासा:
echo $-Output मध्ये सध्याच्या option flags चा संच दिसतो. तो साधारणपणे himBHs सारखा असतो. i म्हणजे shell interactive आहे. H म्हणजे history expansion enabled आहे. हीच ओळ स्क्रिप्टमध्ये चालवून पाहा. त्यात यापैकी एकही अक्षर दिसणार नाही.
तुमच्या shell कामाच्या दोन भागांमधील फरक इथे स्पष्ट होतो. Prompt वर, !$ आणि Ctrl-R मुळे अजून दिसत असलेल्या commands मधील keystrokes वाचतात. File मध्ये मात्र गोष्टींची नावे स्पष्टपणे द्यावी लागतात: path variable मध्ये ठेवा किंवा command substitution वापरून output घ्या. तुमच्या वैयक्तिक history वर अवलंबून असलेली स्क्रिप्ट पुढील व्यक्तीने चालवल्यावर वेगळे वर्तन करेल. हे स्क्रिप्टच्या उद्देशाच्या विरुद्ध आहे.
म्हणून या पृष्ठावरील प्रत्येक उदाहरण live prompt वर type करण्यासाठी आहे. .sh file मध्ये paste केल्यावर यापैकी कोणतेही उदाहरण त्याच प्रकारे चालणार नाही.
FAQ
bash मध्ये !! काय करते?
!! मागील command line चा संपूर्ण मजकूर विस्तारते, त्यामुळे sudo !! तुमची शेवटची command root म्हणून पुन्हा चालवते. हा विस्तार मजकूराच्या पातळीवर होतो आणि bash ने line parse करण्यापूर्वी होतो. ती चालवण्यापूर्वी bash तयार झालेली line दाखवते. मागील line कोणती होती याची खात्री नसल्यास प्रथम sudo !!:p टाइप करा. :p विस्तार दाखवते पण तो चालवत नाही. तसेच ती दाखवलेली line तुमच्या history मध्ये जोडते, त्यामुळे त्यानंतरचे !! ती चालवते.
मागील command चा शेवटचा argument पुन्हा कसा वापरायचा?
!$ वापरा. sudo mkdir -p /srv/www/app/releases नंतर ls -ld !$ ही line ls -ld /srv/www/app/releases मध्ये बदलते. यात line मधील शेवटचा word घेतला जातो. त्यामुळे शेवटी असलेला redirection target शेवटचा word मानला जातो. त्याला text जोडू शकता: !$/config.env path मध्ये text जोडते, कारण word designator / वर थांबतो. परस्परसंवादी पर्याय Alt-. आहे. तो हाच मजकूर तुमच्या prompt मध्ये घालतो, त्यामुळे Enter दाबण्यापूर्वी तो वाचता येतो.
माझ्या text मध्ये exclamation mark असल्यास bash "event not found" असे का सांगते?
Double quotes ! ला history expansion पासून सुरक्षित ठेवत नाहीत. त्यामुळे echo "done!" bash ला history event शोधायला लावते आणि bash: !": event not found दाखवते. Single quotes त्याचे संरक्षण करतात, म्हणून echo 'done!' लिहा. Backslash देखील expansion थांबवतो. मात्र double quotes च्या आत bash output मध्ये backslash ठेवते. ! असलेला मोठा block paste करायचा असल्यास session साठी expansion बंद करण्याकरिता set +H चालवा.
माझ्या shell script मध्ये !! आणि !$ का काम करत नाहीत?
History expansion फक्त interactive shells मध्ये enabled असते. Script non-interactively चालते. त्यामुळे shell history list तयार करत नाही आणि !! line मध्ये plain text म्हणूनच राहते. तुम्ही कोणत्या प्रकारच्या shell मध्ये आहात हे पाहण्यासाठी echo $- चालवा. Interactive shell मध्ये i आणि H यांसह flags दिसतात. Script मध्ये दोन्ही दिसत नाहीत. Scripts मध्ये त्याऐवजी variable किंवा command substitution वापरा.
माझ्या bash history मध्ये password जतन होऊ नये यासाठी काय करावे?
~/.bashrc मध्ये HISTCONTROL=ignorespace किंवा HISTCONTROL=ignoreboth सेट करा. त्यानंतर command ची सुरुवात एकाच space ने करा; ती command कधीही जतन केली जाणार नाही. प्रथम echo "$HISTCONTROL" ने value तपासा, कारण ती unset असल्यास सुरुवातीचा space काहीही परिणाम करत नाही. यामुळे line फक्त ~/.bash_history मधून वगळली जाते. ती चालू असताना command अजूनही ps मध्ये दिसते आणि sudo ने तिने execute केलेल्या commands ची नोंद केली जाते. Secret आधीच जतन झाले असल्यास history ने त्याचा number शोधा. त्यानंतर file पुन्हा लिहिण्यासाठी history -d <number> आणि history -w चालवा.