使用env
程序。Env是一个命令,它可以使用可能修改过的环境启动另一个程序。因为env是一个程序,所以它没有访问shell内置命令、别名等的权限。
这个命令将在您的命令路径中运行echo程序:
$ env echo foo
你可以通过使用strace
监视系统调用来验证这一点,同时运行echo
和env echo
:
$ strace -f -e trace=process bash -c 'echo foo'
execve("/bin/bash", ["bash", "-c", "echo foo"], [/* 16 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7f153fa14700) = 0
foo
exit_group(0) = ?
$ strace -f -e trace=process bash -c 'env echo foo'
execve("/bin/bash", ["bash", "-c", "env echo foo"], [/* 16 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7f474eb2e700) = 0
execve("/usr/bin/env", ["env", "echo", "foo"], [/* 16 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7f60cad15700) = 0
execve("/usr/local/sbin/echo", ["echo", "foo"], [/* 16 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/local/bin/echo", ["echo", "foo"], [/* 16 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/sbin/echo", ["echo", "foo"], [/* 16 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/bin/echo", ["echo", "foo"], [/* 16 vars */]) = -1 ENOENT (No such file or directory)
execve("/sbin/echo", ["echo", "foo"], [/* 16 vars */]) = -1 ENOENT (No such file or directory)
execve("/bin/echo", ["echo", "foo"], [/* 16 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7f0146906700) = 0
foo
exit_group(0) = ?
echo
)可以相当可靠地硬编码路径。 - Etan Reisnerprintf
而不是任何形式的echo
。 - chepnerecho
支持-e
添加转义序列和-n
防止尾随换行。 - eloyespcommand
内置命令:command echo ...
。这样做行不通,因为command
绕过了shell函数,但不会绕过内置命令。我在这里提到这一点是为了那些无法阅读已删除答案并可能尝试使用command
命令的人的好处。 - Keith Thompson