명령 A
과 명령이 있는데 입력한 대로 실행 B
하고 싶고 그 반대의 경우도 마찬가지라고 가정해 보겠습니다. 나는 노력했다B
A
alias A='B'
alias B='A'
그러나 이것은 어떤 이유에서인지 작동하지 않는 것 같습니다.
어떻게 해야 하나요?
편집하다:
명령은 실제로 my B
에서 함수로 정의되었으므로.bashrc
alias A='command B'
alias B='command A'
제안한 대로 작동하지 않습니다.
나는 this 를 명시하도록 질문을 업데이트하거나 bash에 정의된 함수일 수 있다고 생각 A
했습니다 B
.
답변1
따라서 쉘이 명령을 찾는 방법을 명시적으로 확인할 수 있는 몇 가지 방법이 있습니다. 당신은 그것을 사용할 수 있습니다 ...
command command_name
...쉘에 호출만 하도록 지시합니다.명령 이름$PATH
실행 파일 인 경우 . 이는 귀하와 같은 경우에 중요합니다. 왜냐하면 작업이 완료되면 일반적으로 확장이 반복을 멈추기까지 20번이 걸리며 alias A
시작 했던 alias B
곳 으로 돌아오기 때문입니다. 호출될 때만 d 실행 파일을 호출하고 그 반대의 경우도 마찬가지라면 다음과 같이 할 수 있습니다.alias A
alias
$PATH
B
A
alias A='command B' B='command A'
A
...이것은 또는 이름이 지정된 함수를 호출하는 것을 피해야 합니다 B
. 그렇지 않으면 - 쉘은 참조를 확장하지 않지만 alias
여전히 alias
함수를 호출하기 때문입니다.명령 이름인용하려면 예를 들어 정의에서 A
인용 할 수 있습니다.B
alias A=\\B B=\\A
좋습니다. 그러면 20번 반복되지 않습니다. 어딘가에서 이 글을 읽었다고 맹세할 수도 있지만 man
적어도 둘 다 bash
사실 이 아닌 것 같습니다.ksh
(지금까지 그중 하나만 테스트했습니다). 실제로는 두 번만 반복됩니다.
n=0
A(){ echo not B; n=0; }
B(){ echo not A; n=0; }
alias A='echo "$((n+=1))";B' B='echo "$((n+=1))";A'
위와 같이 하면...
A
... bash
다음을 인쇄합니다.
1
2
not B
나는 이것이 매뉴얼의 내용과 관련이 있다고 생각합니다 bash
.
- 대체 텍스트의 첫 번째 단어는 별칭이 있는지 테스트되지만 확장되는 단어와 동일한 별칭을 가진 단어는 다시 확장되지 않습니다. 이는 예를 들어 별칭을 지정할 수
ls
있으며 대체 텍스트를 재귀적으로 확장하려는 시도가 이루어지지 않음을 의미합니다.ls -F
bash
나는 이것을 이전에 읽었지만 이것을 할 때 현재 확장으로 이어지는 모든 확장을 테스트하지는 않는다고 생각합니다. 체인의 최신 확장에만 적용되는 것 같습니다. 아무튼 그런 이유인 것 같습니다.
하지만 몇 가지 흥미로운 동작을 발견했습니다. 별칭과 함수를 선언한 후 다음과 같이 명령을 다시 실행했지만 그 사이에 공백이 적었습니다.
A(){ echo not B; }; B(){ echo not A; }; A; B
...사실이에요...
1
2
3
4
5
6
not B
7
8
not A
이는 쉘이 함수 이름을 별칭 내용으로 대체한다는 것을 의미합니다. 이는 일반적으로 확장이 발생할 것으로 예상되는 위치가 아닙니다 echo
.아직함수를 재정의한 후 실행합니다.