Где хранится история сеансов терминала Linux?

Описание

Это не кратчайший путь решения проблемы, но я думаю, что он достаточно прост для понимания.

Рекомендуется создать архив с исходными файлами

tar -cvzf backup.tar.gz file*

чтобы иметь возможность восстановить их после теста (или повторить тест)

tar -xvf backup.tar.gz
  • Я использую несколько временных файлов
  • для создания файла с помощью команд копирования,
  • которые перемешивают имена файлов, "$tmpdir"/tg3.
  • При выполнении этих команд исходные файлы остаются, и
  • Наконец, они перезаписываются.
  • Процесс завершен, временный каталог можно удалить.

Шеллскриптshuffler

#!/bin/bash

tmpdir=$(mktemp -d)
curdir=$(pwd)

ls -1 file* > "$tmpdir"/orig  # list the file names in a file
sed -i -e 's/^/"/' -e 's/$/"/' "$tmpdir"/orig  # quote to allow special chars

cd "$tmpdir"

shuf orig > shuf           # shuffle the names

paste orig shuf > tg1      # build commands...
sed 's/^/cp /' tg1 > tg2   # build commands
sed 's/"$/xtmp"/' tg2 > tg3  # make temporary names
#less tg3
cd "$curdir"

bash "$tmpdir"/tg3         # copy the files to shuffled temporary names
rename -f 's/xtmp$//' file*  # overwrite the original files

rm -r "$tmpdir"

Демонстрационный пример

  • Создать/выбрать каталог

  • Создайте тестовые файлы с содержимым, соответствующим именам файлов

    for ((i=1;i<100;i++));do echo $i>file_$i;done
    
  • Сохраните файлы в tarball

    tar -cvzf backup.tar.gz file*
    
  • Скопируйте шелл-скрипт отсюда в текстовый редактор и сохраните его под именем shufflerв том же каталоге.

  • Сделать шеллскрипт исполняемым

    chmod +x shuffler
    
  • Сделай это

    ./shuffler
    

Теперь вы можете проверить, действительно ли файлы перемешаны, с помощью следующей командной строки (, подходящей только для этого конкретного тестового примера)

$ for ((i=1;i<100;i++));do echo -n "file_$i: ";j=$(cat file_$i);if [ "$i" == "$j" ]; then echo "$j same";else echo "$j";fi;done
file_1: 98
file_2: 45
file_3: 1
file_4: 5
file_5: 93
file_6: 31
file_7: 52
file_8: 84
file_9: 57
file_10: 44
file_11: 2
file_12: 92
file_13: 32
file_14: 12
file_15: 38
file_16: 10
file_17: 64
file_18: 75
file_19: 30
file_20: 68
file_21: 87
file_22: 26
file_23: 36
file_24: 53
file_25: 50
file_26: 51
file_27: 41
file_28: 49
file_29: 21
file_30: 17
file_31: 61
file_32: 73
file_33: 9
file_34: 16
file_35: 55
file_36: 85
file_37: 24
file_38: 83
file_39: 59
file_40: 18
file_41: 20
file_42: 29
file_43: 66
file_44: 82
file_45: 56
file_46: 48
file_47: 71
file_48: 79
file_49: 14
file_50: 86
file_51: 60
file_52: 43
file_53: 22
file_54: 54 same
file_55: 19
file_56: 89
file_57: 28
file_58: 34
file_59: 77
file_60: 88
file_61: 58
file_62: 4
file_63: 96
file_64: 94
file_65: 39
file_66: 69
file_67: 65
file_68: 7
file_69: 90
file_70: 6
file_71: 8
file_72: 47
file_73: 80
file_74: 25
file_75: 97
file_76: 33
file_77: 13
file_78: 15
file_79: 81
file_80: 37
file_81: 42
file_82: 78
file_83: 74
file_84: 3
file_85: 95
file_86: 76
file_87: 40
file_88: 70
file_89: 99
file_90: 27
file_91: 23
file_92: 11
file_93: 91
file_94: 62
file_95: 35
file_96: 63
file_97: 46
file_98: 72
file_99: 67

Прокрутите вниз и обратите внимание, что file_54совпадает. Все остальные файлы имеют новое содержимое. Как и в случае с колодой карт, вы можете перетасовать два или три раза...

Вы также можете сбросить имена файлов из архива и сделать это снова, и каждый раз будут новые результаты, потому что shufполучит новые начальные значения.

3
20.06.2020, 17:19
2 ответа

В частности, для Bash вы должны иметь возможность использовать встроенные функции fcи historyдля доступа к списку истории для текущей оболочки и/или управления файлом истории. Обратите внимание, что это совсем не одно и то же, не в последнюю очередь потому, что вы можете иметь несколько одновременных сеансов и несколько оболочек в сеансе, но у каждого пользователя есть только один файл истории. Конечно, какая конкретная команда fcили historyвам нужна, зависит от того, что именно вы хотите сделать.

2
18.03.2021, 23:26

Добавьте эти строки в свой ~/.bashrc, и каждая отдельная команда из любого сеанса будет записана в ~/.bash_history.

shopt -s histappend
export PROMPT_COMMAND='history -a'

... также избавляет вас от перезаписи сессиями истории друг друга.

4
18.03.2021, 23:26

Теги

Похожие вопросы