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

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

我有一套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.

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

在:

alias foo='whatever'
foo xxx

shell 将其扩展为:

whatever xxx

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

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

zsh支持全球的别名。

你可以这样做:

alias -g rm='rm -i'

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

echo rm

rm -i例如会输出。

答案2

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

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

答案3

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

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

答案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

相关内容