Linux set 命令的使用方法

news2024/10/6 16:24:17

 

Linux set 命令的使用方法

set 语句是内置的 shell 命令,可以显示并设置 shell 和 Linux 的环境变量。在这篇文章中,我们将尝试使用 set 命令,并且进行一些简单的剖析。

预备工作

请登录您的终端,或者打开虚拟机并且连接,或者进入 Git Bash (不推荐)。

演示系统为 CentOS7。

set 命令语法

一般我们使用 set 命令方式为:

set [options] [arguments]

可选 []

当我们的参数中有 [] 时代表这个参数可选,如果不输入也不会有任何问题,比如我们直接输入 set :

set

会打印出当前 shell 的所有环境变量与函数。

options 设置命令

在 set 命令第一个参数是 Bash shell 环境中设置或取消设置的标志,可以定义后面各种 shell 的运行方式,比如打印额外的信息等等。

  • - 使用减号启用某些设置
  • + 使用加号关闭某些设置

arguments 参数

[arguments] 是位置参数,与一下参数一起按顺序进行赋值:

  • $1
  • $2
  • $3
  • ……
  • $n

不指定任何选项或者参数会导致该命令打印所有shell变量

set 的返回值

  • 0

        标志着命令成功执行

  • 1

        无效的参数,导致执行失败

  • 2

        缺少某些参数,导致执行失败

set options 设置命令清单

set 在进行 options 设置命令时,可以使用两种方法来设定:

  • -options

                简单好用而且可以直接叠加如

                -ab

  • -o Flag

                可以更好理解什么意思

Linux set 命令的使用方法

Options

-o Flag

描述

-a

-o allexport

将所有创建或修改的变量或函数标记为导出。

-b

-o notify

后台作业终止时提醒用户。

-e

-o errexit

指示shell在命令失败时退出,例如,如果它输出非零退出状态。

-f

-o noglob

禁用文件名生成(globbing)

-h

-o hashall

定义函数时,定位并保存函数命令。这-h默认情况下,选项处于启用状态。

-k

-o keyword

将命令的所有赋值参数放在环境中,而不仅仅是命令名前面的那些参数。

-n

-o noexec

读取命令,但不执行它们。

-m

-o monitor

任务完成时显示消息。

-p

-o privileged

禁用$ENV文件处理和shell函数导入。这-p当真实用户id和有效用户id不匹配时,默认情况下启用该选项。关闭它会将有效的uidgid设置为真实的uidgid

-t

-o onecmd

读取一个命令,然后退出。

-u

-o nounset

替换时,将未设置或未定义的变量视为错误(在参数扩展期间)。不适用于通配符等特殊参数*或者@.

-v

-o verbose

读取shell输入行时打印出来。

-x

-o xtrace

在执行过程中打印出命令参数。

-B

-o braceexpand

执行壳支撑扩展。

-C

-o noclobber

通过输出重定向防止覆盖现有的常规文件。默认情况下,Bash允许重定向输出覆盖现有文件。

-E

-o errtrace

导致外壳函数继承ERR陷阱。

-H

-o histexpand

启用样式历史替换。当壳是交互式的时,默认情况下该选项是打开的。

-P

-o physical

执行命令时防止符号链接跟随。

-T

-o functrace

导致外壳函数继承调试陷阱。

--

不适用的

将剩余的参数分配给位置参数。如果没有剩余的参数,则取消设置位置参数。

-

不适用的

将任何剩余的参数赋给位置参数。关闭-x-v选项。

不适用的

-o emacs

使用emacs风格的行编辑界面。

不适用的

-o history

启用命令历史。

不适用的

-o ignoreeof

shell在读取文件结尾时不会退出。

不适用的

-o interactive-comments

允许在交互式命令中添加注释。

不适用的

-o nolog

不在历史文件中记录函数定义。

不适用的

-o pipefail

管道的返回值是在退出时具有非零状态的最后一个命令的状态。如果没有命令在退出时具有非零状态,则该值为零。

