strace가 내 rm 별칭을 무시하는 이유는 무엇입니까?

strace가 내 rm 별칭을 무시하는 이유는 무엇입니까?

나는 aliasrm주문을 가지고 있습니다. 명령을 실행하면 alias이것이 출력됩니다.

alias rm='rm -i'

이제 명령을 실행하면 rm예상대로 잘 작동합니다.

rm ramesh
rm: remove regular empty file `ramesh'? y

이제 명령을 실행할 때 호출되는 시스템 호출에 대해 알아봅니다. 이를 위해 나는 strace다음 명령에 대해 배웠습니다.여기특정 명령을 실행할 때 호출되는 파일을 나열합니다. 명령은 다음과 같습니다.

strace -ff -e trace=file rm ramesh 2>&1 

명령에 대해 설정한 별칭을 무시한다는 점을 제외하면 명령은 잘 작동합니다 rm. 사용자에게 묻지 않고 파일을 삭제합니다.

그럼 strace이렇게 별칭을 무시하시겠습니까? 그렇다면 왜 그럴까요?

편집하다:

이것이 그것과 관련이 있는지 확실하지 않지만 type -a rm나에게 주어진 결과는 다음과 같습니다.

rm is aliased to `rm -i'
rm is /bin/rm

그렇다면 이 경우 /bin/rm삭제 전에 사용자에게 메시지가 표시되지 않는 이유를 고려했습니까?

답변1

strace실행되지 않는 이유는 rm -i다음과 같습니다.

echo rm

출력이 없습니다 rm -i.

앨리어싱은 특정 문자열이 명령 위치에서 발견되면 자동으로 다른 문자열로 대체되도록 하는 일부 쉘의 기능입니다.

존재하다:

alias foo='whatever'
foo xxx

쉘은 이를 다음과 같이 확장합니다.

whatever xxx

whatever그리고 또 다른 해석을 거쳐 이 경우 명령이 실행됩니다 .

별칭은 명령 위치(명령줄의 첫 번째 단어)에 있는 경우에만 확장됩니다.

zsh지원하다글로벌별명.

다음을 수행할 수 있습니다.

alias -g rm='rm -i'

그러나 당신은 원하지 않을 것입니다. 왜냐하면 이것은 다음을 의미하기 때문입니다:

echo rm

rm -i예를 들어, 출력됩니다.

답변2

stracePATH셸을 통해 프로그램을 실행하는 대신(출력이 복잡해질 수 있음) 환경 변수를 사용하여 추적할 프로그램을 찾으세요. 쉘 별칭은 프로그램이 아니라 쉘의 기능이므로 strace무시해도 됩니다.

실행은 strace strace rm매우 계몽적이고 재귀적으로 흥미롭습니다.

답변3

별칭은 쉘의 기능입니다. 그러나 strace는 execve쉘을 사용하지 않고 명령을 직접 실행합니다( 가능하면 strace 사용). (strace가 쉘을 통해 주어진 명령을 실행하는 경우 strace의 출력에는 관심 있는 프로세스의 호출뿐만 아니라 모든 쉘 실행 시스템 호출이 포함됩니다.)

또한 대화형 셸은 실행할 때 strace 인수의 별칭을 바꾸려고 시도하지 않습니다 strace rm ramesh. 이는 모든 사람에게 매우 혼란스러울 수 있기 때문입니다. 셸은 명령줄에 처음 나타나는 별칭만 확장합니다.

답변4

정의한 경우 Stéphane Chazelas의 답변을 기반으로 구축

alias strace="strace "

(끝에 공백 있음) 다음 명령

strace rm ramesh

~ 할 것이다다음과 같이 처리됩니다.

strace rm -i ramesh

그러나 이것도 다음의 첫 번째 단어에만 적용되므로 strace예제에 직접 적용되지는 않습니다(중간 옵션이 있음).  하지만,정의한다면

alias my_strace="strace -ff -e trace=file "

그 다음에

my_strace rm ramesh

~ 할 것이다다음과 같이 처리됩니다.

strace -ff -e trace=file rm -i ramesh

관련 정보