Bash가 함수에 사용된 ls 명령에 --color=auto를 자동으로 삽입하는 이유는 무엇입니까?

Bash가 함수에 사용된 ls 명령에 --color=auto를 자동으로 삽입하는 이유는 무엇입니까?

나는 이 setup파일을 가지고 있습니다 :

function latest { 
    count=${1:-5} ; 
    echo "Just changed"
    ls -lrtd * | tail -$count ; 
}

나는 그것을 이렇게 부른다:

. setup

latest그런 다음 bash에게 함수가 정의되었는지 묻습니다 .

>type latest
latest is a function
latest () 
{ 
    count=${1:-5};
    echo "Just changed";
    ls --color=auto -lrtd * | tail -$count
}

Just changedlatest다른 파일의 정의를 보고 있지 않은지 확인하기 위해 사용하는 임의의 문자열입니다 .

문제는 Bash가 --color=auto명령에 추가하는 이유입니다 ls(어쨌든 출력이 파이프로 연결되므로 쓸모가 없습니다). 예, 내 쉘에서 ls별칭은 입니다 ls --color=auto. 별칭을 제거하면 이런 일이 발생하지 않습니다. 하지만 함수 내에서는 별칭이 사용되지 않는다고 생각하는데, 어떤 경우에도 함수 정의 시 이러한 교체가 발생합니까?

답변1

문서화된 동작을 관찰합니다.Bash 매뉴얼의 별칭 섹션:

별칭은 함수 정의 자체가 명령이기 때문에 함수가 실행될 때가 아니라 함수 정의를 읽을 때 확장됩니다.

답변2

위의 Jeff가 맞습니다. 셸에 정의된 별칭을 보려면 프롬프트에 "alias"를 입력하세요.

예:

[USERID ~] $ alias
alias l.='ls -d .* --color=auto'
alias ll='ls -ahlF'
alias ls='ls --color=auto'
alias vi='vim'
[USERID ~] $

스크립트에서 별칭을 방지하려면 "ls" 명령의 별칭을 해제하거나 직접 호출해야 합니다. "ls"의 위치를 ​​찾으려면 내장된 쉘 유형을 사용하십시오.

[USERID ~] $ type -P ls
/usr/bin/ls

변수에 넣고 해당 변수로 "ls"를 호출할 수 있습니다.

[USERID ~] $ lsCmd=$(type -P ls)
[USERID ~] $ echo $lsCmd
/usr/bin/ls
[USERID ~] $ ls
MyAppData  MyDocuments  MyDownloads  Scripts  tmp.VOOlcGffwf  tmp.Y6IE7S2ps4
[USERID ~] $ $lsCmd
MyAppData  MyDocuments  MyDownloads  Scripts  tmp.VOOlcGffwf  tmp.Y6IE7S2ps4

첫 번째 경우에는 "ls"를 호출하면 "ls"의 별칭이 "ls --color=auto"이므로 색상이 지정된 출력이 제공되지만 두 번째 경우에는 별칭이 Bypass이므로 색상이 없는 출력이 제공됩니다.

답변3

Bash가 별칭을 확장하는 이유와시기를 설명하는 데 이전 답변이 모두 정확합니다. 그러나 특정 디렉토리 목록을 화면에서 읽을 수 없을 만큼 색상이 너무 비슷하게 보이게 만드는 (성가신) ls-별칭을 제거하려는 경우 제거할 별칭의 정의는 /etc/skel/ 파일에 있습니다. .bashrc

관련 정보