[bash] 매개 변수를 사용하는 Bash 별칭을 만드시겠습니까?

나는 CShell을 사용했다.)를 사용하면 매개 변수를 사용하는 별칭을 만들 수 있습니다. 표기법은

alias junk="mv \\!* ~/.Trash"

Bash에서는 이것이 작동하지 않는 것 같습니다. Bash에 유용한 기능이 많이 있다고 가정하면이 기능이 구현되었다고 가정하지만 어떻게 궁금합니다.



답변

Bash 별명은 매개 변수를 직접 승인하지 않습니다. 함수를 만들어야합니다.

alias매개 변수를 허용하지 않지만 별명처럼 함수를 호출 할 수 있습니다. 예를 들면 다음과 같습니다.

myfunction() {
    #do things with parameters like $1 such as
    mv "$1" "$1.bak"
    cp "$2" "$1"
}


myfunction old.conf new.conf #calls `myfunction`

그건 그렇고, 당신 .bashrc과 다른 파일에 정의 된 Bash 함수 는 쉘 내에서 명령으로 사용할 수 있습니다. 예를 들어 다음과 같이 이전 함수를 호출 할 수 있습니다.

$ myfunction original.conf my.conf


답변

위의 답변을 수정하면 별칭과 마찬가지로 1 줄 구문을 얻을 수 있습니다. 이는 쉘 또는 .bashrc 파일의 임시 정의에 더 편리합니다.

bash$ myfunction() { mv "$1" "$1.bak" && cp -i "$2" "$1"; }

bash$ myfunction original.conf my.conf

오른쪽 대괄호를 닫기 전에 세미콜론을 잊지 마십시오. 마찬가지로 실제 질문에 대해 :

csh% alias junk="mv \\!* ~/.Trash"

bash$ junk() { mv "$@" ~/.Trash/; }

또는:

bash$ junk() { for item in "$@" ; do echo "Trashing: $item" ; mv "$item" ~/.Trash/; done; }


답변

질문은 단순히 잘못 요청됩니다. alias이미 존재하는 것에 대한 두 번째 이름 만 추가 하기 때문에 매개 변수를 사용하는 별칭을 만들지 않습니다 . OP가 원하는 기능은 function새 기능을 만드는 명령입니다. 함수에 이미 이름이 있으므로 함수의 별명을 지정할 필요가 없습니다.

나는 당신이 이와 같은 것을 원한다고 생각합니다 :

function trash() { mv "$@" ~/.Trash; }

그게 다야! 매개 변수 $ 1, $ 2, $ 3 등을 사용하거나 $ @로 모두 채울 수 있습니다.


답변

TL; DR : 대신이 작업을 수행하십시오

별명보다 함수를 사용하여 명령 중간에 인수를 넣는 것이 훨씬 쉽고 읽기 쉽습니다.

$ wrap_args() { echo "before $@ after"; }
$ wrap_args 1 2 3
before 1 2 3 after

계속 읽으면 쉘 인수 처리에 대해 알 필요가없는 것들을 배우게됩니다. 지식은 위험합니다. 어두운면이 운명을 영원히 지배하기 전에 원하는 결과를 얻으십시오.

설명

bash별명 인수를 허용하지만 끝에 만 허용됩니다 .

$ alias speak=echo
$ speak hello world
hello world

명령 비아 의 중간 에 인수를 넣는 alias것은 실제로 가능하지만 추악합니다.

집에서 이것을 시도하지 마십시오, 꼬마!

한계를 우회하고 다른 사람들의 말을하는 것이 불가능하다면, 여기에 레시피가 있습니다. 머리카락이 흐트러지고 얼굴이 그을음 미친 과학자 스타일로 덮힌다면 나를 비난하지 마십시오.

해결 방법은 alias끝에 만 허용 되는 인수를 중간에 삽입 한 다음 명령을 실행하는 랩퍼로 전달하는 것입니다.

해결책 1

실제로 함수 자체를 사용하지 않으면 다음을 사용할 수 있습니다.

$ alias wrap_args='f(){ echo before "$@" after;  unset -f f; }; f'
$ wrap_args x y z
before x y z after

당신은 대체 할 수 $@와 함께 $1당신은 단지 첫 번째 인수를 원하는 경우.

설명 1

이것은 임시 함수를 만들어 f인수를 전달합니다 ( f최후에 호출 됨). 이 unset -f별칭은 별칭이 실행될 때 함수 정의를 제거하므로 나중에 중단되지 않습니다.

해결책 2

서브 쉘을 사용할 수도 있습니다.

$ alias wrap_args='sh -c '\''echo before "$@" after'\'' _'

설명 2

별명은 다음과 같은 명령을 작성합니다.

sh -c 'echo before "$@" after' _

코멘트:

  • 자리 표시자가 _필요하지만 아무 것도 될 수 있습니다. 그것은으로 설정됩니다 sh의 ‘ $0, 및 사용자 지정된 인수의 첫 번째가 소모되지 않도록해야합니다. 데모:

    sh -c 'echo Consumed: "$0" Printing: "$@"' alcohol drunken babble
    Consumed: alcohol Printing: drunken babble
  • 작은 따옴표 안에 작은 따옴표가 필요합니다. 큰 따옴표로 작동하지 않는 예는 다음과 같습니다.

    $ sh -c "echo Consumed: $0 Printing: $@" alcohol drunken babble
    Consumed: -bash Printing:

    다음은 대화 형 쉘의 값 $0과는 $@인용 더블로 교체 하기 전에 이 전달됩니다 sh. 증거는 다음과 같습니다.

    echo "Consumed: $0 Printing: $@"
    Consumed: -bash Printing:

    작은 따옴표는 이러한 변수가 대화식 쉘에 의해 해석되지 않고 문자 그대로로 전달되도록 sh -c합니다.

    큰 따옴표와을 사용할 수 \$@있지만 가장 좋은 방법은 공백을 포함 할 수 있으므로 인수를 인용하고 \"\$@\"더 나쁘게 보이지만 모발이 모발에 들어가기위한 난독 화 컨테스트에서이기는 데 도움이 될 수 있습니다.


