Параметр INC_APPEND_HISTORY
, если установлен, вызывает более немедленную запись записей истории. Также обратите внимание на SHARE_HISTORY
, который, если установлен, может привести к тому, что новые оболочки подхватят что-то, что похоже на то, что вы хотите удалить из истории. Перезапись истории в реальном времени зависит от этих параметров, как если бы вы не заботились о других командах в этом конкретном экземпляре оболочки, а INC_APPEND_HISTORY
не установлен, просто удалите историю этой оболочки с помощью fc -R
:
% echo super secret password
super secret password
% echo whoopsie
whoopsie
% history -2
18030 echo super secret password
18031 echo whoopsie
% fc -R $HISTFILE
% history -3
36060 vim ~/.zshrc
36061 man readpassphrase
36062 mutt
%
Затем подтвердите с помощью $ EDITOR $ HISTFILE
, что этого суперсекретного пароля нет в файле истории (также! Обратите внимание, что может быть zshaddhistory
] (или массив функций), и в этом случае вам нужно будет проверить, что эта функция (или эти функции) делает (делает)). При использовании INC_APPEND_HISTORY
запись, вероятно, находится в $ HISTFILE
, поэтому отредактируйте файл истории, чтобы удалить неверную запись, а затем fc -R $ HISTFILE
, чтобы удалить ее из как файл истории, так и оболочка. С INC_APPEND_HISTORY
и SHARE_HISTORY
, и если вы подозреваете, что новые оболочки получили эту неверную запись в истории, вам необходимо выполнить fc -R
во всех этих оболочках. или закройте их все, убедитесь, что ни одна из них не записала неверную строку обратно в файл истории и т. д.
Он перебирает все имена файлов и проверяет каждый файл, есть ли у него пара или нет, и выводит соответствующее сообщение.
for i in *; do
base=${i%.*}
if [ -e "${base}.out" -a -e "${base}.ctl" ]; then
printf 'file "%s" has a pair\n' "$i"
else
printf 'file "%s" has not a pair\n' "$i"
fi
done
Он перебирает только файлы .ctl
и проверяет, есть ли в текущем файле .ctl
пара -и файл .out
. Таким образом, он печатает только парные файлы, пропуская остальные -непарные файлы.
for i in *.ctl; do
base=${i%.*}
if [ -e "${base}.out" ]; then
printf 'file "%s" has a pair "%s"\n' "$i" "${base}.out"
fi
done
comm <(basename -a -s.ctl *.ctl | sort) <(basename -a -s.out *.out | sort)
См. comm(1)
, особенно флаги -12
будут отображать только файлы с обоими суффиксами.
Вы пытаетесь обнаружить отсутствующие файлы.ctl и .out, поэтому вам нужно проверить оба способа. Простой способ сделать это (, если ваши имена файлов не содержат специальных символов, включая пробелы, и содержат только одну точку ), это
find. -type f
, cut --delimiter=. --fields=1
, sort --unique
для удаления дубликатов, while read name
и, наконец, [[ -e "${name}.ctl" ]] || echo "${name}.ctl" >&2
и то же самое для.out. Вы можете просмотреть файлы и получить ожидаемые имена файлов для файлов вывода и управления. Как только вы это сделаете, вы можете проверить, существуют ли оба:
for item in *.out *.ctl
do
base="${item%???}"
out="$base.out" ctl="$base.ctl"
[ -f "$out" -a ! -f "$ctl" ] && echo "$out is missing $ctl" >&2
[ -f "$ctl" -a ! -f "$out" ] && echo "$ctl is missing $out" >&2
done