බහු පර්යන්ත කවුළු වල bash ඉතිහාසය සුරකින්න


570

මම නිරන්තරයෙන් එක පර්යන්තයකට වඩා විවෘතව සිටිමි. දෙකේ සිට දහය දක්වා ඕනෑම තැනක, විවිධ බිටු සහ බොබ් කරමින්. දැන් කියමු මම නැවත ආරම්භ කර තවත් පර්යන්ත කට්ටලයක් විවෘත කරමි. සමහරුන්ට සමහර දේවල් මතකයි, සමහරුන්ට අමතකයි.

මට ඉතිහාසයක් අවශ්‍යයි:

  • සෑම පර්යන්තයකින්ම සියල්ල සිහිපත් කරයි
  • සෑම පර්යන්තයකින්ම ක්ෂණිකව ප්‍රවේශ විය හැකිය (උදා: මම lsඑකක නම්, දැනටමත් ක්‍රියාත්මක වන තවත් පර්යන්තයකට මාරු වී පසුව ඔබන්න, lsපෙන්වයි)
  • විධානයේ ඉදිරිපස අවකාශයක් තිබේ නම් විධානය අමතක නොකරන්න.

බාෂ් වැඩිපුර වැඩ කිරීමට මට කළ හැකි යමක් තිබේද?


65
එහි වාසිය මට පෙනේ, නමුත් පෞද්ගලිකව මම එය මගේ කවචයේ පිළිකුල් කරමි. මම සාමාන්‍යයෙන් ටැබ් 3 ක් හෝ 4 ක් මගේ ටර්මිනලයේ ඉතා නිශ්චිත භාවිතයන් සඳහා විවෘතව තබමි: එකක් 'සාදන්න' ධාවනය කිරීම, vi සමඟ එකක්, දේවල් ධාවනය කිරීම සඳහා යනාදිය. එබැවින් මම සම්පාදනය කරන විට, මම ටැබ් 1 වෙත ගොස්, පහර දී 'සාදන්න 'එනවා, සහ එසේ ය. මෙය මට අතිශයින්ම tive ලදායී ය. ඉතින් හදිසියේම මම මගේ 'සාදන්න' ටැබයට ගොස් පහර දී අහඹු ලෙස grep විධානයක් පෙන්වන්නේ නම්, මම සැබවින්ම පීඩා විඳින්නෙමි! පුද්ගලික සටහනක් වුවද
axel_c

5
trueaxel_c එය සත්‍යයකි. පවත්නා පර්යන්ත ඔවුන්ගේ ඉතිහාසය පමණක් දකින නමුත් නව ඒවා කාලානුක්‍රමිකව නිවැරදි විධාන ලැයිස්තුවක් දකින තැන එය කිරීමට බුද්ධිමත් ක්‍රමයක් ගැන මට සිතිය නොහැකිය.
ඔලි

9
Li ඔලි මෙසේ ලිවීය, "පවතින පර්යන්තයන් තමන්ගේ ඉතිහාසය පමණක් දකින නමුත් නව ඒවා කාලානුක්‍රමිකව නිවැරදි විධාන ලැයිස්තුවක් දකින තැන එය කිරීමට බුද්ධිමත් ක්‍රමයක් ගැන මට සිතිය නොහැකිය." ආකාරය පිළිබඳ (Paradox නම් මෘදුකාංගය): export PROMPT_COMMAND="history -a; $PROMPT_COMMAND". පවතින කවච මඟින් නව කවච බැලීමට එක් එක් විධානයන් ඉතිහාස ගොනුවට එක් කරනු ඇත, නමුත් ඒවායේ ඉතිහාසය පමණක් පෙන්වයි.
ක්‍රිස් පේජ්

2
ඉතිහාසය සියල්ල වෙන වෙනම ගබඩා කර හෝ සියල්ල තනි ඉතිහාස ගොනුවකට ඒකාබද්ධ කිරීමට ඔබට අවශ්‍යද?
kbyrd

3
කෙටි පිළිතුර නම්: එය බාෂ් සංවර්ධකයින් විසින් අදහස් නොකෙරේ. ෆ්ලෂ් කිරීම මත පදනම් වූ විසඳුම් පසුව ඉතිහාසය නැවත කියවීම බොහෝ දුරට සාර්ථක වනු ඇත, නමුත් ෂ්ලෙමියෙල් ද පේන්ටර් ගැන පරිස්සම් වන්න . සරල වචන වලින්: එක් එක් විධානය අතර සැකසුම් වැඩ ප්‍රමාණය ඉතිහාසයේ ප්‍රමාණයට සමානුපාතික වේ.
ස්ටෙෆාන් ගුරිචොන්

Answers:


359

පහත සඳහන් දෑ ~ / .bashrc වෙත එක් කරන්න

# Avoid duplicates
HISTCONTROL=ignoredups:erasedups  
# When the shell exits, append to the history file instead of overwriting it
shopt -s histappend

# After each command, append to the history file and reread it
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

24
මෙම PROMPT_COMMAND විසඳුමේ ඇති ගැටළුව නම්, එක් එක් විධානයෙන් පසුව එක් එක් ඉතිහාස අයිතමයේ සංඛ්‍යා වෙනස් වීමයි :(. උදාහරණයක් ලෙස ඔබ ඉතිහාසය ටයිප් කරන්නේ නම් සහ 1) ls 2) rm නම්, ඔබ කරන්නේ 1 නැවත කිරීමට 1, ඉතිහාස අංකය වෙනස් විය හැකි අතර සමහර විට rm විධානය ක්‍රියාත්මක කළ හැකිය ...
ක්‍රිස් කිම්ප්ටන්

3
මම මේ කරන විට, වෙනත් දැනටමත් විවෘත පර්යන්ත පසුගිය ඇතුල් විධාන නොමැති මම විධානයක් නිකුත් වන තුරු 'දක්වා' එබූ විට කරන්නේ බව පර්යන්තය - මෙම අපේක්ෂා කරන්නේ කුමක්ද? එසේ නම්, වෙනත් පර්යන්තවල ඉතිහාසය ක්ෂණිකව වෙනස් කිරීමට ක්‍රමයක් තිබේද?
සුආන්