답변

다른 해결책은 최근에 만든 도구 인 marker 를 사용 하여 명령 템플릿을 “책갈피”하고 커서를 명령 자리 표시 자에 쉽게 배치 할 수 있습니다.

커맨드 라인 마커

대부분의 경우 쉘 함수를 사용하므로 자주 사용하는 명령을 명령 줄에 반복해서 쓸 필요가 없습니다. 이 사용 사례에 함수를 사용하는 문제는 명령 어휘에 새로운 용어를 추가하고 실제 명령에서 함수 매개 변수가 무엇을 참조하는지 기억해야합니다. 마커 목표는 그 정신적 부담을 제거하는 것입니다.


답변

별명 안에 함수를 작성하기 만하면됩니다.

$ alias mkcd='_mkcd(){ mkdir "$1"; cd "$1";}; _mkcd'

당신은 있어야 하기 때문에 작은 따옴표는하지 않습니다 일을 “$ 1″주위에 따옴표를 넣어.


답변

여기 내 함수의 세 가지 예가 ~/.bashrc있습니다. 기본적 으로 매개 변수를 허용하는 별칭입니다.

#Utility required by all below functions.
#/programming/369758/how-to-trim-whitespace-from-bash-variable#comment21953456_3232433
alias trim="sed -e 's/^[[:space:]]*//g' -e 's/[[:space:]]*\$//g'"

.

:<<COMMENT
    Alias function for recursive deletion, with are-you-sure prompt.

    Example:
        srf /home/myusername/django_files/rest_tutorial/rest_venv/

    Parameter is required, and must be at least one non-whitespace character.

    Short description: Stored in SRF_DESC

    With the following setting, this is *not* added to the history:
        export HISTIGNORE="*rm -r*:srf *"
    - https://superuser.com/questions/232885/can-you-share-wisdom-on-using-histignore-in-bash

    See:
    - y/n prompt: https://stackoverflow.com/a/3232082/2736496
    - Alias w/param: https://stackoverflow.com/a/7131683/2736496
COMMENT
#SRF_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
SRF_DESC="srf [path]: Recursive deletion, with y/n prompt\n"
srf()  {
    #Exit if no parameter is provided (if it's the empty string)
        param=$(echo "$1" | trim)
        echo "$param"
        if [ -z "$param" ]  #http://tldp.org/LDP/abs/html/comparison-ops.html
        then
          echo "Required parameter missing. Cancelled"; return
        fi

    #Actual line-breaks required in order to expand the variable.
    #- https://stackoverflow.com/a/4296147/2736496
    read -r -p "About to
    sudo rm -rf \"$param\"
Are you sure? [y/N] " response
    response=${response,,}    # tolower
    if [[ $response =~ ^(yes|y)$ ]]
    then
        sudo rm -rf "$param"
    else
        echo "Cancelled."
    fi
}

.

:<<COMMENT
    Delete item from history based on its line number. No prompt.

    Short description: Stored in HX_DESC

    Examples
        hx 112
        hx 3

    See:
    - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string
COMMENT
#HX_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
HX_DESC="hx [linenum]: Delete history item at line number\n"
hx()  {
    history -d "$1"
}

.

:<<COMMENT
    Deletes all lines from the history that match a search string, with a
    prompt. The history file is then reloaded into memory.

    Short description: Stored in HXF_DESC

    Examples
        hxf "rm -rf"
        hxf ^source

    Parameter is required, and must be at least one non-whitespace character.

    With the following setting, this is *not* added to the history:
        export HISTIGNORE="*hxf *"
    - https://superuser.com/questions/232885/can-you-share-wisdom-on-using-histignore-in-bash

    See:
    - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string
COMMENT
#HXF_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
HXF_DESC="hxf [searchterm]: Delete all history items matching search term, with y/n prompt\n"
hxf()  {
    #Exit if no parameter is provided (if it's the empty string)
        param=$(echo "$1" | trim)
        echo "$param"
        if [ -z "$param" ]  #http://tldp.org/LDP/abs/html/comparison-ops.html
        then
          echo "Required parameter missing. Cancelled"; return
        fi

    read -r -p "About to delete all items from history that match \"$param\". Are you sure? [y/N] " response
    response=${response,,}    # tolower
    if [[ $response =~ ^(yes|y)$ ]]
    then
        #Delete all matched items from the file, and duplicate it to a temp
        #location.
        grep -v "$param" "$HISTFILE" > /tmp/history

        #Clear all items in the current sessions history (in memory). This
        #empties out $HISTFILE.
        history -c

        #Overwrite the actual history file with the temp one.
        mv /tmp/history "$HISTFILE"

        #Now reload it.
        history -r "$HISTFILE"     #Alternative: exec bash
    else
        echo "Cancelled."
    fi
}

참고 문헌 :