我正在尝试修复一个使用echo
的脚本,即使用builtin命令而不是命令,如何防止这种情况发生?
我知道我可以使用/bin/echo
来强制使用它,但是我不想硬编码路径(为了可移植性)。
我想用这样的方法:
$ECHO=`which echo`
$ECHO -e "text\nhere"
但是which echo
返回:"echo: shell内置命令“。
最后,我定义了一个echo
函数,它使用@Kenster推荐的env
。这样,我就不需要修改脚本中回显的调用。
echo() {
env echo $*
}
# the function is called before the built-in command.
echo -en "text\nhere"
发布于 2015-04-09 14:30:08
使用env
程序。Env是一个命令,它使用可能修改的环境启动另一个程序。因为env是一个程序,所以它不能访问shell内置程序、别名等等。
此命令将运行回送程序,在命令路径中搜索它:
$ env echo foo
您可以通过使用strace
在运行echo
vs 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) = ?
https://stackoverflow.com/questions/29540540
复制相似问题