8
U සුආන්, මෙය විධාන මත පදනම්ව මට නිවැරදි බව පෙනේ. ඉතිහාසය යාවත්කාලීන කිරීම සඳහා අපට ශුන්‍ය විධානයක් නිකුත් කළ හැකි බව (එන්ටර් යතුර ඔබන්න).
අග්ගිස්

3
සැබවින්ම history -a(...) බාෂ් ඉතිහාසය යන ප්‍රශ්නයට මෙම පිළිතුරට අනුව අනුපිටපත් මකා දැමීම අවුලුවන්නේ නැත: “නොසලකා හරින ලද” සහ “මකාදැමීම්” සැසි පුරා පොදු ඉතිහාසය සමඟ ගැටුම් ඇති කරයි . මෙම පිළිතුර සැකසුම history -<option>සමඟ ක්‍රියා කරන විධාන අනුක්‍රමය ද ලබා දෙයි HISTCONTROL=ignoredups:erasedups.
පියොටර් ඩොබ්‍රොගොස්ට්

27
කිරීමට කිසි ම හේතුවක් නැත exportයන HISTCONTROLහා PROMPT_COMMANDවිචල්යයන්: ඔබ ඔවුන් නිර්වචනය කරන්නේ .bashrcඔවුන් (ද නාස්තිකාර වන පවා ඒකාකාරී අය තුළ,) සෑම ෂෙල් අර්ථ කරනු ඇත එසේ.
ඩොල්මන්

259

ඉතින්, මේ සියල්ල මගේ ඉතිහාසය හා සම්බන්ධ .bashrcදෙයක්:

export HISTCONTROL=ignoredups:erasedups  # no duplicate entries
export HISTSIZE=100000                   # big big history
export HISTFILESIZE=100000               # big big history
shopt -s histappend                      # append to history, don't overwrite it

# Save and reload the history after each command finishes
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

මැක් ඕඑස් එක්ස් 10.5 හි බාෂ් 3.2.17, 10.6 මත බාෂ් 4.1.7 සමඟ පරීක්ෂා කර ඇත.


4
හ්ම් .. මෙය විධාන අංක සෑම විමසුමක්ම වෙනස් කරන බැවින් $! 34 භාවිතා කිරීමේ හැකියාව විනාශ කරයි. Av ඩේවිඩ් @ ස්කොෆ් chkch වැඩ කිරීමේ විසඳුමක් තිබේද?

5
අසීමිත ඉතිහාසය ලබා ගැනීමට මෙය භාවිතා කරන්න: සදාකාලික ඉතිහාසය බැෂ් කරන්න . කෙසේ වෙතත්, මෙය ස්වයංක්‍රීයව නැවත පූරණය නොවන බැවින් ඉහත කේතයට අනුකූල වේ.

8
FYI මෙහි සඳහන් කිසිදු විසඳුමකට පහත සඳහන් ගැටළුව විසඳිය නොහැක. මම ෂෙල් කවුළු දෙකක් ඒ සහ බී දී ෂෙල් වින්ඩෝව මම මම, ක්රියාත්මක, sleep 9999, සිප්පි කටු කවුළුව බී, සහ (අවසන් කිරීමට නින්දේ බලා තොරව) මම දැක ගත හැකි වීමට අවශ්ය sleep 9999ද bash ඉතිහාසයේ.
pts

1
@pts මමත් සජීවී හැසිරීම අරමුණු කරගත් නමුත් විවිධ පර්යන්තවල විවිධ දේ මත වැඩ කිරීම පහසු කරන පර්යන්ත විශේෂිත ඉතිහාසයන් තිබීම වඩාත් පහසු බව එවිට මට වැටහුණි. මම මේ ඉතා ප්රයෝජනවත් බව සොයා: stackoverflow.com/questions/338285/#answer-7449399 බව මත පදනම්ව, මම නම් අන්වර්ථ කළ hrefඑයාර් පෝර්ට් එකක්ය ක්ෂණිකව මගේ වර්තමාන පර්යන්තය ඉතිහාසය සහ ක්රියාවලිය තුළ ඉතිහාසය ගොනු දක්වා වුණෙ නෑ කියලා. මම නව පර්යන්තයක් විවෘත කරන සෑම විටම, එම පිරිසිදු කිරීම / සමමුහුර්ත කිරීම මගේ bashrc ගොනුවේ ක්‍රියාත්මක වන බැවින් නව පර්යන්තයට නවතම ඉතිහාසය ඇත. මම එය සමඟ භාවිතා කරමිhistory -a
trusktr

11
කිරීමට කිසි ම හේතුවක් නැත exportඔබ ඔවුන් නිර්වචනය කර ඇත: විචල්යයන් .bashrcඔවුන් (ද නාස්තිකාර වන පවා ඒකාකාරී අය තුළ,) සෑම ෂෙල් අර්ථ කරනු ඇත එසේ
dolmen

123

මෙන්න බාෂ් සැසි ඉතිහාසය බෙදා ගැනීමේ මගේ උත්සාහය. මෙමඟින් ඉතිහාස කවුන්ටරය මිශ්‍ර නොවන අයුරින් බැෂ් සැසි අතර ඉතිහාසය බෙදා ගැනීමට හැකි වන අතර ඉතිහාසය පුළුල් කිරීම !numberක්‍රියාත්මක වනු ඇත (සමහර අවහිරතා සහිතව).

උබුන්ටු 10.04 එල්ටීඑස් (ලුසිඩ් ලින්ක්ස්) යටතේ 4.1.5 බෑෂ් අනුවාදය භාවිතා කිරීම.

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

_bash_history_sync() {
    builtin history -a         #1
    HISTFILESIZE=$HISTSIZE     #2
    builtin history -c         #3
    builtin history -r         #4
}

history() {                  #5
    _bash_history_sync
    builtin history "$@"
}

PROMPT_COMMAND=_bash_history_sync

