별칭에 매개 변수를 전달하는 방법은 무엇입니까?


64

bash 스크립트의 경우 "$@"인수에 액세스 하는 데 사용할 수 있습니다. 별칭을 사용할 때 동등한 기능은 무엇입니까?

답변:


50

별명은 별명에 대한 모든 인수가 별명을 갖는 프로그램에 인수로 전달된다는 점에서 명령과 같습니다. 예를 들어, 경우 별칭이었다 lsls -la, 다음을 입력 ls foo bar것이 정말 실행 ls -la foo bar명령 줄에서.

인수가 해석되는 방식을 실제로 제어하려면 다음과 같이 함수를 작성할 수 있습니다.

my_program_wrapper() {
    local first_arg="$1" \
          second_arg="$2"

    shift 2               # get rid of the first two arguments

    # ...

    /path/to/my_program "$@"
}

3
opengroup.org/onlinepubs/009695399/utilities/…의 기능 sh이 정의되어 my_program_wrapper() { ...; }있습니다. Bash는 키워드를 처리 function하지만 더 이식성 이 좋은 키워드 는 무엇입니까?
ephemient

2
@ephemient 매우 사실입니다. 모든 사람들이 GNU POS를 사용하고 POSIX 셸은 사용하지 않는다는 사실 외에
amphetamachine

21

별명 솔루션

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

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

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

설명

이것은 f인수로 전달되는 임시 함수를 만듭니다 .

별명 인수는 끝에 만 전달됩니다. 참고는 f별명의 맨 끝에라고합니다.

unset -f별칭은 별칭이 실행될 때 함수 정의를 제거하므로 나중에 중단되지 않습니다.


흠? wrap_args x y zbash : 예기치 않은 토큰 근처의 구문 오류`( '
타원형보기

@Elipticalview 흠, 복사 붙여 넣기 문제? 배쉬 4.4.12 작업 확인.
Tom Hale

1
나는 f별칭을 가졌다 . 일단 앨리어싱 제거 f하면 제대로 작동합니다. 옛 이름 충돌 것.
타원형보기

command type f:)
Tom Hale

1
큰! 그것이 가장 게으른 변종입니다!
Sergius

19

현재 답변에 덧붙여서, 별명이 작동하는 방식에 대해 알아야 할 중요한 것은 별명을 지은 명령 뒤에 입력 한 모든 매개 변수가 문자 그대로 사용된다는 것입니다. 따라서 두 명령에 대해 별명을 사용할 수있는 방법이 없습니다 (파이핑 여부에 관계없이). 명확히하기 위해 예상대로 작동하지 않는 예가 있습니다.

alias lsswp="ls -l | grep swp"

( 이 질문에서 영감을 얻은 예 ) 항상 현재 디렉토리 ls -l에서 수행 된 출력을 사용하고 그에 대한 grep을 수행합니다.

lsswp / tmp /

ls -l | grep swp /tmp/ 거나 같지 않습니다 ls -l /tmp/ | grep swp .

인수가 중간 어딘가에 사용되어야하는 모든 목적을 위해서는 function대신 을 사용해야합니다 alias.


15

실제로 아무것도 할 필요가 없습니다. 별명은이를 자동으로 수행합니다. 예를 들어 :

$ alias less="less -eirqM"
$ less foo.txt

foo.txt의 첫 페이지가 표시 less되고 EOF (-e)에서 종료되고 검색은 대소 문자를 구분하지 않습니다 (-i) 등입니다.


당신은 내 질문을 볼 수 있습니까 - 어떤 해결책도 나를 위해 효과가 없으며 현상금을 시작할 수 없습니다.
JJD

1
@JJD 귀하의 질문에 대답 한 사람이 맞습니다.이 경우 별칭이 아닌 함수를 원합니다. 에 허용 대답 때문에 문제는 본질적으로 동일, 귀하의 질문에 바르게 폐쇄되었다.
Warren Young

1

나는 csh에 대답하고있다 :

예, 별칭으로 매개 변수를 사용할 수 있으며 위에서 언급 한 것과 달리 별칭 정의의 어디에서나 끝 부분을 참조 할 수 있습니다.

tar-gz -ing의 예 :

$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"

별명을 호출 할 때 제공 할 매개 변수 !:1및 위치 !:2는 어디 입니까?

사용 예 :

    $ ls
    clrcf.dat                             user_comment_2016.06.03_12:51:50.txt  user_comment_2016.06.03_12:54:48.txt
        TEST-wADM.tec                         user_comment_2016.06.03_12:52:04.txt  user_comment_2016.06.03_12:55:13.txt


    $ tgz user* out
    a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K

    $ ls out*
    out.tar.gz

이는 tar 명령의 임의 위치에 삽입 한 두 개의 매개 변수를 사용하여 모든 매개 변수를 별명으로 만드는 것을 의미합니다. tgz

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.