별칭 및 기능

별칭 및 기능

배쉬 매뉴얼에서

별칭의 정의 및 사용에 관한 규칙은 다소 혼란스럽습니다. Bash는 해당 줄에서 명령을 실행하기 전에 항상 입력의 전체 줄을 하나 이상 읽습니다. 별칭은 명령이 실행될 때가 아니라 명령을 읽을 때 확장됩니다. 따라서 다른 명령과 같은 줄에 나타나는 별칭 정의는 다음 입력 줄을 읽을 때까지 적용되지 않습니다. 줄에서 별칭 정의 뒤에 오는 명령은 새 별칭의 영향을 받지 않습니다. 이 동작은 함수를 실행할 때도 문제가 됩니다. 별칭은 함수가 실행될 때가 아니라 함수 정의를 읽을 때 확장됩니다., 함수 정의 자체가 복합 명령이기 때문입니다. 결과적으로, 함수에 정의된 별칭은 함수를 실행한 후에만 사용할 수 있습니다.. 안전을 위해 항상 별칭 정의를 별도의 줄에 배치하고 복합 명령에 별칭을 사용하지 마십시오.

"별칭은 함수가 실행될 때가 아니라 함수 정의를 읽을 때 확장됩니다"와 "함수에 정의된 별칭은 해당 함수가 실행된 후에만 사용할 수 있습니다"라는 문장은 서로 모순되는 것 같습니다.

그것이 무엇을 의미하는지 설명해 주실 수 있나요?

답변1

  1. 별칭은 함수가 실행될 때가 아니라 함수 정의를 읽을 때 확장됩니다.

    $ echo "빠른 갈색 여우가 게으른 개를 뛰어넘었습니다. > 내 파일"
     
    $ 별칭 myalias=cat
     
    $ myfunc() {
    > myalias myfile
    > }
     
    $myfunc
    민첩한 갈색 여우는 게으른 개 위로 뛰어올랐습니다.
     
    $ 별칭 myalias="ls -l"
     
    $ myalias myfile
    -rw-r--r-- 1 myusername mygroup 45 12월 13일 07:07 myfile
     
    $myfunc
    민첩한 갈색 여우는 게으른 개 위로 뛰어올랐습니다.

    myfunccall 로 정의 하고 myalias다시 정의 하더라도 원래 정의는 계속 실행됩니다 . 별칭은 다음과 같기 때문입니다.myaliasmyfuncmyalias확장하다함수가 정의되면. 실제로 쉘은 더 이상 myfunc호출을 기억하지 않습니다. 호출에 대해서만 myalias알고 있습니다 .myfunccat

    $ 유형 myfunc
    myfunc은 함수입니다
    마이펑크()
    {
    내 파일을 고양이
    }
  2. ...함수에 정의된 별칭은 함수가 실행된 후에만 사용할 수 있습니다.

    $ echo "빠른 갈색 여우가 게으른 개를 뛰어넘었습니다. > 내 파일"
     
    $ myfunc() {
    > 별칭 myalias=cat
    > }
     
    $ myalias myfile
    -bash: myalias: 명령을 찾을 수 없습니다.
     
    $myfunc
     
    $ myalias myfile
    민첩한 갈색 여우는 게으른 개 위로 뛰어올랐습니다.

    이 함수가 실행될 때까지 별칭을 myalias사용할 수 없습니다 . myfunc(별칭을 정의한 함수를 정의하는 것만으로도 별칭이 정의되는 게 오히려 이상할 것 같아요.)

답변2

내 코드에서 아래 스니펫을 시도할 때 첫 번째 문장에 명시된 답변이 필요합니다..bashrc.

alias ls='\ls -F --color=auto --show-control-chars'
alias ll='ls -ahl'
function lf_macro() {
    local CMD=${1:-ls} DIR=${2:-.};
    $CMD $(find $DIR -maxdepth 1 -type f);
}
function lf() { lf_macro ll "$1"; }
function lsf() { lf_macro ls "$1"; }     # list all file, no directories

그 후 unalias -a; source ~/.bashrc나는 실행을 시도 lf하고 lsf,

$ lf
-bash: ll: command not found

$ lsf
./file1 ./file2 ./script.sh ...     # no color, no control-chars

$ ls $(find -maxdepth 1 -type f)
./file1 ./file2 ./script.sh* ...

분명히 별칭은 함수가 실행될 때가 아니라 함수가 정의될 ​​때 확장됩니다.:

  • 실행하면 lf오류가 발생 -bash: ll: command not found하고
  • 을 실행할 때 lsf별칭 /usr/bin/ls형식이 사용되지 않고 색상 강조 표시가 없으며 실행 파일 뒤에 제어 문자가 없습니다.

답변3

(예를 들어)라고 말할 수 있습니다.

별칭 mvn="mvn -Dmaven.wagon.http.ssl.insecure=true $@"

IE에서는 정의에서 별칭 이름을 반복할 수 있지만 함수를 사용하여 이를 수행할 수는 없습니다. bash는 스택 오버플로만 발생하고 종료됩니다.

이 문제를 해결할 수 있는 방법이 있을 수 있지만 그것이 무엇인지는 모르겠습니다.

관련 정보