기본값을 사용한 매개변수 대체: ${1-str} 대 ${1-`echo str`}

기본값을 사용한 매개변수 대체: ${1-str} 대 ${1-`echo str`}

${1-default_string_value}그리고 의 차이점은 무엇인가요?${1-`echo default_string_value`}

첫 번째 양식 대신 두 번째 양식을 사용하는 이유는 무엇입니까?

편집하다:

예를 들어 상대적으로 널리 퍼진 git 별칭과 같이 여러 곳에서 사용되는 두 번째 형식을 보았습니다.abbrev = !sh -c 'git rev-parse --short ${1-`echo HEAD`}' -

내 직감으로는 이 두 번째 형식이 명령을 기본값으로 사용해야 하는 기존(예: Google 검색) 스니펫을 수정하여 사용된다는 것입니다. 그러나 뭔가 간과할 수 있으므로 이 질문입니다.

답변1

기능적인 측면에서는 별 차이가 없습니다. 효율성이 떨어질 뿐입니다. 해당 코드에 대한 기타 참고 사항:

  • 그것은 떠나고 `...`인용 ${1...}되지 않았습니다. 이는 여기서는 의미가 없는 분할+글로브의 적용을 받는다는 것을 의미합니다.
  • -$0해당 인라인 스크립트에 대한 값을 잘못 선택했습니다 . 예를 들어 오류 메시지를 상당히 혼란스럽게 만들 수 있습니다.
  • `...`더 이상 사용되지 않는 명령 대체 형식입니다. $(...)요즘에는 선호되지만 이 특정한 경우에는 아무런 차이가 없습니다.

또한 명령에 셸 메타 문자(|&;<>()$`\"' \t\n*?[#~=%"(sh 언어에서 명령 인수를 구분하는 SPC 포함) 그런 다음 git쉘을 실행하여 값을 해석합니다.별명첨부 "$@"되어 있습니다. 그래서 여기서 우리는 결국 sh -c 'sh -c...'.

더 최적화하려면 다음과 같이 변경할 수 있습니다.

git config --global alias.abbrev '!
  abbrev() {
    exec git rev-parse --short "${1-HEAD}"
  }
  abbrev'

몇 가지 포크와 임원이 절약됩니다.

답변2

두 번째 형식을 사용하면 작업 속도가 느려집니다.

내 컴퓨터에서 perf실행하려면 약 300만 클럭 사이클이 필요합니다 . bash -c 'echo hello'명령 대체를 수행하는 데 이보다 적은 시간이 걸리기를 바라지만 여전히 고정 문자열을 갖는 것보다 훨씬 더 많은 시간이 소요됩니다.

echo더 많은 기능을 수행하는 것으로 대체된 경우 id -u명령의 값을 재정의할 수 있는 방법을 제공할 수 있습니다. 이로 인해 두 번째 형식을 사용하는 두 번째 이유는 일관성 때문일 수 있습니다. 다른 모든 할당은 명령을 재정의하기 위한 것이므로 여기서는 echo를 명령으로 사용합니다.

관련 정보