![와일드카드가 어떻게 확장되는지 쉘 기록에 기록할 수 있습니까?](https://linux55.com/image/1448/%EC%99%80%EC%9D%BC%EB%93%9C%EC%B9%B4%EB%93%9C%EA%B0%80%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%99%95%EC%9E%A5%EB%90%98%EB%8A%94%EC%A7%80%20%EC%89%98%20%EA%B8%B0%EB%A1%9D%EC%97%90%20%EA%B8%B0%EB%A1%9D%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
내가 실행하면 :
$ ls *
foo bar buzz
$ history | tail -1
ls *
내 쉘 기록 ls *
에서 ls foo bar buzz
. "foo 파일에 도대체 무슨 일이 일어난 걸까요?"라고 궁금할 때, rm *
기록을 검색하고 "foo"를 찾아 내가 잘못된 디렉토리에서 무엇을 하고 있었는지 알아낼 수 있다면 좋을 것입니다.
zsh 및 bash 솔루션에 관심이 있습니다.
답변1
나는 어떤 쉘도 명령을 히스토리에 저장할 때 공백 수정 이외의 작업을 수행하지 않을 것이라고 생각합니다. 확장 프로그램의 내용은 *
문서화되어 있지 않으며 기록할 수 있는 옵션도 없는 것 같습니다.
어떤 경우에도 완전한 보편성을 문서화하는 것은 불가능하다는 점에 유의하십시오. 예를 들어 a='foo* bar*'; rm $a
( zsh에서) 을 실행하면 rm $=~a
쉘이 구문상 와일드카드 일치를 감지할 가능성이 거의 없습니다. 그리고 모든 전역 확장을 문서화하는 옵션은 없습니다.
당신은 뭔가를 하나로 모을 수 있습니다preexec
(또는배쉬에 상응하는). 처음으로 테스트되지 않은 경우(zsh의 경우):
history_wildcards=()
precmd () {
emulate -LR zsh
local n tmp
history -1 | read n tmp
history_wildcards[$(($n+1))]=$=~1
}
그러면 history_wildcards
명령줄의 각 단어에 대한 전역 확장이 포함된 문자열로 배열이 채워집니다. 토큰화는 간단한 방식으로 수행되므로 이와 유사한 방식이 echo ' /**/* '
확장됩니다 /**/*
(즉, 디스크를 탐색합니다). 그것으로부터 유용한 것이나 믿을 cd subdir && echo *
수 없을 정도로 사소하지 않은 것을 얻을 것이라고 기대하지 마십시오.
미리 계획한다면 명령을 제출하기 전에 zsh 확장 와일드카드를 사용할 수 있습니다. 기본 구성에서는 Tab커서가 구 위에 있는 동안 누르기만 하면 됩니다. 다르게 구성한 경우 ^X *
( expand-word
)를 시도해 보십시오.