පැහැදිලි කිරීම:

  1. යන්තම් ඇතුළත් කළ පේළිය එකතු කරන්න $HISTFILE(පෙරනිමිය .bash_history). මෙය $HISTFILEඑක් පේළියකින් වර්ධනය වීමට හේතු වේ.

  2. විශේෂ විචල්‍යය $HISTFILESIZEයම් අගයකට සැකසීම මඟින් පැරණිතම ඇතුළත් කිරීම් ඉවත් කිරීමෙන් බෑෂ් රේඛාවලට $HISTFILEවඩා දිගු නොවනු $HISTFILESIZEඇත.

  3. ධාවන සැසියේ ඉතිහාසය හිස් කරන්න. මෙය ඉතිහාස කවුන්ටරය ප්‍රමාණයෙන් අඩු කරනු ඇත $HISTSIZE.

  4. අන්තර්ගතය කියවා $HISTFILEඒවා වර්තමාන ධාවන සැසි ඉතිහාසයට ඇතුළත් කරන්න. මෙය ඉතිහාස කවුන්ටරය පේළි ප්‍රමාණයෙන් ඉහළ නංවනු ඇත $HISTFILE. රේඛා ගණන $HISTFILEඅනිවාර්යයෙන්ම නොවන බව සලකන්න $HISTFILESIZE.

  5. history()ප්‍රදර්ශනය කිරීමට පෙර ඉතිහාසය සමමුහුර්ත කර ඇති බව තහවුරු කර ගැනීම සඳහා ශ්‍රිතය බිල්ඩින් ඉතිහාසය අභිබවා යයි. අංකය අනුව ඉතිහාසය පුළුල් කිරීම සඳහා මෙය අවශ්‍ය වේ (මේ ගැන පසුව වැඩි විස්තර).

වැඩි විස්තරයක්:

  • පියවර 1 මඟින් වත්මන් ධාවන සැසියේ විධානය ගෝලීය ඉතිහාස ගොනුවට ලියා ඇති බව සහතික කරයි.

  • 4 වන පියවර මඟින් අනෙක් සැසිවල විධානයන් වත්මන් සැසි ඉතිහාසයට කියවීම සහතික කරයි.

  • 4 වන පියවර ඉතිහාස කවුන්ටරය ඉහළ නංවන හෙයින්, අපි යම් ආකාරයකින් කවුන්ටරය අඩු කළ යුතුය. මෙය 3 වන පියවරේදී සිදු කෙරේ.

  • 3 වන පියවරේදී ඉතිහාස කවුන්ටරය අඩු කරයි $HISTSIZE. 4 වන පියවරේදී ඉතිහාස කවුන්ටරය මතු කර ඇත්තේ පේළි ගණනෙනි $HISTFILE. 2 වන පියවරේදී, රේඛා ගණන $HISTFILEහරියටම බව අපි සහතික කරමු $HISTSIZE(මෙයින් අදහස් කරන්නේ $HISTFILESIZEඑය සමාන විය යුතුය $HISTSIZE).

ඉතිහාසය පුළුල් කිරීමේ අවහිරතා ගැන:

සංඛ්යාවක් විසින් ඉතිහාසය පුළුල් භාවිතා කරන විට, ඔබ කළ යුතු සෑම විටම දක්වා සංඛ්යාව දෙස වහාම එය භාවිතා කිරීමට පෙර. ඒ කියන්නේ අංකය බැලීම සහ එය භාවිතා කිරීම අතර කිසිදු කඩිනම් දර්ශනයක් නොමැත. සාමාන්‍යයෙන් එයින් අදහස් වන්නේ ඇතුල් වීමක් නොමැති අතර ctrl + c නොමැති බවයි.

සාමාන්‍යයෙන්, ඔබට එක් බාෂ් සැසියකට වඩා වැඩි ගණනක් ඇති විට, සංඛ්‍යා අනුව ඉතිහාසය ප්‍රසාරණය වීම, බාෂ් කඩිනම් සංදර්ශක දෙකක් අතර එහි වටිනාකම රඳවා ගනු ඇති බවට කිසිදු සහතිකයක් නොමැත. මන්දයත් PROMPT_COMMANDඑය ක්‍රියාත්මක කරන විට අනෙක් සියලුම බාෂ් සැසි වල ඉතිහාසය වත්මන් සැසියේ ඉතිහාසය සමඟ ඒකාබද්ධ වී ඇති බැවිනි. වෙනත් ඕනෑම බාෂ් සැසියකට නව විධානයක් තිබේ නම් වත්මන් සැසියේ ඉතිහාස අංක වෙනස් වේ.

මෙම බාධකය සාධාරණ යැයි මට පෙනේ. අත්තනෝමතික ඉතිහාස අංක මට මතක නැති නිසා මට සෑම විටම අංකය බැලීමට සිදුවේ.

සාමාන්‍යයෙන් මම මේ ආකාරයට සංඛ්‍යා ප්‍රසාරණය භාවිතා කරමි

$ history | grep something #note number
$ !number

පහත දැක්වෙන Bash විකල්ප භාවිතා කිරීමට මම නිර්දේශ කරමි.

## reedit a history substitution line if it failed
shopt -s histreedit
## edit a recalled history line before executing
shopt -s histverify

අමුතු දෝෂ:

ඉතිහාස විධානය ඕනෑම දෙයකට නල මාර්ගයෙන් ධාවනය කිරීමෙන් එම විධානය ඉතිහාසයේ දෙවරක් ලැයිස්තුගත වනු ඇත. උදාහරණයක් වශයෙන්:

$ history | head
$ history | tail
$ history | grep foo
$ history | true
$ history | false

සියල්ල ඉතිහාසයේ දෙවරක් ලැයිස්තු ගත කෙරේ. ඒ මන්දැයි මට අදහසක් නැත.

