我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
例如会输出。
strace
使用PATH
环境变量来定位要跟踪的程序,而不是通过 shell 执行它(这会使输出变得混乱)。shell 别名不是程序,而是 shell 的一个特性,因此可以strace
忽略它。
运行strace strace rm
是相当有启发性的,并且是有趣的递归。
别名是 shell 的一个特性。但是,strace 直接执行命令(使用execve
,可能),不涉及shell。(如果 strace 通过 shell 执行给定的命令,那么 strace 的输出将包含所有 shell 执行系统调用,而不仅仅是来自感兴趣进程的那些。)
此外,当您运行 时strace rm ramesh
,交互式shell 不会尝试在strace 的参数中替换您的别名,因为这会让每个人都非常困惑。shell 只扩展出现在命令行第一个位置的别名。
归档时间: |
|
查看次数: |
1318 次 |
最近记录: |