Annotation 명령의 마지막 매개변수에 접근하는 방법

Annotation 명령의 마지막 매개변수에 접근하는 방법

터미널에서 작업할 때 현재 프롬프트에서 마지막 줄의 마지막 인수를 삽입하는 것이 .( 다른 많은 경우와 마찬가지로) 유용하다는 것을 알았습니다 . alt.그러나 마지막 줄을 주석 처리하면 작동하지 않습니다(가정 set -o interactivecomments).

정확한 사용 사례는 생각나지 않지만 이런 일이 여러 번 발생했습니다. 실행하기 전에 깨달은 명령이 당시에 필요했던 것이 아니라는 사실을 깨닫고 해당 명령의 최종 매개변수를 후속 명령에 입력하고 싶었습니다. .

나는 주석 처리된 모든 것을 무시하는 논리가 있다는 것을 알고 있습니다. 왜냐하면 그것은 결코 해석되지 않고 따라서 그 중 어느 것도 매개변수로 표시되지 않기 때문입니다.하지만내가 원하는 것을 할 수 있는 방법이 있나요?

내가 원하는 것을 수행하는 대체 명령에 바인딩된 다른 키 입력을 사용해야 한다면 이상적이지는 않지만 사용할 수는 있습니다.

저는 Zsh를 사용하고 있지만 Bash 솔루션이 작동할 수도 있고 Zsh에서 수행해야 하는 작업에 가까울 수도 있습니다.

답변1

이 명령을 주석 처리하지 마십시오.

:대신에 를 앞에 넣으면 #명령 텍스트 인수가 됩니다.null 유틸리티 :, 실행 시 아무 작업도 수행하지 않음. 인수는 여전히 명령이므로 태그가 지정되고 구문 분석되지만 다른 처리는 수행되지 않습니다.


어떤 경우에는 이것이 부적절합니다. 특히 명령을 평가할 때 그렇습니다.그 자체부작용이 있습니다. 간단한 예는 다음과 같습니다명령 대체:

$ : log $(find -print -delete) --target /var/run/cache

이 경우 원래 명령 자체는 실행되지 않더라도 내부 명령이 $(...)실행되고 인수로 대체됩니다 . :피해가 덜한 경우는${foo:=default}매개변수 확장, 값을 할당하는 부작용이 있습니다 $foo.

마지막으로 리디렉션이나 파이핑이 계속 발생합니다.

$ : foo > outfile
$ : bar | grep x | ...

두 경우 모두 빈 출력이 대상으로 전송되어 파일을 자르거나 생성하거나 후속 명령을 실행하므로 빈 입력이 마음에 들지 않을 수 있습니다.


명령에 대해 특별한 우려 사항이 없다면 이는 완전히 안전하며 다음에서 수행할 수 있습니다.다루기 힘든,불다및 모든 POSIX 호환 셸(단, 후속 alt-. 동작은 모든 곳에서 작동하지 않음)

원하는 마지막 단어인 경우 zsh는 명령줄을 조작하는 데 사용할 수 있는 사용자 정의 가능한 키 바인딩과 명령을 제공합니다. bindkey '^K' kill-region해당 단어 이전으로 돌아갈 수 있는 경우 줄의 시작 부분까지 Ctrl-erase를 사용하면 safe 명령을 사용하여 관심 있는 한 단어만 남길 수 있습니다.K:

답변2

주석을 통해서도 이 작업을 수행할 수 있습니다. :다른 단축키를 사용하려는 경우 다음으로 전환할 필요가 없습니다.

  1. 마지막 위치 인수를 출력하는 함수를 정의합니다.

    lastarg () { test $# -eq 0 && return 1; while [ $# -gt 1 ]; do shift; done; printf '%s' $1; }
    
  2. 다음을 호출하는 키 바인딩을 만듭니다.

    lastarg $(history 2 | head -1)
    

    그리고 출력을 삽입합니다.

마지막 인수를 인용하면 단어 분리로 인해 잘못된 결과가 발생할 수 있습니다.

위험한 인용문 버전

나쁜 일이 일어나지 않을 것이라고 확신하는 경우(인용되지 않은 <, >, &, $(), \``,; ,# , and no0 single" or'`를 사용하면 주석 처리된 줄에서 인용된 마지막 "인수"를 얻을 수 있습니다.

# dummy foo\ \ \ bar
eval : $(history 2 | awk 'NR==1 { sub(" *[0-9]* *#",""); print; }') \; echo '"$_"'
    + eval : dummy 'foo\' '\' '\' bar ';' echo '"$_"'
    ++ : dummy 'foo   bar'
    ++ echo 'foo   bar'
    foo   bar

답변3

!$마지막 인수에 해당하는 쉘 내장을 사용하십시오.

나는 또한 쉘에서 comment 명령의 마지막 인수에 액세스할 수 있게 해주는 zsh를 사용하고 있습니다.

답변4

다음을 추가할 수 있습니다 ~/.zshrc.

zshaddhistory() {
  local histchars=
  print -Sr -- ${1%$'\n'}
  fc -p
}

즉, zshaddhistory현재 명령줄을 기록에 추가하기 전에 호출되는 특수 후크 함수에서 우리는 histchars주석 처리를 비활성화하는 빈 함수를 직접 추가합니다 print -S. fc -p명령줄이 기록에 다시 추가되지 않았는지 확인하세요.

관련 정보