shell脚本export变量只限脚本内么_shell脚本调用oracle存储过程

shell脚本export变量只限脚本内么_shell脚本调用oracle存储过程shell脚本中export命令未生效,原因详解问题:我有一个脚本,脚本中有如下一条语句exportfdu=“dufan”用sh运行脚本后,在当前shell利用命令env查看环境变量,但是却没有fdu变量,难道是因为我的export语句没有生效?解决结果:脚本中的export一定是生效的利用source执行脚本,在当前shell即可查看到fdu环境变量。这个问题涉及了三个知识点:变量(环境变量、自定义变量)父进程与子进程脚本的执行方式什么是变量?变量的分类?1.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

shell脚本中export命令未生效,原因详解

问题:我有一个脚本,脚本中有如下一条语句

export fdu=“dufan”

sh运行脚本后,在当前shell利用命令env查看环境变量,但是却没有fdu变量,难道是因为我的export语句没有生效?

解决结果

  1. 脚本中的export一定是生效的
  2. 利用source执行脚本,在当前shell即可查看到fdu环境变量。


这个问题涉及了三个知识点:

  • 变量(环境变量、自定义变量)
  • 父进程与子进程
  • 脚本的执行方式

什么是变量?变量的分类?

1. 环境变量

全局变量,可被子进程继承

2. 自定义变量

局部变量,不可被子进程继承

环境变量与自定变量的区别?

  • 环境变量与自定义变量的区别:该变量是否会被子进程所继续引用

    拓展

    • 什么是父进程?什么是子进程?

    • 子进程仅继承父进程的环境变量,子进程不会继承父进程的自定义变量

      可使用如下命令将自定义变量转换为环境变量:

      export 变量名称

    • 为什么父进程的环境变量数据可被子进程引用?

      1. 启动一个shell,os会分配一个记忆块给shell使用,此内存内的变量可让子进程取用
      2. 若父进程利用export功能,可以让自定义变量的内容写到上述的记忆块中
      3. 当加载另一个shell(子进程),子shell可以将父shell的环境变量所在的记忆块导入自己的环境变量块中

变量显示命令

  • 显示环境变量
    1. env
    2. export
  • 显示环境变量+自定义变量
    1. set

source、sh、./ 命令执行的区别

​ 用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序。运行shell脚本程序时,系统将创建一个子shell。此时,系统中将有两个shell,一个是登录时系统启动的shell,另一个是系统为运行脚本程序创建的shell。当一个脚本程序运行完毕,它的脚本shell将终止,可以返回到执行该脚本之前的shell。从这种意义上来说,用户可以有许多 shell,每个shell都是由某个shell(称为父shell)派生的。
​ 在子 shell中定义的变量只在该子shell内有效。如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他shell(子shell)中被使用,可以使用export命令对已定义的变量进行输出。 export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。

​ source某脚本时,是在当前shell中执行,并未创建子进程(子shell)。

​ sh某脚本或./某脚本时,会创建子shell,在子进程中进行脚本的执行。

​ ./要求该用户对执行的脚本有执行权限,sh无要求。



知道上述几个知识点后,可以用一段话解释原因

​ export命令可以使自定义变量转换为环境变量,环境变量(全局变量)可被子进程继承,自定义变量(局部变量)不可以被子进程继承。sh执行脚本时,linux将创建子shell进程进行脚本执行,脚本执行结束后,在当前shell(父进程)必然无法查看已经消失的子进程的环境变量。而soure执行脚本,linux将在当前shell进程进行脚本执行,脚本执行结束后,环境变量生效。