不适用的

-o posix

当默认操作不同于Posix标准时,使Bash符合标准。

不适用的

-o vi

使用类似于的行编辑界面vi.

set 部分命令用法实例

脚本调试 -x

当我们想进行某些脚本调试时,可以使用 -x / -o xtrace

set -x
x=10
while [ $x -gt 0 ]; do
    x=$[ $x-1 ]
    echo $x
    sleep 1
done

如上图所示,我们可以很清楚看到执行的真实命令的过程,方便我们进行各种 shell 程序的排错。

变量导出 -a

如果需要自动导出可以使用 -a / -o allexport。这样可以导出变量或者函数,允许其他的 them 和脚本使用它们。

#! /bin/bash
# Copyright◎2022, Maggot. All rights reserved.
#
# This program is print the "Hello the world" to screen.
# Date: 2022-11-20
# Auth: huangyichun
# Version: 0.1
one=1
two=2
function myecho {
    echo A
    echo B
}
myecho
echo $one $two
/bin/bash
exit 0

以上的代码块有误,需要后期修订!todo

生产环境示例

使用场景,当我们需要将部分变量进行导出时,希望更上一层的 shell 也能使用可以使用他。比如在 ${SPARK_HOME}/bin/load-spreak-env.sh 中有这样几句:

if [ -f "${user_conf_dir}/spark-env.sh" ]; then
  # Promote all variable declarations to environment (exported) variables
  set -a
  . "${user_conf_dir}/spark-env.sh"
  set +a
fi

就是在运行 spark-env.sh 时,让其中的变量可以变为当前的环境变量。

命令错误exit -e

在我们脚本中,如果遇到有返回值不为0时,一般会继续运行后面的程序,如:

#! /bin/bash
# Copyright◎2022, Maggot. All rights reserved.
#
# This program is print the "Hello the world" to screen.
# Date: 2022-11-21
# Auth: huangyichun
# Version: 0.1
cat nonexistingfile.nef
echo "The end"

如果我们直接进行运行的话,cat命令的返回值其实不为0,已经产生报错,但是仍运行了接下来的 echo 命令。

 

但如果加上了 -e 命令:

#! /bin/bash
# Copyright◎2022, Maggot. All rights reserved.
#
# This program is print the "Hello the world" to screen.
# Date: 2022-11-21
# Auth: huangyichun
# Version: 0.1
set -e
cat nonexistingfile.nef
echo "The end"

在 cat 处报错了,就不会继续运行下去了。

 

结果输出 >, >&

我们上述的文件运行文件结果都是直接打印在终端中,但很多时候我们是需要运行后的结果,并且保存到其他文件中。这时候我们可以使用 > 进行结果重定向。

详细可以参考结果重定向部分。

未定义变量报错 -u

在我们shell脚本中,可能有一些变量未进行定义但仍旧引用了。那么这个变量的值为null,在打印时就打印""。如:

#! /bin/bash
# Copyright◎2022, Maggot. All rights reserved.
#
# This program is print the "Hello the world" to screen.
# Date: 2022-11-21
# Auth: huangyichun
# Version: 0.1

set -u
var1="123"
echo $var1 $var2
echo done

可以看到 var1打印了123,但是var2值不存在,则什么也没打印。

如果需要报错,则需要打开 set -u,并且可以看到连最后一行done都未打印。

设置arguments

上面也提到了,可以两种参数,一种是-o Flag 或者 -X。还有一种是直接设置入参参数。设置入参参数了后可以直接 $N 进行获取。比如:

echo some args : $1 $2 $3 $4
set one two three args
echo some args : $1 $2 $3 $4
echo $*


参数拆分 set -- STRING

在某些字符串需要按照空格进行拆分的时候,可以直接使用 set -- STRING 就能够拆分,当然注意拆分后的变量赋值到入参中。

