배쉬 매뉴얼에서
별칭의 정의 및 사용에 관한 규칙은 다소 혼란스럽습니다. Bash는 해당 줄에서 명령을 실행하기 전에 항상 입력의 전체 줄을 하나 이상 읽습니다. 별칭은 명령이 실행될 때가 아니라 명령을 읽을 때 확장됩니다. 따라서 다른 명령과 같은 줄에 나타나는 별칭 정의는 다음 입력 줄을 읽을 때까지 적용되지 않습니다. 줄에서 별칭 정의 뒤에 오는 명령은 새 별칭의 영향을 받지 않습니다. 이 동작은 함수를 실행할 때도 문제가 됩니다. 별칭은 함수가 실행될 때가 아니라 함수 정의를 읽을 때 확장됩니다., 함수 정의 자체가 복합 명령이기 때문입니다. 결과적으로, 함수에 정의된 별칭은 함수를 실행한 후에만 사용할 수 있습니다.. 안전을 위해 항상 별칭 정의를 별도의 줄에 배치하고 복합 명령에 별칭을 사용하지 마십시오.
"별칭은 함수가 실행될 때가 아니라 함수 정의를 읽을 때 확장됩니다"와 "함수에 정의된 별칭은 해당 함수가 실행된 후에만 사용할 수 있습니다"라는 문장은 서로 모순되는 것 같습니다.
그것이 무엇을 의미하는지 설명해 주실 수 있나요?
답변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 민첩한 갈색 여우는 게으른 개 위로 뛰어올랐습니다.
myfunc
call 로 정의 하고myalias
다시 정의 하더라도 원래 정의는 계속 실행됩니다 . 별칭은 다음과 같기 때문입니다.myalias
myfunc
myalias
확장하다함수가 정의되면. 실제로 쉘은 더 이상myfunc
호출을 기억하지 않습니다. 호출에 대해서만myalias
알고 있습니다 .myfunc
cat
$ 유형 myfunc myfunc은 함수입니다 마이펑크() { 내 파일을 고양이 }
...함수에 정의된 별칭은 함수가 실행된 후에만 사용할 수 있습니다.
$ 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는 스택 오버플로만 발생하고 종료됩니다.
이 문제를 해결할 수 있는 방법이 있을 수 있지만 그것이 무엇인지는 모르겠습니다.