bash shell 环境
Posted petewell
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bash shell 环境相关的知识,希望对你有一定的参考价值。
原文引用https://www.dazhuanlan.com/2019/08/26/5d62f93a80696/
bash的环境配置
工作环境是在Mac环境下,默认情况下Mac下bash是没有 .bashrc
的,导致一些自动化工具没有正确
配置自己的环境变量,最后出现问题。
bash的这些配置文档作用
-
.bash_profile
从字面理解
profile
跟账号相关,它在用户每次登录系统时被读取,里面的所有命令都会被bash执行。
在其他shell里面,存在.profile
和.login
,这些都是和.bash_profile
作用是一样的。 -
.bashrc
从字面理解
rc
跟配置项相关,每个bash启动(进程)时候,会去读该文档。一般来说都会 在.bash_profile里调用.bashrc
脚本以便统一配置用户环境。 -
.bash_logout
就更好理解了,在退出shell时被读取。所以我们可把一些清理工作的命令放到这文档中。
同时还有一些系统级别的配置项,/etc/bashrc
和 /etc/profile
, 当在用户主目录下找不到.bash_profile
和.bashrc
时,就会读取这两个文档,在centos下,.bashrc
又会调用 /etc/bashrc
。另外 .bash_history
是bash shell的历史记录文档
shell的两种交互属性
一种,是否interactive shell
(交互式Shell),另一种,是否login shell
(登录Shell)
-
交互式Shell: 没有非选项参数,没有-c,标准输入和标准输出与终端相连的,或者用-i参数启动的Bash实例。可以通过探测PS1变量是否设置或者$-返回值中是否包含字幕i来判定。什么是没有非选项参数?比如bash ~/myscript/clear_temp_files.sh这样执行的Shell脚本的Bash实例,就不是交互式Shell,因为脚本的路径,就是非选项参数。-c又是干什么的?就是使用一个字符串作为Bash的传入参数,比如bash -c ‘ls -ahl’,这种Shell进程也不算是交互式Shell。
交互式非登录Shell文档加载顺序如下:
12/etc/bashrc~/.bashrc -
登录Shell: 第0个参数以-号开头的Bash实例,或者用-login参数启动的Bash Shell。更加诡异了,什么叫第0个参数以-号开头?你只要随便登录一个*nix系统,Mac也行,Linux也行,然后echo $0,你就明白了,惊讶吧,出来的值竟然是-bash。真的是以-号开头的!!
登录Shell(不管是不是交互式的)文档加载顺序如下:
1234/etc/profile~/.bash_profile~/.bash_login~/.profile
一个crontab脚本,没经过处理的话,既不是交互式Shell,也不是登录Shell,所以所有配置都不会执行。
怎么处理?比如可以把shabang改一下 #!/bin/bash -l
让脚本用登录Shell来解释执行,就可以加载/etc/profile
或者,调用Bash解释器,加-l
参数也可以。
上面的信息也就说明了,为什么在Mac下没有执行 .bashrc
的原因了,因为它是交互shell
shell的set和shopt命令设置
set命令可以用来定制shell环境,使用选项“o”来打开或者关闭选项。例如打开选项:set -o
选项,关闭选项目:set +o
选项。
内置set命令选项
选项名 | 快捷开关 | 含义 |
---|---|---|
allexport | -a | 从这个选项中被设置开始就自动标明要输出的新变量或修改过的变量,直至选项被复位 |
braceexpand | -B | 打开花括号扩展,它是一个默认设置 |
emacs | 使用emacs内置编辑器进行命令行编辑,是一个默认设置 | |
errexit | -e | 当命令返回一个非零退出状态(失败)时退出。读取初始化文档时不设置 |
histexpand | -H | 执行历史替换时打开!和!!扩展,是一个默认设置 |
history | 打开命令行历史、默认为打开 | |
ignoreeof | 禁止用EOF(Ctrl+D)键退出shell。必须键入exit才能退出。等价于设置shell变量IGNOREEOF=10 | |
keyword | -k | 将关键字参数放到命令的环境中 |
interactive-comments | 对于交互式shell,把#符后面的文本作为注释 | |
monitor | -m | 设置作业控制 |
noclobber | -C | 防止文档在重定向时被重写 |
noexec | -n | 读命令,但不执行。用来检查脚本的语法。交互式运行时不开启 |
noglob | -d | 禁止用路径名扩展。即关闭通配符 |
notify | -b | 后台作业完成时通知用户 |
nounset | -u | 扩展一个未设置的变量时显示一个错误信息 |
onecmd | -t | 在读取和执行命令后退出 |
physical | -P | 设置时,在键入cd或pwd禁止符号链接。用物理目录代替 |
privileged | -p | 设置后,shell不读取.profile或ENV文档,且不从环境继承shell函数,将自动为setuid脚本开启特权 |
verbose | -v | 为调试打开verbose模式 |
vi | 使用vi内置编辑器进行命令行编辑 | |
xtrace | -x | 为调试打开echo模式 |
shopt
命令是set
命令的一种替代,很多方面都和set
命令一样,但它增加了很多选项。可有使用-p
选项来查看shopt
选项的设置。-u
开关表示一个复位的选项,-s
表示选项当前被设置。
|
|
shopt命令选项
选项 | 含义 |
---|---|
cdable_vars | 如果给cd内置命令的参数不是一个目录,就假设它是一个变量名,变量的值是将要转换到的目录 |
cdspell | 纠正cd命令中目录名的较小拼写错误。检查的错误包括颠倒顺序的字符,遗漏的字符以及重复的字符。如果知道一处修改,正确的路径就打印出,命令将继续。只用于交互式shell |
checkhash | bash在试图执行一个命令前,先在哈希表中寻找,以确定命令是否存在。如果命令不存在,就执行正常路径搜索 |
checkwinsize | bash在每个命令后检查窗口大小,如果有必要,就更新LINES和COLUMNS的值 |
cmdhist | bash试图将一个多行命令的所有行保存在同一个历史项中。这使得多行命令的重新编辑更方便 |
dotglob | bash在文档名扩展的结果中包括以点(.)开头的文档名 |
execfail | 如果一个交互式shell不能执行指定给exec内置命令作为参数的文档,它不会退出。如果exec失败,一个交互式shell不会退出 |
expand_aliases | 别名被扩展。默认为打开 |
extglob | 打开扩展的模式匹配特征(正常的表达式元字符来自Korn shell的文档名扩展) |
histappend | 当shell退出时,历史清单将添加到以HISTFILE变量的值命名的文档中,而不是覆盖文档 |
histreedit | 如果readline正被使用,用户有机会重新编辑一个失败的历史替换 |
histverify | 如果设置,且readline正被使用,历史替换的结果不会立即传递给shell解析器。而是将结果行装入readline编辑缓冲区中,允许进一步修改 |
hostcomplete | 如果设置,且readine正被使用,当正在完成一个包含@的词时bash将试图执行主机名补全。默认为打开 |
huponexit | 如果设置,当一个交互式登陆shell退出时,bash将发送一个SIGHUP(挂起信号)给所有的作业 |
interactive_comments | 在一个交互式shell中,允许以#开头的词以及同一行中其他的字符被忽略。默认为打开 |
lithist | 如果打开,且cmdhist选项也打开,多行命令将用嵌入的换行符保存到历史中,而无需在可能的地方用分号来分隔 |
mailwarn | 如果设置,且bash用来检查邮件的文档自从上次检查后已经被访问,将显示消息“The mail in mailfile has been read” |
nocaseglob | 如果设置,当执行文档名扩展时,bash在不区分大小写的方式下匹配文档名 |
nullglob | 如果设置,bash允许没有匹配任何文档的文档名模式扩展成一个空串,而不是它们本身 |
promptvars | 如果设置,提示串在被扩展后再经历变量和参量扩展。默认为打开 |
restricted_shell | 如果shell在受限模式下启动就设置这个选项。该值不能被改变。当执行启动文档时,不能复位该选项,允许启动文档发现shell是否是受限的 |
sourcepath | 如果设置,source内置命令使用PATH的值来寻找包含作为参数提供的文档的目录。默认为打开 |
source | 点(.)的同义词 |
shift_verbose | 如果该选项设置,当移动计数超过位置参量个数时,shift内置命令将打印一个错误消息 |
以上是关于bash shell 环境的主要内容,如果未能解决你的问题,请参考以下文章