当前位置:首页 » 《我的小黑屋》 » 正文

Linux:点命令source

2 人参与  2024年05月15日 13:55  分类 : 《我的小黑屋》  评论

点击全文阅读


相关阅读

Linuxicon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12234591.html?spm=1001.2014.3001.5482


         source命令用于读取一个文件的内容并在当前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 aaa=1    #在子进程创建环境变量[***@EDA ~]$ export        *****declare -x XDG_MENU_PREFIX="gnome-"declare -x XDG_RUNTIME_DIR="/run/user/1000"declare -x XDG_SEAT="seat0"declare -x XDG_SESSION_DESKTOP="gnome-classic"declare -x XDG_SESSION_ID="1"declare -x XDG_SESSION_TYPE="x11"declare -x XDG_VTNR="1"declare -x XMODIFIERS="@im=ibus"declare -x aaa="1"            #环境变量存在于子进程[***@EDA ~]$ exit             #退出子进程exit[***@EDA ~]$ export        *****declare -x XDG_MENU_PREFIX="gnome-"declare -x XDG_RUNTIME_DIR="/run/user/1000"declare -x XDG_SEAT="seat0"declare -x XDG_SESSION_DESKTOP="gnome-classic"declare -x XDG_SESSION_ID="1"declare -x XDG_SESSION_TYPE="x11"declare -x XDG_VTNR="1"declare -x XMODIFIERS="@im=ibus"#环境变量不存在于父进程scripts文件#!/bin/bashexport bbb=1[***@EDA ~]$ bash scripts[***@EDA ~]$ export*****declare -x XDG_MENU_PREFIX="gnome-"declare -x XDG_RUNTIME_DIR="/run/user/1000"declare -x XDG_SEAT="seat0"declare -x XDG_SESSION_DESKTOP="gnome-classic"declare -x XDG_SESSION_ID="1"declare -x XDG_SESSION_TYPE="x11"declare -x XDG_VTNR="1"declare -x XMODIFIERS="@im=ibus"#环境变量不存在于父进程

        在上例中如果使用source命令执行该bash脚本,则会读取脚本内的内容(对上例而言是export bbb=1)并在当前Shell环境(对上例是交互式Shell)执行,就像是直接在交互式Shell中执行export bbb=1一样,因此可以成功导入环境变量,如下所示。

scripts文件#!/bin/bashexport bbb=1[***@EDA ~]$ source ./scripts[***@EDA ~]$ export*****declare -x XDG_MENU_PREFIX="gnome-"declare -x XDG_RUNTIME_DIR="/run/user/1000"declare -x XDG_SEAT="seat0"declare -x XDG_SESSION_DESKTOP="gnome-classic"declare -x XDG_SESSION_ID="1"declare -x XDG_SESSION_TYPE="x11"declare -x XDG_VTNR="1"declare -x XMODIFIERS="@im=ibus"declare -x bbb="1"                #环境变量成功创建

        source命令常用于立即将更改后的.bashrc配置文件应用于当前环境,而无需新建Bash。 

        Linux:设置别名命令alias一文中曾经提到,在非交互式的Bash脚本中,别名替换默认被关闭了,除非在脚本中使用shopt命令开启expand_aliases选项。如果此时使用source命令执行脚本,则别名替换可以正常进行,因为这相当于执行环境是交互式Shell。

scripts文件#!/bin/bash #无需启用别名展开#shopt -s expand_aliasesalias tt='echo 111' # 定义别名tt # 使用别名 [***@EDA ~]$ source ./scripts111

        下面是一些source命令的规则。

        如果pathname不包含斜杠(/),Bash将首先在环境变量PATH列出的目录中查找该文件,这与很多其他命令不同,一般情况下一个不含/的文件名相当于使用相对路径,即./文件名。 

[***@EDA ~]$ source script   #直接使用文件名,注意此处文件名是scriptsbash: source: /usr/bin/script: cannot execute binary file  #在PATH中查找到了一个二进制文件,source命令执行失败

        如果使用shopt命令关闭sourcepath选项,则source不会搜索PATH。 

[***@EDA ~]$ shopt -u sourcepath[***@EDA ~]$ source script   #直接使用文件名,注意此处文件名是scriptsbash: 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 $1echo $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 $2Hello World

        source命令的返回值是脚本中最后一个退出的命令的状态(如果没有执行任何命令,则直接返回 0),如果找不到或无法读取文件,则返回false。 

[***@EDA ~]$ source ssbash: source: /usr/sbin/ss: cannot execute binary file[***@EDA ~]$ echo $?126[***@EDA ~]$ source ./scriptHelloWorld[***@EDA ~]$ echo $?0


点击全文阅读


本文链接:http://zhangshiyu.com/post/108964.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 冬季宜密雪:结局+番外精编之作(季雯,江随筝)完整章节列表_笔趣阁
  • 完结文末日重生我囤十亿物资杀穿尸潮列表_完结文末日重生我囤十亿物资杀穿尸潮(林野苏晴)
  • 小说江诗云路明哲小说已更新+番外篇章(年少的爱终将散去)纯净阅读
  • 真千金伪装大学生在自家公司实习让狗爬后一口气看完_宋氏小林小姑娘高分神作_小说后续在线阅读_无删减免费完结_
  • 萧逸尘,楚璃,叶紫嫣爱恨决绝,此生不见番外(爱恨决绝,此生不见)TXT+后续+结局在线阅读
  • 假千金要交换人生?我抱着空间做首富爽文_苏木青赵景城虐心反转_小说后续在线阅读_无删减免费完结_
  • 温时雨谢远之续集(清风难渡无缘人)全本完整免费版_起点章节+后续(温时雨谢远之)
  • 订婚两个月后,未婚夫要摆脱包办婚姻精心打造_肖明宝宝宾客故事会_小说后续在线阅读_无删减免费完结_
  • 霍景琛,苏晚,林深昔年请深如海,终不敌薄凉附加(霍景琛,苏晚,林深)(昔年请深如海,终不敌薄凉)全本浏览阅读连载中
  • 新章速递汤安甯,白子奕,汤贝贝是什么小说(结婚十年,回归家庭的老婆在外有二胎了)完本阅读无广告(结婚十年,回归家庭的老婆在外有二胎了)
  • 娇牛马导师偷我论文99篇成功升博导,我让他牢底坐穿精校文本_周老师师姐师兄爽文_小说后续在线阅读_无删减免费完结_
  • 独家顾宇,罗薇:结局+番外精编之作(资助生装阔气,我可不参加)电子书畅享阅读

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1