Могу ли я иметь историю истории оболочки, как расширяются шаблоны?

Если я запустил:

$ ls * foo bar buzz $ history | tail -1 ls * 

Вы можете видеть, что в моей истории оболочки он помнит, что я запустил ls * а не ls foo bar buzz . В идеале я бы хотел записать как в отдельных историях. Когда я задаюсь вопросом: «Что случилось с файлом foo?», Было бы неплохо иметь возможность вернуться и выяснить, что я сделал rm * в неправильном каталоге, просмотрев мою историю и обнаружив «foo ».

Меня интересуют решения как для zsh, так и для bash.

Я не думаю, что какая-либо оболочка ничего не делает за пределами пробелов при хранении команд в истории. То, что * расширено, не записано, и, похоже, нет возможности записать его.

Обратите внимание, что в любом случае невозможно было бы записать полную общность. Например, если вы запустите a='foo* bar*'; rm $a a='foo* bar*'; rm $a ( rm $=~a в zsh), оболочка вряд ли будет синтаксически распознавать подстановочный знак. И нет возможности регистрировать все расширения glob.

Вы могли бы preexec что-то вместе с preexec (или эквивалентом bash ). Непроверенный первый go (для zsh):

 history_wildcards=() precmd () { emulate -LR zsh local n tmp history -1 | read n tmp history_wildcards[$(($n+1))]=$=~1 } 

Это заполняет массив history_wildcards строкой с расширением glob каждого слова в командной строке. Разделение слов выполняется наивным образом, поэтому что-то вроде echo ' /**/* ' будет расширяться /**/* (т. Е. Пересекать ваш диск). Не ожидайте ничего полезного из cd subdir && echo * или чего-то такого, что неразумно для ума.

Если вы планируете заранее, вы можете сделать zsh расширять подстановочные знаки перед отправкой команды. В конфигурации по умолчанию просто нажмите « Tab», когда ваш курсор находится в глобусе. Если вы настроили завершение по-другому, попробуйте ^X * ( expand-word ).