zsh fc 명령에서 와일드카드 사용

zsh fc 명령에서 와일드카드 사용

zshrc에 별칭이 설정되어 있으며 sudo를 사용하여 명령을 다시 실행할 수 있습니다.

alias please='sudo $(fc -nl -1)'

"와 같이 이전 명령에서 와일드카드를 사용한 경우를 제외하고는 훌륭하게 작동합니다.rm*.o", 명령은 "rm: '*.o'를 삭제할 수 없습니다: 해당 파일이나 디렉터리가 없습니다".

이 별칭이 와일드카드를 올바르게 사용하도록 하는 좋은 방법이 있습니까?

답변1

아니요, "올바른 와일드카드를 사용하도록 이 별칭을 얻는" 좋은 방법은 없습니다. 왜냐하면 "올바른"은 상황에 따라 다른 것을 의미하기 때문입니다. 예를 들어 명령줄에 명령 대체가 포함된 경우 루트로 추가 명령을 실행할 계획입니까? 당신이 추구하는 자동화는 잘못된 일을 신속하게 수행하는 데 매우 편리합니다. 차를 보는 ​​것이 너무 짜증나기 때문에 길을 건널 때 눈을 감는 것과 같습니다.

내 조언은 명령을 입력 Up Home s u d o Space하고 잠시 시간을 내어 다시 읽어서 원하는 작업이 수행되고 있는지 확인하라는 것입니다.

즉, 모험심이 강하다면 컴퓨터가 그 일을 하게 할 수도 있습니다.무엇. 이는 서로 다른 작업을 수행하는 두 가지 솔루션입니다.

다음 함수에서는 이전 명령이 외부 명령에 대한 호출이라고 가정합니다. 동일한 매개변수를 사용하지만 sudo접두사가 있는 외부 명령을 호출합니다 . 즉, 와일드카드 확장, 변수 대체, 명령 대체 등이 모두 셸 컨텍스트에서 호출됩니다.

please () {
  setopt local_options err_exit
  local args
  eval "args=($history[$((HISTCMD-1))])"
  print -lr Running sudo "$args[@]"
  sleep 2
  sudo "$args[@]"
}

다음 명령은 이전 명령이 셸 환경을 수정하지 않았으며 환경 변수에 의존하지 않는다고 가정합니다. 와일드카드 확장, 명령 대체 등을 포함하여 전체 명령줄을 루트로 실행합니다.

please () {
  sudo zsh -c "$history[$HISTCMD]"
}

답변2

유일한 해결책은 다음과 같습니다.

alias please='eval sudo $(fc -nl -1)'

답변3

출력을 비활성화하는 Zsh 와일드카드명령 대체설정 되지 않은 경우 GLOB_SUBST:

이 옵션을 설정하면 GLOB_SUBST따옴표가 없는 명령 대체(방금 언급한 특수 형식 포함)의 결과로 파일 이름이 생성될 수 있습니다.

이를 활성화하면 별칭이 작동합니다. 당신은 또한 사용할 수 있습니다history정렬:

history
이 연관 배열은 과거 사건 번호를 완전한 역사 라인에 매핑합니다. 연관 배열로 제시되지만, ${history[@]}모든 값의 배열( )은 가장 최근의 역사적 사건부터 순서대로(즉, 역사적 사건의 수를 줄여서) 반환되는 것을 보장합니다.

그런 다음 사용패턴 교체 플래그선택적으로 활성화 GLOB_SUBST:

${=spec}
사양 평가 중 단어 분할에 대한 규칙을 사용하십시오 SH_WORD_SPLIT. 그러나 인수가 두 =배로 표시되는 경우에는 인수가 큰따옴표로 표시되는지 여부에 관계없이 끄십시오. 이렇게 하면 IFS를 구분 기호로 사용하여 교체 전에 매개변수 확장이 별도의 단어로 분할됩니다. [...]

${~spec}
GLOB_SUBST사양 평가 옵션을 켜십시오 . ~ 두 배로 늘어나면 끄십시오.

예:

% alias s='sudo ${~=${history[@]}[1]}'
% echo *                                   
a b c
% s
[sudo] password for muru: 
a b c
% echo [a]
a
% s       
a

관련 정보