나는 alias
내 rm
주문을 가지고 있습니다. 명령을 실행하면 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
strace
PATH
셸을 통해 프로그램을 실행하는 대신(출력이 복잡해질 수 있음) 환경 변수를 사용하여 추적할 프로그램을 찾으세요. 쉘 별칭은 프로그램이 아니라 쉘의 기능이므로 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