实践验证

  • export功能验证

    [root@vm fdu]# set | grep fdu_val
    fdu_val=haha
    [root@vm fdu]# env | grep fdu_val
    [root@vm fdu]# 
    [root@vm fdu]# export fdu_val
    [root@vm fdu]# 
    [root@vm fdu]# env | grep fdu_val
    fdu_val=haha
    [root@vm fdu]# set | grep fdu_val
    fdu_val=haha
    [root@vm fdu]# 
    

    可以看到export命令将fdu_val自定义变量转换为了环境变量

  • 脚本执行方式对export的影响验证

    fdu_test.sh脚本如下:

    #####################################################
    ###export命令测试
    #环境变量
    export fdu_env_val="env_val"
    
    • source执行脚本
    [root@vm fdu]# env | grep fdu_env_val
    fdu_env_val=env_val
    [root@vm fdu]# set | grep fdu_env_val
    fdu_env_val=env_val
    [root@vm fdu]# /bin/bash
    [root@vm fdu]# env | grep fdu_env_val
    fdu_env_val=env_val
    [root@vm fdu]# set | grep fdu_env_val
    fdu_env_val=env_val
    [root@vm fdu]#```
    

    可以看到:source执行脚本,当前shell生效,子shell同样生效

    • sh执行脚本
    [root@vm fdu]# env | grep fdu_env_val
    [root@vm fdu]# set | grep fdu_env_val
    [root@vm fdu]# 
    [root@vm fdu]# /bin/bash
    [root@vm fdu]# export fdu_env_val="heihei"
    [root@vm fdu]# env | grep fdu_env_val
    fdu_env_val=heihei
    [root@vm fdu]# set | grep fdu_env_val
    fdu_env_val=heihei
    [root@vm fdu]# exit
    exit
    [root@vm fdu]# set | grep fdu_env_val
    [root@vm fdu]# env | grep fdu_env_val
    [root@vm fdu]# 
    

    可以看到:sh执行脚本,当前shell无效,/bin/bash进入子shell模拟sh执行脚本,发现子shell生效,退出子shell,回到父shell(当前shell),环境变量设置未生效

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/196559.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • PhpSpreadsheet_php标准输入流stdin

    PhpSpreadsheet_php标准输入流stdin实例化对象composer导包”phpoffice/phpspreadsheet”:”^1.11″,$spreadsheet=newSpreadsheet();$sheet=$spreadsheet->getActiveSheet();合并单元格$sheet->mergeCells(‘A1:J1’);设置单元格的内容$spreadsheet->getActiveSheet()->setCellValue(‘A2′,’序号’)-&

  • ASP.NET验证控件之RangeValidator「建议收藏」

    ASP.NET验证控件之RangeValidator「建议收藏」RangeValidator控件用于检测用户输入的值是否介于两个值之间。可以对不同类型的值进行比较,比如数字、日期以及字符。我们一般会用来验证输入的年龄或者考试的分数等。下面我们一块看看RangeValidator的属性:属性描述 BackColor 背景颜色 ControlToValidate

  • dsp McBSP模块「建议收藏」

    dsp McBSP模块「建议收藏」McBSP,是多通道缓冲串行接口。在DSP嵌入式系统中,常常用来连接音频编码解码芯片,串行AD/DA器件等。具有如下特性:全双工;两个数据缓冲寄存器;独立的发送和接收帧和时钟;多达129通道的发送和接收等等。McBSP结构图如下:首先对引脚进行介绍:CLKR:接收时钟CLKX:发送时钟CLKS:外部时钟源DR“:串行数据接收DX:串行数据发送

  • 十字路口的交通灯控制系统_十字路口红绿灯控制程序设计

    十字路口的交通灯控制系统_十字路口红绿灯控制程序设计十字路口交通信号灯控制系统主要任务开发平台设计思路主要任务设计一个用于十字路口的交通灯控制器,能显示十字路口东西、南北两个方向的红、黄、绿的指示状态;具有倒计时的功能,用两组数码管作为东西和南北方向的倒计时显示,**主干道直行(绿灯)60秒后,左转(绿灯)40秒;支干道直行(绿灯)45秒后,左转(绿灯)30秒,**在每次绿灯变成红灯的转换过程中,要亮黄灯5秒作为过渡。黄灯每秒闪亮一次。只考虑直行和左转车辆控制信号灯,右转车辆不受信号灯控制,南北向车辆与东西向车辆交替方向,同方向等待车辆应先方向直

  • WLAN与WIFI的区别[通俗易懂]

    WLAN与WIFI的区别[通俗易懂]WLAN与WIFI的区别WLAN简介:WLAN全称为:WirelessLocalAreaNetworks,中文解释为:无线局域网络,是一种利用射频(RadioFrequencyRF)技术进行据传输的系统,该技术的出现绝不是用来取代有线局域网络,而是用来弥补有线局域网络之不足,以达到网络延伸之目的,使得无线局域网络能利用简单的存取架构让用户透过它,实现无网线、无距离限制的通畅网络。

  • httpclient4下载图片 java实现[通俗易懂]

    httpclient4下载图片 java实现[通俗易懂]有时候需要从网上抓取一下图片jpg、png等,也可以抓取zip等,这样就需要写程序才能达到想要的效果,下面是用httpclient4做一个工具类,非常的好用packagecom.wamei.tool;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.FileOutputStream;

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号