වැඩිදියුණු කිරීම් සඳහා අදහස්:

  • _bash_history_sync()සෑම විටම ක්‍රියාත්මක නොවන පරිදි ශ්‍රිතය වෙනස් කරන්න . උදාහරණයක් ලෙස එය විමසුමට පසුව ක්‍රියාත්මක නොකළ යුතුය CTRL+C. CTRL+Cඑම රේඛාව ක්‍රියාත්මක කිරීමට මට අවශ්‍ය නැති බව තීරණය කළ විට මම බොහෝ විට දිගු විධාන රේඛාවක් බැහැර කිරීමට භාවිතා කරමි . සමහර විට CTRL+CBash සම්පුර්ණ කිරීමේ පිටපතක් නැවැත්වීමට මට භාවිතා කිරීමට සිදුවේ.

  • වත්මන් සැසියේ විධාන සෑම විටම වත්මන් සැසියේ ඉතිහාසයේ නවතම ඒවා විය යුතුය. ලබා දී ඇති ඉතිහාස අංකයක් මෙම සැසියේ සිට ඉතිහාස ඇතුළත් කිරීම් සඳහා එහි වටිනාකම තබා ගන්නා අතුරු ආබාධයක් ද මෙය ඇත.


1
"History -c; history -r" වෙනුවට "history -n" (රේඛා නැවත පූරණය කර නැත) ඇයි?
ග්‍රැහැම්

@ ග්‍රැහැම්: history -nඉතිහාස කවුන්ටරය අවුල් කරන නිසා මට එය භාවිතා කිරීමට අවශ්‍ය නොවීය . එසේම, මම history -nවිශ්වාස කළ නොහැකි තරම්ය.
lesmana

1
එක් අවාසියක්: වර්තමාන සැසියේදී බහු රේඛා නූල් සහිත විධාන සාමාන්‍යයෙන් තවමත් ආරක්ෂා වී ඇත. මෙම උපක්‍රමය සමඟ ඒවා ක්ෂණිකව තනි රේඛාවලට බෙදා ඇත. -C -r සඳහා -n භාවිතා කිරීම ප්‍රයෝජනවත් නොවේ, cmdhist හෝ lithist ද නොවේ. මම හිතන්නේ නැහැ මේ මොහොතේ වැඩකටයුතු තියෙනවා කියලා.
ජෝ ලිස්

26
මෙය මඳක් උත්සාහ කිරීමෙන් පසුව, ඇත්ත වශයෙන්ම මට පෙනී ගියේ, ධාවනය කිරීම history -a, නොමැතිව -cසහ -r, වඩා හොඳ භාවිතයට නැණවත් බවය (එය ප්‍රශ්නය ඇසූ දෙය නොවේ). එහි අර්ථය වන්නේ ඔබ ක්‍රියාත්මක කරන විධාන වත්මන් කවචයෙන් පිටවීමට පෙර පවා නව කවච වලින් ක්ෂණිකව ලබා ගත හැකි නමුත් සමගාමීව ක්‍රියාත්මක වන ෂෙල් වෙඩි වල නොවේ. මේ ආකාරයට ඇරෝ-අප් සෑම විටම වත්මන් සැසියේ අවසාන වරට ක්‍රියාත්මක වන විධානයන් තෝරා ගනී , එය මට වඩා අවුල් සහගතය.
ජෝ ලිස්

කැපී පෙනෙන ලෙස හොඳ පිළිතුරක්, මෙය වඩාත් සුලභ "ඉතිහාසය -ඒ; ඉතිහාසය
එන්

45

කිසිම ආකාරයකින් භාවිතා කිරීම ගැන මම නොදනිමි bash. නමුත් එය වඩාත් ජනප්රිය අංගයකි zsh.
පෞද්ගලිකව මම නම් කැමති zshපුරා bashමම එය උත්සාහ නිර්දේශ එසේ.

.zshrcඉතිහාසය සමඟ කටයුතු කරන මගේ කොටස මෙන්න :

SAVEHIST=10000 # Number of entries
HISTSIZE=10000
HISTFILE=~/.zsh/history # File
setopt APPEND_HISTORY # Don't erase history
setopt EXTENDED_HISTORY # Add additional data to history like timestamp
setopt INC_APPEND_HISTORY # Add immediately
setopt HIST_FIND_NO_DUPS # Don't show duplicates in search
setopt HIST_IGNORE_SPACE # Don't preserve spaces. You may want to turn it off
setopt NO_HIST_BEEP # Don't beep
setopt SHARE_HISTORY # Share history between session/terminals


setopt EXTENDED_HISTORYප්‍රමාණවත්
ඇනා මාරියා මාර්ටිනස් ගෝමස්

17

මෙය සිදු කිරීම සඳහා, ඔබට ඔබේ පේළි දෙකක් එකතු කළ යුතුය ~/.bashrc:

shopt -s histappend
PROMPT_COMMAND="history -a;history -c;history -r;$PROMPT_COMMAND"

සිට man bash:

හිස්ටැපෙන්ඩ් ෂෙල් විකල්පය සක්‍රීය කර තිබේ නම් (පහත දැක්වෙන SHELL BUILTIN COMMANDS යටතේ සාප්පු සවාරියේ විස්තරය බලන්න), රේඛා ඉතිහාස ගොනුවට එකතු කරනු ලැබේ, එසේ නොමැතිනම් ඉතිහාස ගොනුව අධික ලෙස ලියා ඇත.


11

මුවර් යෝජනා කළ "ඉතිහාසය -ඒ" සහ "ඉතිහාසය-ආර්" ධාවනය කිරීමට ඔබට ඔබේ බාෂ් විමසුම සංස්කරණය කළ හැකිය:

savePS1=$PS1

(ඔබ යම් දෙයක් අවුල් කළහොත් එය බොහෝ දුරට සහතික වේ)

PS1=$savePS1`history -a;history -r`

