看以下两条命令:
[zhangsan@XEN /sys]$ a=\"ls\";b=\"\\$a\";c=\"$b\";\"$c\"
Hey! No command \'$a\' found, did you mean \'ia\'?

[zhangsan@XEN /sys]$ a=\"ls\";b=\"\\$a\";c=\"$b\";eval \"$c\"
block  bus  class  dev  devices  firmware  fs  kernel  module  power

eval命令的作用是再次扫描解释,可多次叠加,如:
[zhangsan@XEN /sys]$ a=\"ls\";b=\"\\$a\";c=\"\\$b\";eval \"$c\"     
Hey! No command \'$a\' found, did you mean \'ia\'?
[zhangsan@XEN /sys]$ a=\"ls\";b=\"\\$a\";c=\"\\$b\";eval eval \"$c\"
block  bus  class  dev  devices  firmware  fs  kernel  module  power

附: 关闭文件描述符函数,并导出该函数给子进程使用
close_all_fd()
{
    # 0, 1, 2, 255
    # compgen -G \"/proc/$BASHPID/fd/*
    for fd in $(ls /proc/$$/fd); do
        if test $fd -gt 2; then
            # 关闭文件描述符fd
            eval \"exec $fd>&-\"
        fi
    done
}
# 导出close_all_fd
export -f close_all_fd
实际应用,可参见:https://github.com/eyjian/libmooon/blob/master/shell/process_monitor.sh
 

收藏 打印