为什么strace 忽略我的rm 别名?

Ram*_*esh 8 alias strace

alias有一套我的rm命令。如果我运行alias命令,这就是我得到的输出。

alias rm='rm -i'
Run Code Online (Sandbox Code Playgroud)

现在,当我运行rm命令时,它按预期工作正常。

rm ramesh
rm: remove regular empty file `ramesh'? y
Run Code Online (Sandbox Code Playgroud)

现在,我正在学习执行命令时正在调用的系统调用。为此,我strace这里了解了命令,该命令列出了我执行某些命令时正在调用的文件。命令如下。

strace -ff -e trace=file rm ramesh 2>&1 
Run Code Online (Sandbox Code Playgroud)

该命令工作得很好,只是它忽略了我为rm命令设置的别名。它会在不提示用户的情况下删除文件。

那么,strace像这样忽略别名吗?如果是这样,为什么会这样?

编辑:

不确定,如果这有什么关系,但type -a rm给我的输出是,

rm is aliased to `rm -i'
rm is /bin/rm
Run Code Online (Sandbox Code Playgroud)

那么/bin/rm在这种情况下是否考虑这就是为什么在删除之前不提示用户?

Sté*_*las 20

strace不运行rm -i的原因与:

echo rm
Run Code Online (Sandbox Code Playgroud)

不输出rm -i

别名是一些 shell 的一个特性,允许在命令位置找到某些字符串时自动替换为另一个字符串。

在:

alias foo='whatever'
foo xxx
Run Code Online (Sandbox Code Playgroud)

贝壳将其扩展为:

whatever xxx
Run Code Online (Sandbox Code Playgroud)

并且经过另一轮解释,在这种情况下导致执行whatever命令。

别名仅在命令位置(作为命令行的第一个单词)中找到时才会扩展。

zsh支持全局别名。

你可以这样做:

alias -g rm='rm -i'
Run Code Online (Sandbox Code Playgroud)

但你不会想要,因为这意味着:

echo rm
Run Code Online (Sandbox Code Playgroud)

rm -i例如会输出。


Mar*_*ark 9

strace使用PATH环境变量来定位要跟踪的程序,而不是通过 shell 执行它(这会使输出变得混乱)。shell 别名不是程序,而是 shell 的一个特性,因此可以strace忽略它。

运行strace strace rm是相当有启发性的,并且是有趣的递归。


Gre*_*ill 5

别名是 shell 的一个特性。但是,strace 直接执行命令(使用execve,可能),不涉及shell。(如果 strace 通过 shell 执行给定的命令,那么 strace 的输出将包含所有 shell 执行系统调用,而不仅仅是来自感兴趣进程的那些。)

此外,当您运行 时strace rm ramesh,交互式shell 不会尝试在strace 的参数中替换您的别名,因为这会让每个人都非常困惑。shell 只扩展出现在命令行第一个位置的别名。