(මේවා පසු-කිනිතුල්ලන් බව සලකන්න; ඒවා සෑම විමසුමක් තුළම ඉතිහාසය -a සහ ඉතිහාසය -r ධාවනය කරයි.

ඔබේ PS1 විචල්‍යය ඔබට අවශ්‍ය ආකාරයට සකසා ගත් පසු එය ස්ථිරවම ඔබගේ ~ / .bashrc ගොනුවේ සකසන්න.

පරීක්ෂා කිරීමේදී ඔබට ඔබේ මුල් විමසුමට ආපසු යාමට අවශ්‍ය නම්, කරන්න:

PS1=$savePS1

එය ක්‍රියාත්මක වන බව සහතික කිරීම සඳහා මම මේ පිළිබඳව මූලික පරීක්‍ෂණයක් කර ඇත, නමුත් history -a;history -rසෑම විමසුමක්ම ක්‍රියාත්මක වීමෙන් කිසිදු අතුරු ආබාධයකට කථා කළ නොහැක .


2
kch ගේ විසඳුම මගේ ක්‍රමයට වඩා හොඳින් ක්‍රියා කරයි. මම දැන් ඔහුගේ .bashrc හි ඔහුගේ විසඳුම භාවිතා කරමි.

10

ඔබට පහත ගැටළුව විසඳන bash හෝ zsh ඉතිහාස සමමුහුර්ත විසඳුමක් අවශ්‍ය නම්, එය http://ptspts.blogspot.com/2011/03/how-to-automatic-synchronize-shell.html හි බලන්න.

ගැටළුව පහත දැක්වේ: මට ෂෙල් කවුළු දෙකක් ඒ සහ බී ඇත. ෂෙල් කවුළුව තුළ මම දුවමි sleep 9999, සහ (නින්ද අවසන් වන තෙක් බලා නොසිට) ෂෙල් කවුළුව බී තුළ, මට අවශ්‍ය වන්නේ sleep 9999බාෂ් ඉතිහාසයේ දැකීමටය .

මෙහි ඇති වෙනත් බොහෝ විසඳුම් මෙම ගැටළුව විසඳීමට හේතුව ඔවුන් ඉතිහාස ලිපිගොනු ඉතිහාස ගොනුව වෙත ලිවීම PROMPT_COMMANDහෝ ඒ PS1දෙකම ප්‍රමාද වී ක්‍රියාත්මක කිරීම, sleep 9999විධානය අවසන් වූ පසුව පමණි .


1
මෙය කදිම විසඳුමකි, නමුත් මට ප්‍රශ්න කිහිපයක් ඇත. 1. මට මුල් .bash_history ගොනුව භාවිතා කළ හැකිද, මගේ $ HOME හි තවත් බාෂ් ඉතිහාස ගොනුවක් පැවතීමට මට අවශ්‍ය නැත 2. මේ සඳහා ගිතුබ් රෙපෝ එකක් සැකසීමට ඔබ සලකා බැලිය හැකිය.
වෙයින්හැම්ස්

දෝශ නිරාකරණ කොක්ක bashdb සමඟ ගැටී ඇති බව පෙනේ, මම bash සැසියක් ආරම්භ කරන සෑම අවස්ථාවකම පසු ප්‍රතිදානය. ප්‍රකාශන හිමිකම 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 රොකී බර්න්ස්ටයින් මෙය GNU සාමාන්‍ය මහජන බලපත්‍රයෙන් ආවරණය වන නිදහස් මෘදුකාංගයක් වන අතර ඔබව සාදරයෙන් පිළිගනිමු යම් කොන්දේසි යටතේ එය වෙනස් කිරීම සහ / හෝ එහි පිටපත් බෙදා හැරීම. ** අභ්‍යන්තර නිදොස් කිරීමේ දෝෂය _Dbg_is_file (): ගොනු තර්කය ශුන්‍ය බෑෂ්: _Dbg_filenames [$ සම්පූර්ණ නම]: නරක අරා දායකත්වය `` `
වේන්හැම්ස්

Ech ටෙක්ලයිව් ෂෙන්ග්: 1. මුල් .බැෂ්_ ඉතිහාසය හිතාමතාම සහය නොදක්වයි. සැලසුම අනුව ශක්තිමත් බව එලෙසම තබා ගනී. 2. ගිතුබ් රෙපෝ යනු පොදුවේ හොඳ අදහසකි, නමුත් මෙම ව්‍යාපෘතිය සඳහා එය නඩත්තු කිරීමට මට කාලය නැත, එබැවින් මම එය නොකරමි. - ඔව්, එය bashdb සමඟ ගැටෙන අතර පහසු විසඳුමක් නොමැත (ඔවුන් එකම කොකු භාවිතා කරයි). මම නිවැරදි කිරීමක් සඳහා වැඩ කිරීමට සැලසුම් නොකරමි, නමුත් මම පැච් පිළිගනිමි.
pts

හරි, ස්තූතියි. මම වඩාත් සරල හා වඩා හොඳ සූත්‍රයක් ඉදිරිපත් කර ඇත්තෙමි.
වෙයින්හැම්ස්

EchTechliveZheng: ඔබ ඔබේ සරල හා වඩා හොඳ විසඳුම අප සමඟ බෙදා ගන්නවාද, එවිට අප සැමට එයින් ඉගෙන ගත හැකිද? (එසේ නම්, කරුණාකර ප්‍රශ්නයට පිළිතුරක් එක් කරන්න.)
pts

10

හරි, ඉතින් අවසාන වශයෙන් මෙය හොඳ විසඳුමක් සොයා ගැනීමට මා කෝපයට පත් කළේය:

# Write history after each command
_bash_history_append() {
    builtin history -a
}
PROMPT_COMMAND="_bash_history_append; $PROMPT_COMMAND"

මෙය කරන්නේ මෙම ත්‍රෙඩ් එකේ කියැවුණු දේ ඒකාබද්ධ කිරීමකි, සෑම විධානයකටම පසුව ඔබ ගෝලීය ඉතිහාසය නැවත පූරණය කරන්නේ මන්දැයි මට නොතේරේ. අනෙක් පර්යන්තවල සිදුවන දේ ගැන මම ඉතා කලාතුරකින් සැලකිලිමත් වෙමි, නමුත් මම සෑම විටම විධාන මාලාවක් ක්‍රියාත්මක කරමි, එක් පර්යන්තයකින් කියන්න:

make
ls -lh target/*.foo
scp target/artifact.foo vm:~/

(සරල කළ උදාහරණය)

තවත් ආකාරයකින්:

pv ~/test.data | nc vm:5000 >> output
less output
mv output output.backup1

මට කිසිම ආකාරයකින් විධානය බෙදා ගැනීමට අවශ්‍ය නැත


1
සෑම විධානයකටම පසු ඔබ ඉතිහාසය නැවත පූරණය කිරීමට හේතුව එය ප්‍රශ්නයට අවශ්‍ය හැසිරීමයි (එබැවින් මෙය ඇත්ත වශයෙන්ම මතු වූ ප්‍රශ්නයට පිළිතුරු සපයන්නේ නැත).
මයිකල් හෝමර්

2
Ic මයිකල්හෝමර් සාධාරණ ස්ථානය. පහත් කොට සැලකීමට නිදහස්ව සිටින්න, එබැවින් පිළිතුර පතුලේම පවතිනු ඇත, කෙසේ වෙතත්, මම මෙය OP වෙත යොමු කරන්නේ ඉල්ලූ හැසිරීම කොතරම් නරකදැයි නොදැන, මෙය ඉතා අසීරු ප්‍රශ්නයකි.
යාරෙක් ටී

3
මෙන්න, ඔව්, එය සාධාරණ සම්මුතියකි. මගේ ප්‍රධාන පැමිණිල්ල නම් මට ඉතිහාසය අහිමි වීමයි. එකවර සැසි හරහා ක්ෂණික යාවත්කාලීන කිරීම් අදහස් නොකලත් මෙය නතර කළ යුතුය.
ඔලි

9

history -aවත්මන් සැසියේ ඉතිහාසය හිස්ට්ෆයිල් වෙත එකතු කිරීමට ඔබට භාවිතා කළ හැකිය , ඉන්පසු history -rඅනෙක් පර්යන්තවල හිස්ට්ෆයිල් කියවීමට භාවිතා කරන්න. 


8

මෙන්න මම භාවිතා කරන විකල්පයක්. එය අවුල් සහගත නමුත් එය එක් එක් පර්යන්තයේ වෙනම ඉතිහාස අවස්ථාවක් ලබා ගැනීමට අවශ්‍ය විය හැකි ස්ථානවල @axel_c සඳහන් කර ඇති ගැටළුව විසඳයි (එකක් සෑදීම සඳහා, අධීක්ෂණය සඳහා එකක්, වයිම් සඳහා එකක්).

මම නිරන්තරයෙන් යාවත්කාලීන කරන වෙනම එකතු කළ ඉතිහාස ගොනුවක් තබා ගතිමි. මා සතුව පහත සඳහන් දේ හොට්කි එකකට සිතියම් ගත කර ඇත:

history | grep -v history >> ~/master_history.txt

මෙය වත්මන් පර්යන්තයේ සිට ඔබගේ නිවසේ ඇති master_history.txt නම් ගොනුවකට සියලු ඉතිහාසය එක් කරයි.

මාස්ටර් ඉතිහාස ගොනුව හරහා සෙවීමට වෙනම හොට්කි එකක් ද ඇත:

cat /home/toby/master_history.txt | grep -i

මම පූසා පාවිච්චි කරනවා | grep නිසා එය කර්සරය අවසානයේ මගේ රිජෙක්ස් එකට ඇතුළු වේ. මෙය කිරීමට අඩු අවලස්සන ක්‍රමයක් වනුයේ මෙම කාර්යයන් ඉටු කිරීම සඳහා ස්ක්‍රිප්ට් කිහිපයක් ඔබේ මාවතට එක් කිරීමයි, නමුත් හොට්කීස් මගේ අරමුණු සඳහා වැඩ කරයි. මම වරින් වර මා වැඩ කළ අනෙකුත් ධාරකයන්ගෙන් ඉතිහාසය පහතට ඇද දමා එම ඉතිහාසය මගේ master_history.txt ගොනුවට එකතු කරමි.

ඔබ භාවිතා කළ උපක්‍රමශීලී රීජෙක්ස් හෝ මාස 7 කට පෙර ඔබ ඉදිරිපත් කළ අමුතු පර්ල් වන්-ලයිනර් ඉක්මනින් සොයා ගැනීමට හැකිවීම සැමවිටම සතුටක්.


7

අන්තිම එක සඳහා මට විසඳුමක් ඉදිරිපත් කළ හැකිය: env විචල්‍යය HISTCONTROL "නොසලකා හැරීම" (හෝ "නොසලකා හැරීම") සඳහන් නොකරන බවට වග බලා ගන්න.

නමුත් සමගාමී සැසි කිහිපයකින් ඔබේ වේදනාව මට දැනේ. එය හුදෙක් හොඳින් හසුරුවන්නේ නැත.


7

@ ලෙස්මනගේ පිළිතුරට මගේ වැඩි දියුණු කිරීම මෙන්න . ප්රධාන වෙනස වන්නේ සමගාමී කවුළු ඉතිහාසය බෙදා නොගැනීමයි. මෙයින් අදහස් කරන්නේ වෙනත් කවුළු වල සන්දර්භය ඔබගේ වර්තමාන කවුළුවලට පටවා නොගෙන ඔබේ කවුළුවල දිගටම වැඩ කළ හැකි බවයි.

ඔබ පැහැදිලිවම 'ඉතිහාසය' ටයිප් කරන්නේ නම්, නැතහොත් ඔබ නව කවුළුවක් විවෘත කළහොත් ඔබට පෙර කවුළු වලින් ඉතිහාසය ලැබෙනු ඇත.

මගේ යන්ත්‍රයේ ටයිප් කළ සෑම විධානයක්ම සංරක්ෂණය කිරීමට මම මෙම උපක්‍රමය භාවිතා කරමි.

# Consistent and forever bash history
HISTSIZE=100000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

_bash_history_sync() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
}

_bash_history_sync_and_reload() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
  builtin history -c         #3
  builtin history -r         #4
}

history() {                  #5
  _bash_history_sync_and_reload
  builtin history "$@"
}

export HISTTIMEFORMAT="%y/%m/%d %H:%M:%S   "
PROMPT_COMMAND='history 1 >> ${HOME}/.bash_eternal_history'
PROMPT_COMMAND=_bash_history_sync;$PROMPT_COMMAND

6

එකම සේවාදායකයක බහුවිධ පුද්ගලයින්ට වැඩ කළ හැකි බැවින්, ඉතිහාසය එක් ගොනුවකට ඇතුළත් කිරීමට මම තෝරා ගත්තෙමි - එක් එක් සැසියේ විධාන වෙන් කිරීමෙන් විගණනය පහසු කරයි.

# Convert /dev/nnn/X or /dev/nnnX to "nnnX"
HISTSUFFIX=`tty | sed 's/\///g;s/^dev//g'`
# History file is now .bash_history_pts0
HISTFILE=".bash_history_$HISTSUFFIX"
HISTTIMEFORMAT="%y-%m-%d %H:%M:%S "
HISTCONTROL=ignoredups:ignorespace
shopt -s histappend
HISTSIZE=1000
HISTFILESIZE=5000

ඉතිහාසය දැන් පෙනෙන්නේ:

user@host:~# test 123
user@host:~# test 5451
user@host:~# history
1  15-08-11 10:09:58 test 123
2  15-08-11 10:10:00 test 5451
3  15-08-11 10:10:02 history

ලිපිගොනු වගේ:

user@host:~# ls -la .bash*
-rw------- 1 root root  4275 Aug 11 09:42 .bash_history_pts0
-rw------- 1 root root    75 Aug 11 09:49 .bash_history_pts1
-rw-r--r-- 1 root root  3120 Aug 11 10:09 .bashrc

5

මෙහිදී මම එක් ගැටළුවක් පෙන්වා දෙමි

export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

හා

PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"

ඔබ මූලාශ්‍රය run / .bashrc ධාවනය කරන්නේ නම්, $ PROMPT_COMMAND සමාන වනු ඇත

"history -a; history -c; history -r history -a; history -c; history -r"

හා

"history -a; history -n history -a; history -n"

ඔබ 'source ~ / .bashrc' ධාවනය කරන සෑම අවස්ථාවකම මෙම පුනරාවර්තනය සිදු වේ. 'Echo $ PROMPT_COMMAND' ධාවනය කිරීමෙන් ඔබ 'source ~ / .bashrc' ධාවනය කරන සෑම අවස්ථාවකම ඔබට PROMPT_COMMAND පරීක්ෂා කළ හැකිය.

සමහර විධානයන් බිඳී ඇති බව ඔබට පෙනේ: "history -n history -a". නමුත් ශුභාරංචිය නම් එය තවමත් ක්‍රියාත්මක වීමයි, මන්ද අනෙක් කොටස් තවමත් වලංගු විධාන අනුක්‍රමයක් සාදයි (සමහර විධානයන් නැවත නැවත ක්‍රියාත්මක කිරීම නිසා අමතර පිරිවැයක් දැරීම හා පිරිසිදු නොවේ.)

පුද්ගලිකව මම පහත සරල අනුවාදය භාවිතා කරමි:

shopt -s histappend
PROMPT_COMMAND="history -a; history -c; history -r"

එය බොහෝ ක්‍රියාකාරීත්වයන් ඇති අතර ඉහත සඳහන් කළ කිසිදු ගැටළුවක් නොමැත.

කළ යුතු තවත් කරුණක් නම්: ඇත්ත වශයෙන්ම මැජික් කිසිවක් නැත . PROMPT_COMMAND යනු සරල පරිසර පරිසර විචල්‍යයකි. ඔබ බැෂ් විමසුමක් ලබා ගැනීමට පෙර එහි ඇති විධානයන් ක්‍රියාත්මක වේ ($ ලකුණ). උදාහරණයක් ලෙස, ඔබේ PROMPT_COMMAND "echo 123" වන අතර ඔබ ඔබේ පර්යන්තය තුළ "ls" ධාවනය කරයි. බලපෑම "ls; echo 123" ධාවනය කිරීම හා සමානයි.

$ PROMPT_COMMAND="echo 123"

ප්‍රතිදානය ('PROMPT_COMMAND = "echo 123"; $ PROMPT_COMMAND' ධාවනය කරනවා සේම):

123

පහත සඳහන් දෑ ක්‍රියාත්මක කරන්න:

$ echo 3

ප්‍රතිදානය:

3
123

history / .bash_history වෙත ඉතිහාස විධාන මතකයේ ලිවීමට "history -a" භාවිතා කරයි

මතකයේ ඇති විධාන ඉවත් කිරීමට "history -c" භාවිතා කරයි

history / .bash_history සිට මතකය දක්වා ඉතිහාස විධාන කියවීමට "history -r" භාවිතා කරයි

ඉතිහාස විධාන පැහැදිලි කිරීම මෙතැනින් බලන්න: http://ss64.com/bash/history.html

PS: වෙනත් පරිශීලකයින් පෙන්වා දී ඇති පරිදි අපනයනය අනවශ්‍යයි. බලන්න: .bashrc හි අපනයනය භාවිතා කිරීම


3

එක් සැසියකට ඉතිහාස ගොනුවක් සැකසීම සඳහා මම පිටපතක් ලියා ඇත්තෙමි.

        # write existing history to the old file
        history -a

        # set new historyfile
        export HISTFILE="$1"
        export HISET=$1

        # touch the new file to make sure it exists
        touch $HISTFILE
        # load new history file
        history -r $HISTFILE

සෑම ඉතිහාස විධානයක්ම සුරැකීම අවශ්‍ය නොවන නමුත් එය මා සැලකිලිමත් වන ඒවා සුරකින අතර ඒවා නැවත ලබා ගැනීම පහසු වන අතර පසුව සෑම විධානයක් හරහාම ගමන් කරයි. මගේ අනුවාදය සියලුම ඉතිහාස ලිපිගොනු ලැයිස්තුගත කර ඇති අතර ඒවා සියල්ලම සෙවීමේ හැකියාව ලබා දෙයි.

සම්පූර්ණ මූලාශ්‍රය: https://github.com/simotek/scripts-config/blob/master/hiset.sh


3

තනි සැසිවාරවල ඉතිහාසය මිශ්‍ර නොකරන විසඳුමක් මෙන්න !

මූලික වශයෙන් එක් එක් සැසියේ ඉතිහාසය වෙන වෙනම ගබඩා කර සෑම විමසුමක් තුළම එය ප්‍රතිනිර්මාණය කළ යුතුය. ඔව්, එය වැඩි සම්පත් ප්‍රමාණයක් භාවිතා කරයි, නමුත් එය පෙනෙන තරම් මන්දගාමී නොවේ - ප්‍රමාදය සැලකිය යුතු වන්නේ ඔබ ඉතිහාස සටහන් 100000 කට වඩා තිබේ නම් පමණි.

මූලික තර්කනය මෙන්න:

# on every prompt, save new history to dedicated file and recreate full history
# by reading all files, always keeping history from current session on top.
update_history () {
  history -a ${HISTFILE}.$$
  history -c
  history -r
  for f in `ls ${HISTFILE}.[0-9]* | grep -v "${HISTFILE}.$$\$"`; do
    history -r $f
  done
  history -r "${HISTFILE}.$$"
}
export PROMPT_COMMAND='update_history'

# merge session history into main history file on bash exit
merge_session_history () {
  cat ${HISTFILE}.$$ >> $HISTFILE
  rm ${HISTFILE}.$$
}
trap merge_session_history EXIT

සමහර ආරක්ෂණ සහ කාර්ය සාධන ප්‍රශස්තිකරණය ඇතුළුව සම්පූර්ණ විසඳුමක් සඳහා මෙම සාරාංශය බලන්න .


2

මෙය ZSH සඳහා ක්‍රියා කරයි

##############################################################################
# History Configuration for ZSH
##############################################################################
HISTSIZE=10000               #How many lines of history to keep in memory
HISTFILE=~/.zsh_history     #Where to save history to disk
SAVEHIST=10000               #Number of history entries to save to disk
#HISTDUP=erase               #Erase duplicates in the history file
setopt    appendhistory     #Append history to the history file (no overwriting)
setopt    sharehistory      #Share history across terminals
setopt    incappendhistory  #Immediately append to the history file, not just when a term is killed

අවාසනාවට ප්‍රශ්නය තදින්ම බැෂ් සඳහා ය :-)
ජාලෙක්ස්

1
ගූගල් හි පළමු ප්‍රති result ලය මම zsh සෙවූ විටද ... එය ප්‍රයෝජනවත් වේ යැයි සිතුවා
Mulki

3
ඔබ නව ප්‍රශ්නයක් ඇසිය යුතුය, z "ටර්මිනල් කවුළු වල zsh ඉතිහාසය සුරකින්න", එකක් දැනටමත් නොපවතින බව උපකල්පනය කරන්න. එය හොඳ ප්‍රශ්නයක් නම් ඔබේම ප්‍රශ්නයට පිළිතුරු දීමට ධෛර්යමත් කර ඇත.
ඔලි

2

මට මෙය බොහෝ කලක් අවශ්‍ය විය, විශේෂයෙන් නව ව්‍යාපෘතියක නැවත ක්‍රියාත්මක කිරීම සඳහා විධානයක් ලබා ගැනීමේ හැකියාව (හෝ විධානයකින් නාමාවලියක් සොයා ගැනීම). එබැවින් මම මෙම මෙවලම එකට තැබුවෙමි , එය ගෝලීය සීඑල්අයි ඉතිහාසයක් ගබඩා කිරීම සඳහා පෙර විසඳුම් ඒකාබද්ධ කර පර්කෝල් (සී ^ ආර් වෙත සිතියම් ගත කර ඇත) නමින් අන්තර්ක්‍රියාකාරී අඹරන මෙවලමක් සමඟ ඒකාබද්ධ කරයි. මම එය භාවිතා කිරීමට පටන් ගත් පළමු යන්ත්‍රය මත තවමත් සිනිඳුයි, දැන් අවුරුදු 2 ක් පැරණි CLI ඉතිහාසයක් ඇත.

ඊතල යතුරු සම්බන්ධයෙන් එය දේශීය සීඑල්අයි ඉතිහාසය සමඟ පටලවා නොගනී, නමුත් ගෝලීය ඉතිහාසයට ඉතා පහසුවෙන් ප්‍රවේශ වීමට ඔබට ඉඩ සලසයි (ඔබට සී ^ ආර් හැර වෙනත් දෙයකට සිතියම් ගත කළ හැකිය)


මෙය zsh සඳහාද?
sjas

1
ඔව්, මම මුලින් zsh සඳහා එය සෑදුවා. මාළු හා මාළු සඳහාද එය වැඩ කර ඇත. එය ක්‍රියාත්මක වේද නැද්ද යන්න මට දන්වන්න. ටික වේලාවකින් මම එය වෙනස් කර නැති අතර මගේ ස්ථාපන උපදෙස් වල මා කෙතරම් පැහැදිලිව සිටියාදැයි මට විශ්වාස නැත
ගෝර්ඩන් වෙල්ස්

2

අභිරුචි ගොනුවේ සුරකින අනන්ත ඉතිහාසයට මා කැමති නිසා. මම මෙම වින්‍යාසය නිර්මාණය කරන්නේ https://stackoverflow.com/a/19533853/4632019 :

export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "

export HISTFILE=~/.bash_myhistory
PROMPT_COMMAND="history -a; history -r; $PROMPT_COMMAND"

-1

මෙන්න මගේ .bashrc වෙතින් අවශ්‍ය කොටස සහ අවශ්‍ය ඕනෑම තැනක කෙටි පැහැදිලි කිරීම්:

# The following line ensures that history logs screen commands as well
shopt -s histappend

# This line makes the history file to be rewritten and reread at each bash prompt
PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"
# Have lots of history
HISTSIZE=100000         # remember the last 100000 commands
HISTFILESIZE=100000     # start truncating commands after 100000 lines
HISTCONTROL=ignoreboth  # ignoreboth is shorthand for ignorespace and     ignoredups

HISTFILESIZE සහ HISTSIZE යනු පුද්ගලික මනාපයන් වන අතර ඔබේ රුචි අරුචිකම් අනුව ඒවා වෙනස් කළ හැකිය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.