함수의 모든 인수를 다른 명령에 전달하는 방법은 무엇입니까?

함수의 모든 인수를 다른 명령에 전달하는 방법은 무엇입니까?

안녕하세요, 나 이거 갖고 있어요~/.bash_profile

export GOPATH="$HOME/go_projects"
export GOBIN="$GOPATH/bin"

program(){
        $GOBIN/program $1
}

그래서 나는 그것을 할 수 있다 program "-p hello_world -tSu". 따옴표를 사용하지 않고 사용자 정의 플래그를 사용하여 프로그램을 실행할 수 있는 방법이 있습니까? 이렇게 하면 program -p hello_world -tSu해당 플래그만 사용되며 -p공백 뒤의 모든 항목은 무시됩니다.

답변1

program쉘 함수 에서 "$@"함수에 제공된 모든 명령줄 인수 목록을 참조하는 데 사용됩니다. 따옴표를 사용하면 주어진 각 명령줄 인수가 program개별적으로 인용됩니다(일반적으로 원하는 대로).

program () {
    "$GOBIN"/program "$@"
}

그러면 program다음과 같이 호출할 수 있습니다.

program -p hello_world -tSu

hello world아니면 대신 합격하고 싶다면 hello_world,

program -p 'hello world' -tSu

아시다시피 using은 $1첫 번째 명령줄 인수만 참조합니다(그리고 $2두 번째 등도 참조합니다). 값은 $1추가로 공백으로 분할되며 확장이 인용되지 않았기 때문에 각 결과 문자열은 파일 이름 글로빙을 거칩니다. 이로 인해 공백이나 파일 이름 글로빙 패턴이 포함된 인수가 함수에 잘못 전달됩니다.

답변2

"$@"Kusalananda의 답변에 따라 함수/스크립트가 받은 모든 인수를 전달하는 방법을 제공하는 것입니다.

$GOBIN그러나 go 프로그램 내에서 폴더를 사용하는 것 같으면 PATH에 폴더를 추가하는 것이 더 나을 것이라고 생각합니다.

export GOPATH="$HOME/go_projects"
export GOBIN="$GOPATH/bin"
export PATH="$PATH:$GOBIN"

이렇게 하면 $GOBIN이름만 입력하면 그 안에 저장된 모든 프로그램을 실행할 수 있습니다(기존 프로그램과 이름이 같은 경우는 제외).추가$GOBIN을 $PATH로 지정하면 이 프로그램이 선택됩니다.마지막).

추신: 완전성을 기하기 위해 함수 대신 별칭을 사용하는 세 번째 옵션이 있습니다. 다음 위치에 넣을 수 있습니다 .bashrc.

alias program="$GOBIN/program"

답변3

나에게 도움이 된 것은 다음과 같습니다.

m() {
    args="$@"
    usql mysql://root@localhost:3306 -c $args
}

이는 기본적으로 다음과 같은 명령을 실행할 수 있도록 명령 끝에 따옴표로 묶인 매개변수 세트를 넣습니다.

m show databases;

실제로 달렸어

usql mysql://root@localhost:3306 -c "show databases;"

관련 정보