Bash 별칭-우선 순위 / 그림자 (/ 숨기기 / 실패)

Aug 17 2020

.bashrc에 몇 가지 별칭 설정 (이 순서대로)이 있습니다.

alias ls="lsc"
alias lsc='ls -Flatr --color=always'
alias lscR='ls -FlatrR --color=always'

alias소싱 후 확인 :

alias ls='lsc'
alias lsc='ls -Flatr --color=always'
alias lscR='ls -FlatrR --color=always'

새로 별칭이 지정된 것을 ls잘 실행할 수 있으며 lsc 별칭에 연결 한 다음 lsc 별칭과 관련된 명령을 실행합니다. 나는 또한 실행할 수 lscR있으며 예상대로 작동합니다.

그래도 lsc스스로 실행하려고하면 다음과 같은 결과 가 나타납니다.

$ lsc
lsc: command not found

이 시나리오에서 쉘이 lsc 별칭을 숨기거나 숨기는 것처럼 보이는 이유를 아십니까? (여기서 'ls'를 실행하여 동일한 결과를 얻을 수있을 때 'lsc'를 실행하는 것은 무의미하다는 것을 알고 있지만이 시나리오에서 쉘 동작을 이해하려고합니다.)

편집 : 질문 답변에 제공된 (bash) 셸 동작에 대한 아래 해결 방법.

원래 질문에 대한 몇 가지 유용한 답변이 제공되었습니다. 답변에 설명 된 확장 동작을 단락시키기 위해 이미 별칭을 지정한 명령을 확장하려는 두 번째 별칭을 방지하는 방법이 두 가지 이상있는 것 같습니다. 예를 alias cmd='cmd --stuff'들어라는 기본 명령을 재정의하는 경우 다음 cmd과 같이 cmd다른 별칭 내 에서 기본 명령 대신 'cmd'별칭이 사용되는 것을 방지 할 수 있습니다 .

(이 첫 번째 접근 방식에 대한 wjandrea의 의견에 감사드립니다)

  1. cmd다른 별명에서 'command' 접두사 예 :alias other-cmd-alias='command cmd --other-stuff'

또는,

  1. 마찬가지로 명령 줄에서도 할 수있는 것처럼 다른 별칭 내에서 백 슬래시 ''접두사를 사용하여 별칭을 이스케이프 할 수 있습니다 (예 : alias other-cmd-alias='\cmd --other-stuff'.

답변

13 John1024 Aug 17 2020 at 11:58

Bash는 별칭에 별칭을 포함 할 수 있지만 무한 루프에 대한 보호 기능이 내장되어 있습니다. 귀하의 lsc경우을 입력 하면 bash는 먼저 별칭을 다음으로 확장합니다.

ls -Flatr --color=always

때문에 ls또한 별칭, bash는 그것을로 확장 :

lsc -Flatr --color=always

lsc은 별칭이지만 상당히 현명하게 bash는 두 번째 확장을 거부합니다 . 라는 프로그램이 있으면 lscbash가이를 실행합니다. 그러나, 그것이 없기 때문에 command not found.

추가

달리면 다릅니다 lscR. lscR확장 :

ls -FlatrR --color=always

때문에 ls별명이 팽창에있다 :

lsc -FlatrR --color=always

때문에 lsc별명이 팽창에있다 :

ls -Flatr --color=always -FlatrR --color=always

때문에 ls이미 한 번 확장되었습니다, bash는 그것을 확장하기를 거부 한 번 더 . 호출 된 실제 명령이 ls존재하므로 실행됩니다.

역사

Schily 가 주석에서 언급했듯이 bash는 ksh 에서 별칭을 두 번 확장하지 않는 개념을 차용했습니다 .

곁에

별칭은 유용하지만 그다지 강력하지는 않습니다. 인수 대체와 같이 별칭을 사용하여 복잡한 작업을 수행하고 싶은 경우에는하지 마십시오. 대신 쉘 함수를 사용하십시오.

6 muru Aug 17 2020 at 12:00

에서 bash는 설명서 :

대체 텍스트의 첫 번째 단어는 별칭에 대해 테스트되지만 확장되는 별칭과 동일한 단어는 두 번째로 확장되지 않습니다. 예를 들어 ls" ls -F"로 별칭 을 지정할 수 있으며 Bash는 대체 텍스트를 재귀 적으로 확장하지 않습니다.

에서 ls별명 ls으로 확장 lsc한 후 다시에 ls -Flatr --color=always, 그리고 이후 별칭 확장이있다 중지 ls원래 확장되고 있었다. 따라서 명령이 정상적으로 실행 ls되고 이제 외부 명령으로 확인됩니다.

에서 lsc별명 lsc으로 확장됩니다 ls -Flatr --color=always다음과 ls지금을 확장 lsc하고 거기에 있기 때문에, 별칭 확장 정지 lsc원래 확장되고 있었다. 따라서 bash는 다른 lsc.