Bash에서 두 명령을 바꾸는 방법은 무엇입니까?

Bash에서 두 명령을 바꾸는 방법은 무엇입니까?

명령 A과 명령이 있는데 입력한 대로 실행 B하고 싶고 그 반대의 경우도 마찬가지라고 가정해 보겠습니다. 나는 노력했다BA

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 Aalias$PATHBA

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 -Fbash

나는 이것을 이전에 읽었지만 이것을 할 때 현재 확장으로 이어지는 모든 확장을 테스트하지는 않는다고 생각합니다. 체인의 최신 확장에만 적용되는 것 같습니다. 아무튼 그런 이유인 것 같습니다.

하지만 몇 가지 흥미로운 동작을 발견했습니다. 별칭과 함수를 선언한 후 다음과 같이 명령을 다시 실행했지만 그 사이에 공백이 적었습니다.

A(){ echo not B; }; B(){ echo not A; }; A; B

...사실이에요...

1
2
3
4
5
6
not B
7
8
not A

이는 쉘이 함수 이름을 별칭 내용으로 대체한다는 것을 의미합니다. 이는 일반적으로 확장이 발생할 것으로 예상되는 위치가 아닙니다 echo.아직함수를 재정의한 후 실행합니다.

관련 정보