ubuntu执行.sh文件几种方式区别

script的执行方式区别


前言

不同的script执行方式会造成不一样的结果,尤其对bash的环境影响很大,脚本的执行方式有大概以下几种方式。

首先写一个简单的test.sh文件:

#!/bin/bash

read -p "Please input your first name:" firstname
read -p "Please input your last name:" lastname
echo -e "\nYour full name is: $firstname $lastname"

使用sh test.sh执行

使用 sh test.sh 来执行script文件,该方法标明使用 sh 这种shell来执行test.sh文件,sh已经是一种被bash替代的shell,尽管我们在test.sh中声明使用 #!/bin/bash 来执行我们的文件,但此时使用sh而不是bash,则#!/bin/bash 已不起作用。


使用bash test.sh 执行

该方法其实与 sh test.sh 的原理一样,只是使用了 /bin/bash 该种shell来执行我们的脚本文件。

所以,其实使用 dash test.sh' 也是可以的,只是取决于自己想使用那种shell来执行脚本,但sh、bash、dash三者有些许差别,对于部分关键字如 let,bash支持,而sh和dash并不支持,对于部分关键字则选择使用bash。


使用点 . 执行

该种方式使用之前必须为文件添加执行的权限:

$ chmod +x test.sh

添加完执行权限之后,便可以使用 ./test.sh 来执行脚本,该方式与 bash test.sh 是一样的 ,默认使用 bin/bash 来执行我们的脚本。

只有该种执行方式需要对文件添加执行权限,其他方式并不需要。


使用source执行

使用source则也能够直接执行我们的脚本:

source test.sh

区别

当我们使用 sh test.shbash test.sh./test.sh 执行脚本的时候,该test.sh运行脚本都会使用一个新的shell环境来执行脚本内的命令,也就是说,使用这3种方式时,其实script是在子进程的shell内执行,当子进程完成后,子进程内的各项变量和操作将会结束而不会传回到父进程中

无法理解??看下面例子:

[root@ubuntu] # bash test.sh
Please input your first name: yao    <==输入firstname
Please input your last name: pentonBin    <==输入lastname

Your full name is: yao pentonBin
[root@ubuntu] # echo $firstname
             <==这里没有输出

如果使用source方法来执行脚本呢?

[root@ubuntu] # source test.sh
Please input your first name: yao    <==输入firstname
Please input your last name: pentonBin    <==输入lastname

Your full name is: yao pentonBin
[root@ubuntu] # echo $firstname
yao       <==这里输出firstname

也就是说,source方法执行脚本是在父进程中执行的,test.sh的各项操作都会在原本的shell内生效,这也是为什么不注销系统而要让某些写入~/.bashrc的设置生效时,需要使用 source ~/.bashrc 而不能使用 bash ~/.bashrc

### Ubuntu 18.04 Shell Script 使用方法与实例 #### 创建Shell脚本文件 为了创建一个新的Shell脚本,在终端输入以下命令来新建并编辑一个`.sh`文件: ```bash nano myscript.sh ``` 确保给定的文件名具有`.sh`扩展名以便识别为Shell脚本。 #### 编写简单的Shell脚本 下面是一个简单例子,用于打印“Hello, World!”到控制台: ```bash #!/bin/bash echo "Hello, World!" ``` 此脚本的第一行指定了解释器路径,这里是Bash。第二行执行了一个简单的命令,即向标准输出发送一条消息[^2]。 #### 设置可执行权限 保存上述内容之后,通过更改文件属性使该脚本成为可执行程序: ```bash chmod +x myscript.sh ``` 这一步非常重要;否则Linux系统不会允许运行这个脚本作为命令。 #### 执行Shell脚本几种方式可以运行编写的Shell脚本。最常见的方式是在命令提示符下键入其名称加上前缀`.`或`./`: ```bash ./myscript.sh ``` 另一种方法是将其绝对路径提供给 Bash 解释器本身: ```bash bash /full/path/to/myscript.sh ``` #### 复杂的例子:安装NVIDIA驱动程序 对于更复杂的任务,比如按照特定版本号安装 NVIDIA 驱动程序,可以通过编写如下所示的一个较为完整的Shell脚本来实现自动化操作: ```bash #!/bin/bash sudo apt-add-repository multiverse sudo apt-get update sudo apt-get install nvidia-driver-470 update-initramfs: Generating /boot/initrd.img-5.4.0-81-generic I: The initramfs will attempt to resume from /dev/nvme1n1p2 I: (UUID=3d8c08e6-e615-4e5d-94ef-ca7744ce78c1) I: Set the RESUME variable to override this. ``` 请注意,实际部署此类涉及系统配置变更的任务时应当谨慎行事,并充分理解每条指令的作用以及可能带来的影响[^1]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值