用途说明

source命令是bash中的内建命令,它等同于点命令(.),用于读取和在当前shell环境中执行指定文件中的命令,执行完毕之后退出码为该文件中的最后一个命令的退出码(Read  and  execute commands from filename in the current shell environment and return the exit status of the last command executed from filename.)。指定的文件可以没有执行权限。

在当前shell中执行和在子shell中执行的区别是,后者定义的变量和函数在执行结束后就消失了,而前者却可以保留下来。有时候我们修改了/etc/profile里面的内容,如增加了环境变量,那么要立即生效的话,就必须使用source命令或者点命令在当前shell中执行一下。

常用参数

格式: .  filename [arguments]

格式: source filename [arguments]

在后面的示例中会分别对各种情况举例演示。

使用示例

示例一

[root@web imx_web3q]# help source

source: source filename [arguments]

Read and execute commands from FILENAME and return.  The pathnames

in $PATH are used to find the directory containing FILENAME.  If any

ARGUMENTS are supplied, they become the positional parameters when

FILENAME is executed.

[root@web imx_web3q]#

示例二 修改/etc/profile之后使之立即生效

[root@web imx_web3q]# vi /etc/profile

[root@web imx_web3q]# . /etc/profile

[root@web imx_web3q]#

示例三 在PATH中搜索命令

man source中说道:如果filename不包含斜杠(/),那么从PATH环境变量指定的那些路径搜索filename,这个文件不必是可执行 的。(If filename does not contain a slash, file names in  PATH  are used  to  find the directory containing filename.  The file searched for in PATH need

not be executable.)如果在PATH中找不到指定文件,当bash不是posix模式时,将在当前目录下搜索该文件。(When bash is not in posix mode, the current directory is searched if no file is found in PATH.)如果shopt里的sourcepath关闭,则不在PATH中搜索指定文件。(If  the sourcepath  option  to  the shopt builtin command

is turned off, the PATH is not searched.)

[root@new55 ~]# shopt

cdable_vars     off

cdspell         off

checkhash       off

checkwinsize    on

cmdhist         on

dotglob         off

execfail        off

expand_aliases  on

extdebug        off

extglob         on

extquote        on

failglob        off

force_fignore   on

gnu_errfmt      off

histappend      off

histreedit      off

histverify      off

hostcomplete    off

huponexit       off

interactive_comments    on

lithist         off

login_shell     on

mailwarn        off

no_empty_cmd_completion off

nocaseglob      off

nocasematch     off

nullglob        off

progcomp        on

promptvars      on

restricted_shell        off

shift_verbose   off

sourcepath      on

xpg_echo        off

[root@new55 ~]# echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/opt/apache/apache-ant-1.8.1/bin:/usr/java/jdk1.6.0_21/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin :/root/bin

[root@new55 ~]# ls -l /usr/bin/sj.sh

-rwxr-xr-x 1 root root 453 09-15 04:46 /usr/bin/sj.sh

[root@new55 ~]# cat /usr/bin/sj.sh

#!/bin/sh

listpids()

{

#ps -ef|grep java|grep -v grep

COLUMNS=1024 ps h -C java -f

}

showpids()

{

while read u p pp t1 t2 tty cpu cmd;

do

ls -l /proc/$p/cwd

echo $p $cwd $cmd

echo

done

}

showpidof()

{

while read u p pp t1 t2 tty cpu cmd;

do

if ls -l /proc/$p/cwd | grep -q $1; then

echo $p

elif echo $cmd | grep -q $1; then

echo $p

fi

done

}

if [ "$1" ]; then

listpids | showpidof $1 | xargs

else

listpids | showpids

fi

[root@new55 ~]# sj.sh

lrwxrwxrwx 1 root root 0 12-09 19:11 /proc/6832/cwd -> /root/work55/cms_server

6832 0:02 /usr/java/jdk1.6.0_21/jre/bin/java -classpath /opt/apache/apache-ant-1.8.1/lib/ant-launcher.jar -Dant.home=/opt/apache/apache-ant-1.8.1 -Dant.library.dir=/opt/apache/apache-ant-1.8.1/lib org.apache.tools.ant.launch.Launcher -cp start

[root@new55 ~]# listpids

-bash: listpids: command not found

[root@new55 ~]# chmod -x /usr/bin/sj.sh

[root@new55 ~]# source sj.sh

lrwxrwxrwx 1 root root 0 12-09 19:11 /proc/6832/cwd -> /root/work55/cms_server

6832 0:02 /usr/java/jdk1.6.0_21/jre/bin/java -classpath /opt/apache/apache-ant-1.8.1/lib/ant-launcher.jar -Dant.home=/opt/apache/apache-ant-1.8.1 -Dant.library.dir=/opt/apache/apache-ant-1.8.1/lib org.apache.tools.ant.launch.Launcher -cp start

[root@new55 ~]# listpids

root      6832  5994  0 19:11 pts/2    Sl+    0:02 /usr/java/jdk1.6.0_21/jre/bin/java -classpath /opt/apache/apache-ant-1.8.1/lib/ant-launcher.jar -Dant.home=/opt/apache/apache-ant-1.8.1 -Dant.library.dir=/opt/apache/apache-ant-1.8.1/lib org.apache.tools.ant.launch.Launcher

-cp  start

[root@new55 ~]# chmod +x /usr/bin/sj.sh

root@new55 ~]#

示例四 位置参数

If any arguments are supplied, they become the positional parameters when  filename  is  executed.   Otherwise  the positional  parameters are unchanged.

[root@new55 ~]# cat >source.sh

XYZ=123

echo "args: $@"

Ctrl+D

[root@new55 ~]# ./source.sh

-bash: ./source.sh: 权限不够

[root@new55 ~]# . source.sh

args:

[root@new55 ~]# echo $XYZ

123

[root@new55 ~]# . source.sh hello world

args: hello world

[root@new55 ~]#

示例五 退出码

The return status is the status of the last command exited within the script (0 if no commands are executed), and false if filename is not found or cannot be read.

[root@new55 ~]# ls x.sh

ls: x.sh: 没有那个文件或目录

[root@new55 ~]# . ./x.sh

-bash: ./x.sh: 没有那个文件或目录

[root@new55 ~]# echo $?

1

[root@new55 ~]# cat >x.sh

return 13

Ctrl+D

[root@new55 ~]# . ./x.sh

[root@new55 ~]# echo $?

13

[root@new55 ~]#

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