"$_"의 확장되지 않은 버전은 무엇입니까?

"$_"의 확장되지 않은 버전은 무엇입니까?

bash/zsh에서는 나중에 사용하기 위해 이전 명령을 나타내는 마지막 인수를 사용 $_하지만 이 인수에는 문서의 "확장 버전"이 포함되어 있습니다. 확장되지 않은 버전을 가질 수 있는 것이 있나요? 다음 예와 같습니다.

printf "%s\n" something{1..3}

. something{1..3}뿐만 아니라 후속 명령에서 확장되지 않은 매개변수에 액세스하고 싶습니다 .something3

그렇게 하면 여전히 모든 사람이 아닌 마지막 인수에만 추가됩니다.

bash -c '
   printf "%s\n" "$@" && printf "%s\n" "$@"-add-something-more;
' _ something{1..3}

다시 말하지만 zsh, 트릭 없이 이를 달성할 수 있는 방법이 있습니까 eval? 저는 이 방법을 사용하는 것을 좋아하지 않지만 정확히 제가 갖고 싶은 것이 무엇인지 보여주고 싶습니까?

bash -c '
    eval printf "%s\\\n" "$@" && eval printf "%s\\\n" "$@"-add-something-more;
' _ 'something{1..3}'
something1
something2
something3
something1-add-something-more
something2-add-something-more
something3-add-something-more

노트:

  • 명령이 스크립트 내에서 실행되고 매개변수가 사용자에 의해 스크립트에 전달되므로 기록에서 읽는 것은 옵션이 아닙니다.
  • 나는 성공한 경우에만 실행하기 위해 구문을 사용합니다 command1 "$@" && command2 "$@"<question-part>.command2command1

답변1

매개변수 목록을 여러 번 재사용하려면 일반적으로 이것이 (익명) 함수나 변수의 용도입니다.

존재하다 zsh:

() {cmd1 "$@" && cmd2 "$@"} something{1..3}
l=(something{1..3}); cmd1 $l && cmd2 $l

각 매개변수에 동일한 문자열을 추가하려면 다음 $^array구문을 사용하십시오.

$ () {echo $@; echo $^@-more} a{1..3}
a1 a2 a3
a1-more a2-more a3-more

( bash// ksh이에 zsh상응하는 것은 )입니다 "${@/%/-more}".

확장되지 않은 버전을 얻으려면 $_다음을 수행하십시오.

TRAPDEBUG() last_cmd=($cur_cmd) cur_cmd=("${(z)ZSH_DEBUG_CMD}") 

그런 다음:

$ echo a{1..3}; echo $last_cmd[-1]
a1 a2 a3
a{1..3}

DEBUG하지만 트랩이 실행된다는 점에 유의하세요.앞으로하위 목록, 아니요관로, 언급 할 필요없는주문하다. 그래서 이것은 작동하지 않습니다 echo a{1..3} && echo $last_cmd[-1]. 다음을 수행해야 합니다.

$ eval 'echo a{1..3}' && eval 'echo $last_cmd[-1]'
a1 a2 a3
a{1..3}

관련 정보