![Bash가 함수에 사용된 ls 명령에 --color=auto를 자동으로 삽입하는 이유는 무엇입니까?](https://linux55.com/image/158519/Bash%EA%B0%80%20%ED%95%A8%EC%88%98%EC%97%90%20%EC%82%AC%EC%9A%A9%EB%90%9C%20ls%20%EB%AA%85%EB%A0%B9%EC%97%90%20--color%3Dauto%EB%A5%BC%20%EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C%20%EC%82%BD%EC%9E%85%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
나는 이 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 changed
latest
다른 파일의 정의를 보고 있지 않은지 확인하기 위해 사용하는 임의의 문자열입니다 .
문제는 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