source和/bin/bash的区别
通过/bin/bash filename
执行脚本,会生成一个子shell,该子shell会继承当前父shell(可以理解成当前的shell)的环境变量,但子shell中新建的、改变的变量不会被带回父shell,除非使用export。
source filename
命令只是简单地读取脚本里面的语句依次在当前shell里面执行,并没有建立新的子shell,脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
通过/bin/bash filename
执行脚本,会生成一个子shell,该子shell会继承当前父shell(可以理解成当前的shell)的环境变量,但子shell中新建的、改变的变量不会被带回父shell,除非使用export。
source filename
命令只是简单地读取脚本里面的语句依次在当前shell里面执行,并没有建立新的子shell,脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
Linux 系统下通过 passwd
命令修改密码会进入交互模式,此时系统会等待用户输入。如果我们不希望进入交互模式,通过脚本或者文件自动完成输入,或者通过接收到的参数完成输入操作,如此就能省去人工输入。结合EOF就能完美解决这个问题,下面通过自动化修改 pure-FTPd 用户密码的脚本 passwd.sh 实例来说明。
#!/bin/bash
# $1 $2 分别代表执行此脚本时的第一和第二个参数
/usr/local/pureftpd/bin/pure-pw passwd $1 <<EOF
$2
$2
EOF
/usr/local/pureftpd/bin/pure-pw mkdb
按如下格式执行脚本:/bin/bash passwd.sh ftpuser1 ftppassword
如果需要隐藏命令提示文字(标准输出),可添加 >/dev/null 2>&1
,具体如下:
#!/bin/bash
# $1 $2 分别代表执行此脚本时的第一和第二个参数
/usr/local/pureftpd/bin/pure-pw passwd $1 <<EOF >/dev/null 2>&1
$2
$2
EOF
/usr/local/pureftpd/bin/pure-pw mkdb