资讯动态

Linux:点命令source

发布时间:2026/10/27 9:25:24 来源:尧图企业网站定制
相关阅读Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482source命令用于读取一个文件的内容并在当前Shell环境包括交互式Shell或是非交互式Shell执行里面的命令。它被称为点命令是因为命令名source也可以替换为一个点“.”。下面是该命令的语法。用法 . filename [arguments] source filename [arguments] 参数 filename 指定要读取并执行命令的文件名一般是一个文本文件。 arguments 指定源文件执行时的位置参数。一般情况下如果在交互式Shell中使用bash命令执行一个脚本会创建一个Bash子进程。在某些情况下这导致问题比如在脚本中使用export命令导出一个变量时它会成为该Bash子进程的环境变量而对父进程Bash没有影响这类似于在Bash中直接使用bash命令创建一个Bash子进程。[***EDA ~]$ bash #在当前进程运行另一个bash子进程 [***EDA ~]$ export aaa1 #在子进程创建环境变量 [***EDA ~]$ export ***** declare -x XDG_MENU_PREFIXgnome- declare -x XDG_RUNTIME_DIR/run/user/1000 declare -x XDG_SEATseat0 declare -x XDG_SESSION_DESKTOPgnome-classic declare -x XDG_SESSION_ID1 declare -x XDG_SESSION_TYPEx11 declare -x XDG_VTNR1 declare -x XMODIFIERSimibus declare -x aaa1 #环境变量存在于子进程 [***EDA ~]$ exit #退出子进程 exit [***EDA ~]$ export ***** declare -x XDG_MENU_PREFIXgnome- declare -x XDG_RUNTIME_DIR/run/user/1000 declare -x XDG_SEATseat0 declare -x XDG_SESSION_DESKTOPgnome-classic declare -x XDG_SESSION_ID1 declare -x XDG_SESSION_TYPEx11 declare -x XDG_VTNR1 declare -x XMODIFIERSimibus #环境变量不存在于父进程 scripts文件 #!/bin/bash export bbb1 [***EDA ~]$ bash scripts [***EDA ~]$ export ***** declare -x XDG_MENU_PREFIXgnome- declare -x XDG_RUNTIME_DIR/run/user/1000 declare -x XDG_SEATseat0 declare -x XDG_SESSION_DESKTOPgnome-classic declare -x XDG_SESSION_ID1 declare -x XDG_SESSION_TYPEx11 declare -x XDG_VTNR1 declare -x XMODIFIERSimibus #环境变量不存在于父进程在上例中如果使用source命令执行该bash脚本则会读取脚本内的内容对上例而言是export bbb1并在当前Shell环境对上例是交互式Shell执行就像是直接在交互式Shell中执行export bbb1一样因此可以成功导入环境变量如下所示。scripts文件 #!/bin/bash export bbb1 [***EDA ~]$ source ./scripts [***EDA ~]$ export ***** declare -x XDG_MENU_PREFIXgnome- declare -x XDG_RUNTIME_DIR/run/user/1000 declare -x XDG_SEATseat0 declare -x XDG_SESSION_DESKTOPgnome-classic declare -x XDG_SESSION_ID1 declare -x XDG_SESSION_TYPEx11 declare -x XDG_VTNR1 declare -x XMODIFIERSimibus declare -x bbb1 #环境变量成功创建source命令常用于立即将更改后的.bashrc配置文件应用于当前环境而无需新建Bash。Linux设置别名命令alias一文中曾经提到在非交互式的Bash脚本中别名替换默认被关闭了除非在脚本中使用shopt命令开启expand_aliases选项。如果此时使用source命令执行脚本则别名替换可以正常进行因为这相当于执行环境是交互式Shell。scripts文件 #!/bin/bash #无需启用别名展开 #shopt -s expand_aliases alias ttecho 111 # 定义别名 tt # 使用别名 [***EDA ~]$ source ./scripts 111下面是一些source命令的规则。如果pathname不包含斜杠(/)Bash将首先在环境变量PATH列出的目录中查找该文件这与很多其他命令不同一般情况下一个不含/的文件名相当于使用相对路径即./文件名。[***EDA ~]$ source script #直接使用文件名注意此处文件名是scripts bash: source: /usr/bin/script: cannot execute binary file #在PATH中查找到了一个二进制文件source命令执行失败如果使用shopt命令关闭sourcepath选项则source不会搜索PATH。[***EDA ~]$ shopt -u sourcepath [***EDA ~]$ source script #直接使用文件名注意此处文件名是scripts bash: scripts: No such file or directory #在当前目录无法找到文件scripts当Bash不处于POSIX模式时如果在PATH中找不到文件则还会在当前目录中搜索此时相当于./文件名。[***EDA ~]$ set -o | grep posix #查看是否处在posix模式 posix off [***EDA ~]$ source scripts #直接使用文件名最后在当前目录查找到了scripts脚本文件不必须是可执行的文件它可以是一个简单的文本文件而不具有可执行的属性。如果提供了任何arguments它们将作为位置参数($0, $1...)传递该文件内的命令需要注意的是这里有一点特殊传递给source的位置参数不会改变当前Shell环境的位置参数这就像是这些位置参数在执行文件内部的命令时生效这是对当前环境位置参数的保护。另外需要说明的是如果不传递参数source执行的文件依然可以访问到当前环境的位置参数。script文件 echo $1 echo $2 [***EDA ~]$ source ./script Hello World #传递参数 Hello #可以访问$1这是source传递的 World #可以访问$2这是source传递的 [***EDA ~]$ echo $1 $2 (nothing output) #source传递的位置参数不会影响当前进程 [***EDA ~]$ set -- Hello World #设置位置参数 [***EDA ~]$ source ./script #不传递参数 Hello #可以访问$1这是当前环境的 World #可以访问$2这是当前环境的 [***EDA ~]$ echo $1 $2 Hello Worldsource命令的返回值是脚本中最后一个退出的命令的状态如果没有执行任何命令则直接返回 0如果找不到或无法读取文件则返回false。[***EDA ~]$ source ss bash: source: /usr/sbin/ss: cannot execute binary file [***EDA ~]$ echo $? 126 [***EDA ~]$ source ./script Hello World [***EDA ~]$ echo $? 0

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