별명 및 기능


17

bash 매뉴얼에서

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

두 함수 "함수는 함수가 실행될 때가 아니라 함수 정의를 읽을 때 확장됩니다"와 "함수에 정의 된 별칭은 해당 함수가 실행될 때까지 사용할 수 없습니다"라는 두 문장이 서로 상충되는 것 같습니다.

각각의 의미를 설명 할 수 있습니까?


좋은 질문! 나는 오늘 새로운 것을 기대었다. 실제로 2 가지를 배웠습니다 .1) 함수 def를 읽을 때의 별칭 확장에 대한이 정보와 2) bash 매뉴얼을주의 깊게 읽어야합니다 (이미 생각했지만 분명히하지 않았습니다 ^^ )
Olivier Dulac

4
주된 질문은 누구나 비 대화식 모드에서 별칭을 사용해야합니까? 이것이 함수의 기능이며 별칭은 스크립트 작성에 오류가 발생하기 쉽습니다. 나는 실제로 .bashrc맨 위의 파일에서 별칭 만 발견했기 때문에 실제로 위의 정보가 필요하지 않았습니다 .
오리온

답변:


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

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

    비록 myfunc전화로 정의 myalias하고, 내가 재정의 한 myalias, myfunc아직도의 원래 정의를 실행합니다 myalias. 함수가 정의 될 때 별명이 확장 되었기 때문 입니다. 사실, 쉘은 더 이상 myfunc호출을 기억하지 않습니다 myalias. 그것은 단지 그 myfunc호출 만을 알고 있습니다 cat:

    $ 유형 myfunc
    myfunc는 함수입니다
    myfunc ()
    {
    고양이 myfile
    }
  2. … 함수에 정의 된 별칭은 해당 함수가 실행될 때까지 사용할 수 없습니다.

    $ echo "빠른 갈색 여우가 게으른 개 위로 뛰어 넘습니다." > myfile
     
    $ myfunc () {
    > 별명 myalias = cat
    >}
     
    $ myalias myfile
    -bash : myalias : 명령을 찾을 수 없습니다
     
    $ myfunc
     
    $ myalias myfile
    빠른 갈색 여우는 게으른 개 위로 뛰어 넘습니다.

    myalias때까지 별명은 사용할 수없는 myfunc기능이 실행되었습니다. (별명을 정의하는 함수를 정의하는 것이 별명을 정의하기에 충분하면 다소 이상하다고 생각합니다.)


4
+1, 정답입니다. 이것의 중요한 "추론"은 스크립트에서 함수와 별칭을 정의하려는 경우 함수 정의 앞에 별칭 정의를 더 잘 넣는 것입니다! (지금은 대답이 있지만, 나는 이것을 몰랐습니다).
Olivier Dulac

감사. 근본적인 문제는 함수 정의 실행과 함수 호출의 차이점이라고 생각합니다. 특히, 함수 정의를 실행하고 함수를 각각 호출하는 동안 수행되는 쉘 조작은 무엇입니까? 함수 정의를 실행하고 함수를 호출하는 동안 수행되는 쉘 조작이 있습니까? 아니면 함수 정의를 실행하고 함수를 호출하여 겹치지 않는 쉘 조작을 수행합니까?
17:18에 모두

글쎄, 그것은 차를 세우는 것과 차를 운전하는 것의 차이와 조금 다릅니다. 또는 샌드위치를 ​​사고 샌드위치를 ​​먹는 것. 나는 당신의 다른 질문에 대한 자세한 답변을 제공했습니다 .
G-Man, 'Reinstate

감사. bash 매뉴얼과 인용문에서 인용문을 다시 읽은 후에 함수 실행의 의미에 대해 혼란 스럽습니다. 함수의 정의를 실행하거나 함수를 호출한다는 의미입니까? unix.stackexchange.com/q/384209/674
모든

1

내 스 니펫 아래를 시도 할 때 첫 번째 문장으로 표시된 답변이 필요합니다.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별칭이 아닌 형태, 색상 없음을 강조하고, 실행 파일 후 어떤 제어 문자를 사용합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.