명령의 하위 문자열을 확장하는 방법은 무엇입니까?

명령의 하위 문자열을 확장하는 방법은 무엇입니까?

명령의 하위 문자열을 입력하면 명령이 어떻게 표시되는지 알고 싶습니다. 나는 결과가 아니라 역사의 확장에 관심이 있습니다.

이것의 목적은 zsh의 확장이 어떻게 작동하는지 대화식으로 보여주는 것입니다.

예를 들어, zsh 기록 수정자의 사용을 설명하고 싶다고 가정해 보겠습니다.

mv /Volumes/hdd1/path/to/a/file.foo !#$:r:s/foo/bar/ # moves and renames at the same time
....................................0123456789abcdef

(위 줄은 이 질문에서 부분 문자열을 인용하는 규칙입니다)

일부 하위 문자열은 유효하고 일부는 유효하지 않습니다.

마치 [0..f]의 모든 문자 뒤에 입력한 것처럼 [0..f]로 끝나는 모든 하위 문자열에 대해 기록 확장을 수행하고 싶습니다 TAB.

답변1

나는 기록 확장을 실행하고 zsh에서 결과를 다시 얻을 수 있다고 생각하지 않습니다.

이는 개념 증명을 사용한 것입니다.zpty기준 치수잘못된 zsh 프로세스와 상호 작용하려면 기록 문자열을 확장하고 결과를 연구하십시오(오류 보고 또는 명령 실행 등). 각 확장 시도 전에 필요한 초기 기록을 prior_history.

#!/usr/bin/zsh
setopt extended_glob
zmodload zsh/zpty
zpty -b inferior_zsh 'PS1=%% PS2=\> TERM=dumb strace -eread,write -o zsh.strace zsh -f'
zpty -r inferior_zsh out $'*\r%'
zpty -w inferior_zsh 'stty -echo'
zpty -r inferior_zsh out $'*\r%'
start='mv /Volumes/hdd1/path/to/a/file.foo'
history_string='!#$:r:s/foo/bar/'
for ((i=1; i <= $#history_string; i++)) {
  zpty -w inferior_zsh "fc -R prior_history"
  zpty -r inferior_zsh out $'*\r%'
  zpty -w inferior_zsh "print -r expansion: ${(q)start} ${history_string[1,$i]}"
  zpty -r inferior_zsh out $'*\r[%>]'
  out=${${out#*$'\r\r\n'}%$'\r\n'% ##$'\r\r%'}
  print -r "$i ${(qqqq)out}"
}

관련 정보