와일드카드가 어떻게 확장되는지 쉘 기록에 기록할 수 있습니까?

와일드카드가 어떻게 확장되는지 쉘 기록에 기록할 수 있습니까?

내가 실행하면 :

$ 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)를 시도해 보십시오.

관련 정보