Bash(Git) - 함수, 별칭 및 SH 스크립트 파일

Bash(Git) - 함수, 별칭 및 SH 스크립트 파일

나는 별칭을 사용하는 데 매우 익숙해졌습니다. 특히 모든 다른 git 명령과 명령의 순서 및 상호 종속성 등에 대해 매우 편안해졌습니다. 따라서 더 복잡한 스크립트를 실행하는 몇 가지 별칭을 만들었습니다.

alias stash='f() { .... }; f'

전반적으로 매우 간단합니다. 그러나 나는 가장 순수한 개발 스타일이기 때문에 "잘 구성된" 코드를 좋아합니다. 형태는 때로는 기능만큼 중요합니다. 따라서 간단한 별칭을 사용하십시오.

alias gca='git commit --amend '

.bash_aliases문제 없이 파일 에 직접 나열할 수 있습니다 . 그러나 일부 다중 명령 별칭의 경우 별도로 분리되기를 원합니다.

타자를 치는 help것 같군요

function name { COMMANDS ; } or name () { COMMANDS ; }

그러나 현재 내가 사용하는 것으로 이해되는 유일한 방법은 function별칭 형식입니다. 그러나 내가 댓글을 달고 있는 게시물의 색상을 고려하여 git diff --name-status스크립트를 SH 파일에 통합할 수 있으며 이 예에서는 xargs를 통해 데이터를 SH 파일에 전달합니다.

그러나 스크립트를 통해 "함수"를 생성하여 "별칭"으로 나열되지 않고 sh 파일에 저장된 실제 함수로 나열되는 것이 가능할까요?

상상의:

alias stash='f() { if [[ -z $1 ]]; then git stash list; else git stash $1; fi; }; f'

대신 stash.sh파일에는 다음이 포함됩니다.

function stash
{
  if [[ -z $1 ]]; then
     stash list;
  else git stash $1;
  fi;
}

비슷한 것이 가능합니까? 두 경우 모두 프롬프트에 간단히 "stash"를 입력하지만 완전히 다른 방식으로 정의됩니까?

답변1

사용자 환경에 필요한 기능 목록을 얻을 수 있습니다.

파일을 생성 ~/.bash_functions하고 에서 가져옵니다 ~./bashrc. 소스와
같은 방식 :./bash_aliases

if [ -f ~/.bash_functions ]; then
    . ~/.bash_functions
fi

그런 다음 원하는 만큼 많은 (복잡한) 함수를 정의하세요.
함수에 대한 별칭을 정의할 수 있습니다(순서를 유지하기 위해 ~/.bash_aliases에서). 하지만 소스 함수를 직접 호출할 수 있으므로 실제로는 필요하지 않습니다. 정의에 따르면:

stash() {
    if [[ -z $1 ]]; then
        stash list;
    else
        git stash $1;
    fi;
}

또는 를 통해 간단히 stash호출 할 수 있으며 stash this별칭은 필요하지 않습니다.

답변2

함수 정의를 별칭에 채우는 이유가 무엇인지 혼란스럽습니다. 별칭 stash은 함수 호출을 정의한 f다음 이를 즉시 호출하여 별칭에 전달된 인수를 받습니다. 일상적으로 사용하는 경우 이는 다음과 같은 함수를 정의하는 것과 동일합니다 stash.

function stash {
  if (($# == 0)); then
     git stash list;
  else
     git stash "$@";
  fi;
}

별칭의 내용과 비교하면 다음과 같습니다.

  • function stash { … }또는 를 사용하여 stash () { … }함수를 정의할 수 있습니다. 그것들은 동일합니다. 이미 명명된 별칭을 정의한 경우 stash함수를 정의하려고 하면 확장되므로 정의가 원하는 대로 작동하지 않는다는 것입니다. 함수를 정의할 때 함수 이름이 이미 별칭으로 정의되어 있지 않은지 확인하거나 구문을 사용하세요 function.
  • 저는 (($#==0))첫 번째 매개변수가 비어 있는지 테스트하는 대신 함수에 매개변수가 있는지 테스트하기 위해 이것을 사용하고 있습니다. 의도는 더 명확하다. (이것은 null 매개변수를 허용하지만 여기서는 의미가 없습니다.)
  • 변수 확장에는 항상 큰따옴표를 사용하세요..
  • git 을 호출할 때 "$@"대신 사용합니다. 함수의 모든 매개변수를 전달합니다."$1""$@"

별칭 정의와 동일한 위치( 예 : .bashrc, in .bash_aliases또는 에서 제공하는 다른 파일) 에 함수 정의를 배치할 수 있습니다..bashrc

. ~/lib/git-functions.bash

답변3

{   cat >myfunction.fn
    .  ./myfunction.fn
    fn  1 2 3 4 5
} <<""
    fn(){
        printf %s\\n "$@"
    }

1
2
3
4
5

.명령은원천현재 쉘 실행 환경의 명명된 파일입니다. 거기에 정의된 모든 함수, 변수, 별칭 또는 기타 유형의 셸 상태는 return발생 시 지속됩니다.

너 하나 만들 수 있어자동 로드예를 들어 스텁 함수를 정의하여 함수 정의 순서를 지정합니다.

fn(){ . ./fn.file && fn "$@"; }

...소스 파일에는 다음의 재정의가 포함되어 있습니다 fn().

fn(){
   : a whole new fn
}
: any other init state commands you might like to run

관련 정보