Linux_source命令

via: http://blog.csdn.net/gui694278452/article/details/8870469

via: http://blog.csdn.net/simon_dong618/article/details/1581132

用途说明

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 ~]#

-------------------------------------------------------------------------------

source命令也称为“点命令”,也就是一个点符号(.)。source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
用法:
source filename 或 . filename
source命令除了上述的用途之外,还有一个另外一个用途。在对编译系统核心时常常需要输入一长串的命令,如:
make mrproper
make menuconfig
make dep
make clean
make bzImage
…………
如果把这些命令做成一个文件,让它自动顺序执行,对于需要多次反复编译系统核心的用户来说会很方便,而用source命令就可以做到这一点,它的作用就是把一个文件的内容当成shell来执行,先在linux的源代码目录下(如/usr/src/linux-2.4.20)建立一个文件,如make_command,在其中输入一下内容:
make mrproper &&
make menuconfig &&
make dep &&
make clean &&
make bzImage &&
make modules &&
make modules_install &&
cp arch/i386/boot/bzImage /boot/vmlinuz_new &&
cp System.map /boot &&
vi /etc/lilo.conf &&
lilo -v
文件建立好之后,每次编译核心的时候,只需要在/usr/src/linux-2.4.20下输入: source make_command
即可,如果你用的不是lilo来引导系统,可以把最后两行去掉,配置自己的引导程序来引导内核。
顺便补充一点,&&命令表示顺序执行由它连接的命令,但是只有它之前的命令成功执行完成了之后才可以继续执行它后面的命令。

猜你喜欢

转载自mikzhang.iteye.com/blog/2050150