Zsh는 변수 값에 따옴표를 추가할 수 있습니다(그러나 이는 bash에서도 작동합니다).

Zsh는 변수 값에 따옴표를 추가할 수 있습니다(그러나 이는 bash에서도 작동합니다).

저는 zsh를 처음 접했습니다(어제 bash에서 마이그레이션했습니다).

bash에는 bash 기능이 있습니다.

vl() { cmd=`echo $1 | sed -r 's/(.+):([0-9]+).+/\1 +\2/g'`; vim $cmd }

이는 기본적으로 다음과 같은 매개변수를 변환합니다.

vl ./manifests/production/test.pp:387:foobar  # A output of $grep -iHn test 

도착하다

vim ./manifests/production/test.pp +387   #Aim is to open file at line-number 387

zsh의 동일한 기능이 예상대로 작동하지 않습니다. 추가된 이름의 파일 을 ./manifests/production/test.pp +387여는 대신 vim에서 이름이 지정된 파일을 엽니다 . 에 따옴표를 추가하는 것 같습니다 ../manifests/production/test.pp+387$cmd

누군가 여기서 무슨 일이 일어나고 있는지 설명할 수 있다면 좋을 것입니다. 감사해요

답변1

Bourne 쉘, dash, ksh 및 bash와 같은 일반적인 Bourne 스타일 쉘에서 구문은 $variable"변수의 값을 가져와서 IFS해당 문자가 나타나는 별도의 단어로 분할하고 각 단어를 파일 이름 와일드카드로 처리함을 의미합니다. 패턴을 사용하고, 여러 파일 중 하나와 일치하면 확장하세요." 배열인 경우 variable배열의 첫 번째 요소에서 발생하며 다른 요소는 무시됩니다.

zsh에서 구문은 $variable"변수 값을 가져오고 비어 있으면 삭제"를 의미합니다. variable배열인 경우 이는 배열의 모든 요소에 대해 발생합니다 . Zsh 애호가들은 zsh 방식이 더 우수하다고 생각합니다.

$=variablezsh에서는 단어 분리를 수행하도록 작성할 수 있습니다 . 그러나 이는 현재 수행 중인 작업을 수행하는 가장 좋은 방법은 아닙니다. bash 함수는 파일 이름의 공백을 처리하지 않으며 $=variablezsh에서도 공백을 사용하지 않습니다. 이는 인수를 구문 분석하는 다른 방법으로, bash와 zsh 모두에서 작동하며 :파일 이름을 제외한 모든 문자를 처리할 수 있습니다. 인수에 두 개의 콜론이 포함된 경우 첫 번째 콜론 뒤의 모든 내용은 제거되고 첫 번째 콜론과 두 번째 콜론 사이의 부분은 기호 앞에 별도의 인수로 추가됩니다 +. 코드보다 약간 길지만 이해하기가 덜 어렵지 않으며 파일 이름의 첫 번째 공백 힌트로 인해 막히지 않습니다.

vl () {
  local suffix
  case $1 in
    *:*:*) suffix=${1#*:};; set -- "${1%%:*}" "+${suffix%%:*}";;
  esac
  vim "$@"
}

답변2

이것은 까다로운 문제입니다 :) 한 가지 해결 방법은 다음과 같이 함수를 정의하는 것입니다.

vl() { cmd=$(echo $1 | sed -r 's/(.+):([0-9]+).+/\1 +\2/g'); eval "vim $cmd"; }

eval해결 방법은 필요한 스택 교환 편집기가 누락되었기 때문에 수행해야 했던 다른 작은 수정 대신 사용하는 것이었습니다. -fu 8-)

관련 정보