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>
.command2
command1
답변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}