echo $*
aString="This is a string"
set -- $aString
echo $*
echo $1
echo $2
echo $3
echo $4


任务通知 -ab

-o notify -o allexport

但shell完成时,会在作业终端通知,默认打开。

sleep 3s &
# 等待 3s
# 回车


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

出海淘金TikTok,正确姿势是什么?

提起海外版抖音TikTok,相信大家并不陌生。TikTok在继美国封禁风波之后,虽然在美国市场的扩张受到了一定阻碍,但并不妨碍它的电商领域在英国市场以及东南亚市场混得风生水起。据统计,TikTok目前是Apple App Store上下载次数最多的应…

显示DataFrame中每行(或列)中,每个位置以前出现过的最小值:cummin()函数

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 显示DataFrame中每行(或列)中 每个位置以前出现过的最小值 cummin()函数 选择题 下列说法错误的是? import pandas as pd myDF pd.DataFrame({"A":[5,2,6], "B":[9…

通用后台管理系统前端界面Ⅸ——数据表格渲染及处理+前端分页

1、找 在页面添加table表格&#xff0c;从element-ui官网查找&#xff0c;包括数据一起复制过来&#xff0c;查看显示没有问题后&#xff0c;把tableData清空为空数组。 <template><div><el-table :data"tableData" height"auto" border …

智慧燃气解决方案-最新全套文件

智慧燃气解决方案-最新全套文件一、建设背景二、建设思路三、建设方案四、获取 - 智慧燃气全套最新解决方案合集一、建设背景 近年来城市燃气取得了巨大的发展&#xff0c;我们在享受清洁能源带来方便的同时&#xff0c;也带来了新的问题&#xff1a; ● 居民用户数量的大量增…

想知道如何图片转文字?这几个方法你别错过

工作中我们经常要处理很多含有文字的图片&#xff0c;并且大多数时候我们都需要里面的文字内容&#xff0c;如果你一个一个对照着码出来的话&#xff0c;这是很费时费力的工程&#xff0c;其实我们可以想办法将图片内容转换成文字&#xff0c;然后直接复制就可以使用了。那么你…

第十章:字典树(trie)与并查集

第十章&#xff1a;字典树&#xff08;trie&#xff09;与并查集一、字典树&#xff08;trie&#xff09;引入1、什么是字典树&#xff1f;2、思路分析3、复杂度分析4、模板&#xff08;1&#xff09;问题&#xff1a;&#xff08;2&#xff09;模板&#xff1a;&#xff08;3&…

vscode开发高频、通用插件集合(精选15个)

vscode开发通用插件集合1.Live Serve2. Chinese3. GitLens4. Color Highlight5. Highlight Matching Tag6. any-rule7. Time Master 或 Code Time8. Vetur9. ESLint10. Vue-format11. ENV12. background13. Code Runner14. Local History15. Postcode此文仅是本人多年的一些经验…

在全链路追踪中加入对方法(Method)追踪

在全链路追踪中加入对方法(Method)追踪 全链路追踪主要是在微服务场景下&#xff0c;实现了服务和服务之间的调用链关系。 这次尝试一下在单体应用中&#xff0c;怎么在全链路追踪技术中加入对方法(Method)追踪。 单体应用是用Springboot开放的一个简单CRUD应用&#xff0c;全…

.NET 企业基本通用权限框架系统源码

源码分享&#xff01; 系统介绍&#xff1a; 1、组织机构多级树型显示&#xff0c;各级部门从属关系一目了然操作便捷 2、用户所有的权限最终分配给用户&#xff0c;如果按用户去分配权限会把系统管理员给累死&#xff0c;系统中先建立角色&#xff0c;角色中再分配权限&#x…

一种词库的比对、保存方式

一种词库的比对、保存方式 词库以树状链表存储&#xff0c;示意图如下&#xff1a; 对于词库&#xff1a;&#xff5b;A,AB,ABC,ADE&#xff5d;可以按以下方式存储 注&#xff1a;每个链表在末尾添加\0表示结束 1 数组形式存储的空间复杂度为O(N^2) 即O(N*M) -N为敏感词长…

vscode配置linux私钥远程免密登录

安装romote-ssh 将linux下的 ssh-keygen -t rsa 生成的密钥id_rsa放到windows的目录下&#xff1a; 在vscode中配置文件路径&#xff1a; 修改配置文件的权限为666&#xff1a; chmod 666 id_rsa_179

电脑录屏快捷键是什么?电脑录屏是什么键

​在日常的生活之中&#xff0c;电脑录屏是比较常用的功能。有些小伙伴知道如何使用电脑自带的录屏软件&#xff0c;可普通的操作步骤实在是有些繁琐&#xff0c;想要通过录屏快捷键&#xff0c;快速进行录屏操作。那么电脑录屏快捷键是什么&#xff1f;电脑录屏是什么键&#…

【SpringMVC】提问问题汇总

【SpringMVC】提问问题汇总&#xff08;1&#xff09;什么是Spring MVC &#xff1f;对springMVC的理解?&#xff08;2&#xff09;SpringMVC的流程&#xff1f;&#xff08;3&#xff09;Springmvc的重要组件&#xff08;3&#xff09;Springmvc的优点&#xff08;设计模式&a…

工程机械流通行业BI经营分析框架(一)四大关注方向

工程机械流通行业的商业智能BI经营分析框架大体可以从四大方向出发来进行整体规划&#xff0c;厂商目标、业务经营目标、战略目标和行业数据这四部分内容。核心还是企业的业务经营目标&#xff0c;但是和其它三类也有很大的关系&#xff0c;所以这四部分需要放在一起去看、去规…

Java多线程(二)

目录 一、线程的使用 Thread类的有关方法 线程的调度 调度策略&#xff1a; java的调度方法 线程的优先级 线程的优先等级 如何获取优先级 线程有关方法及线程优先级练习 线程的分类 二、线程的生命周期 三、线程的同步&#xff08;一&#xff09;&#xff08;线程安…

【Linux】基本指令(二)

文章目录rmdir&&rm 指令nano 指令whoami 指令man 指令cp 指令mv 指令echo 指令cat 指令wc 指令more 指令less 指令head 指令tail 指令date 指令cal 指令rmdir&&rm 指令 &#x1f495; rmdir是一个与mkdir相对应的命令。 mkdir是建立目录&#xff0c;而rmdir是…

UML之类图

概要 类图以反映类的结构(属性、操作)以及类之间的关系为主要目的&#xff0c;描述了软件系统的结构&#xff0c;是一种静态建模方法。类图中的“类”与面向对象语言中的“类”的概念是对应的&#xff0c;是对现实世界中的事物的抽象。元素解析 类 从上到下分为三部分&#…

Jetson Nx 串口接收数据丢失首字节问题

1 问题描述 I write a uart program using c on Jetson Nx(Jetpack 4.6.1,Ubuntu version 18.04 LTS) to communicate with a PC. On PC there’s a uart simulator( as below figure 1) sending data at a period of one second, 30 bytes data are : EB90021112131415161718…

VUE综合数据库编程

VUE综合数据库编程 案例要求 基于node expressvue clielementUImysql&#xff0c;在如图8.14所示的功能的基础上增加一个输入框用于输入商品的id&#xff0c;增加一个“删除”按钮&#xff0c;完成根据id删除商品的功能&#xff08;删除后的结果通过查看数据表goods的最新数据…

LinkedIn领英怎么避免封号?封号怎么解决?(建议收藏)

使用领英的朋友都知道&#xff0c;领英是很容易封号的。辛辛苦苦经营到上千好友的账号&#xff0c;第二天登录&#xff0c;提示“您的账号受到限制&#xff0c;暂时无法使用”。 例如1&#xff1a; 例如2&#xff1a; Linkedin如何避免封号&#xff1f; 大家肯定不愿看到这…