Bash 별칭 ​​- 우선 순위 /hide (/hide/fail)

Bash 별칭 ​​- 우선 순위 /hide (/hide/fail)

.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다른 별칭에 "명령" 접두사를 추가하세요.alias other-cmd-alias='command cmd --other-stuff'

또는,

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

답변1

Bash는 별칭에 별칭을 포함하는 것을 허용하지만 무한 루프에 대한 보호 기능이 내장되어 있습니다. 귀하의 경우 를 입력하면 lscbash는 먼저 별칭을 다음과 같이 확장합니다.

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

lsbash는 이미 한 번 확장되었기 때문에 확장을 거부합니다.두 번째. 라는 실제 명령어가 있으므로 ls이 명령어를 실행한다.

역사

지적한대로힐리댓글에서 bash는 별칭을 다시 확장하지 않는다는 개념을 차용합니다.케시.

옆에

별칭은 유용하지만 그다지 강력하지는 않습니다. 매개변수 대체와 같은 복잡한 작업을 수행하기 위해 별칭을 사용하려면 대신 셸 함수를 사용하지 마세요.

답변2

~에서배쉬 매뉴얼:

대체 텍스트의 첫 번째 단어는 별칭이 있는지 테스트되지만 확장되는 단어와 동일한 별칭을 가진 단어는 다시 확장되지 않습니다. 이는 예를 들어 ls" ls -F"에 대한 별칭을 사용할 수 있으며 Bash는 대체 텍스트를 재귀적으로 확장하려고 시도하지 않음을 의미합니다.

ls별칭 에서는 ls가 로 확장된 lsc다음 다시 로 확장되고 ls -Flatr --color=always별칭 확장은 ls원래 확장된 대로 중지됩니다. 따라서 명령은 제대로 실행되었으며 ls이제 외부 명령으로 확인됩니다.

lsc별칭 에서 lsc다음으로 확장된 다음 ls -Flatr --color=always이제 다음 ls으로 확장되고lsc거기별칭 확장은 lsc초기 확장 중이었기 때문에 중단되었습니다. 따라서 bash는 다른 것을 모르기 때문에 명령이 실패합니다 lsc.

관련 정보