.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에게 감사드립니다)
cmd
다른 별칭에 "명령" 접두사를 추가하세요.alias other-cmd-alias='command cmd --other-stuff'
또는,
- 마찬가지로 백슬래시 '' 접두사를 추가하여 다른 별칭 내의 별칭을 이스케이프할 수 있습니다(예: 명령줄에서도 이 작업을 수행할 수 있습니다)
alias other-cmd-alias='\cmd --other-stuff'
.
답변1
Bash는 별칭에 별칭을 포함하는 것을 허용하지만 무한 루프에 대한 보호 기능이 내장되어 있습니다. 귀하의 경우 를 입력하면 lsc
bash는 먼저 별칭을 다음과 같이 확장합니다.
ls -Flatr --color=always
ls
별칭이기도 하므로 bash는 이를 다음과 같이 확장합니다 .
lsc -Flatr --color=always
lsc
별칭이지만 현명하게도 bash는 별칭으로 확장하는 것을 거부합니다.두 번째. 라는 프로그램이 있으면 lsc
bash가 해당 프로그램을 실행합니다. 하지만 아니, 그래서 당신은 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
이 명령어를 실행한다.
역사
지적한대로힐리댓글에서 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
.