概述

学习自定义 Linux bash shell 环境来满足用户需求。学习:

· 修改全局和用户配置文件

· 在登录或生成新 shell 时设置环境变量

· 为常用命令序列创建 bash 函数

· 为新用户帐户维护框架目录

· 设置命令搜索路径

Linux shell

在终端上使用一个 Linux shell 程序,通过键入命令(输入流)来与系统交互,并在同一个终端上查看输出(输出流)和错误消息(错误流)。有时,您需要在系统引导以前运行命令,以便允许终端建立连接,有时您需要定期运行命令,无论您是否登录。shell 也可以为您完成这些任务。标准输入和输出流不需要来自或定向到终端上的真实用户。在本教程中,将进一步了解 shell 和自定义用户的环境。具体地讲,您将学习 bash (Bourne again) shell(原始 original Bourne shell 的增强版),并了解使 bash 更符合可移植操作系统接口 (Portable Operating System Interface, POSIX) 标准的更改。我会在此过程中介绍其他一些 shell 特性。

Shell 和环境

shell 与操作系统提供了一个层。借助 Linux(和 UNIX)shell,组合基本函数来构建复杂的操作。然后可以使用编程结构,构建能在 shell 中直接执行的函数或将函数保存为 shell 脚本。shell 脚本是一个命令序列,它存储在 shell 运行的文件中。

表 1. 常见 bash 环境变量

名称

用途

USER

登录用户的名称

UID

登录用户的用户 ID 数字

HOME

用户的主目录

PWD

当前工作目录

SHELL

shell 的名称

PPID

父进程的 PID —启动此进程的进程的进程 ID

shell 还会设置一些特殊参数,但这些参数无法修改。

表 2. 常见 bash 参数

名称

用途

$

(运行的 bash shell [ 或其他 ] 进程)的进程 ID(或 PID)

?

上一个命令的退出代码

0

shell 或 shell 脚本的名称

使用变量

在名称前面加上 $作为前缀来使用变量的值,如1所示。

1. 使用变量值

[ian@atticf22 ~]$ echo $UID 1000

[ian@atticf22 ~]$ echo $HOME /home/ian

设置变量值并让它们可用

通过键入一个名称后不留空格,立即键入等号 (=),在 bash shell 中创建或设置 shell 变量。变量名是仅由字母数字字符和下划线组成的单词。名称以字母字符或下划线开头。变量名是区分大小写的,所以 var1和 VAR1是不同的变量。变量名(特别是导出变量)通常采用大写形式,就像 表 1中的示例一样,但这是一种约定,而不是一种要求。一些变量(比如 $$和 $?)实际上是 shell 参数而不是变量 —只能引用它们,不能向它们赋值。

Shell 变量仅对您创建它们时所在的进程可见,除非 导出它们,以便子进程可以看到和使用它们。子进程不能将变量导出到父进程。可以使用export命令导出变量。在 bash shell 中,可以一步完成分配和导出,但不是所有 shell 都支持这项功能。

探索这些概念的一种好方法是使用另一个 shell 来创建子进程。可以使用 ps命令帮助跟踪您所在的位置和正在运行的进程。

2. 设置 shell 变量并将它们导出到环境

ian@atticf22 ~]$ # Use the ps command to list current PID, parent PID and running command name

[ian@atticf22 ~]$ ps -p $$ -o "pid ppid cmd"

PID  PPID CMD

12761  9169 bash

[ian@atticf22 ~]$ # Start a child bash process

[ian@atticf22 ~]$ bash

[ian@atticf22 ~]$ # Assign two variables

[ian@atticf22 ~]$ VAR1=v1

[ian@atticf22 ~]$ VAR2="Variable 2"

[ian@atticf22 ~]$ # Export examples

[ian@atticf22 ~]$ export VAR2

[ian@atticf22 ~]$ export VAR3="Assigned and exported in one step"

[ian@atticf22 ~]$ # Use the $ character to reference the variables $ export VAR4=var4

[ian@atticf22 ~]$ echo $VAR1 '/' $VAR2 '/' $VAR3

v1 / Variable 2 / Assigned and exported in one step

[ian@atticf22 ~]$ # What is the value of the SHELL variable?

[ian@atticf22 ~]$ echo $SHELL

/bin/bash

[ian@atticf22 ~]$ # Now start ksh child and export VAR4

[ian@atticf22 ~]$ ksh

$ ps -p $$ -o "pid ppid cmd"

PID  PPID CMD

26212 22923 ksh

$ export VAR4=var4

$ # See what is visible

$ echo $VAR1 '/' $VAR2 '/' $VAR3 '/' $VAR4 '/' $SHELL

/ Variable 2 / Assigned and exported in one step / var4 / /bin/bash

$# No VAR1 and shell is /bin/bash - is that right?

$ exit

[ian@atticf22 ~]$ ps -p $$ -o "pid ppid cmd"

PID  PPID CMD

22923 12761 bash

[ian@atticf22 ~]$ # See what is visible

[ian@atticf22 ~]$ echo $VAR1 '/' $VAR2 '/' $VAR3 '/' $VAR4 '/' $SHELL

v1 / Variable 2 / Assigned and exported in one step / / /bin/bash

[ian@atticf22 ~]$ # No VAR4 - our child cannot export back to us

[ian@atticf22 ~]$ exit

exit

[ian@atticf22 ~]$ ps -p $$ -o "pid ppid cmd"

PID  PPID CMD

12761  9169 bash

[ian@atticf22 ~]$ # See what is visible

[ian@atticf22 ~]$ echo $VAR1 '/' $VAR2 '/' $VAR3 '/' $VAR4 '/' $SHELL

/ / / / /bin/bash

[ian@atticf22 ~]$ # None of VAR1 through VAR4 is exported back to parent

2中否注意到,ksh 没有设置 SHELL变量?但在您登录时,或者使用 su命令和创建 登录 shell的选项来切换到另一个用户时,通常会设置此变量。

可使用 echo命令查看 表 1和 表 2中的一些常见 bash 变量

3. 常见环境变量和 shell 变量

[ian@atticf22 ~]$ echo $USER $UID

ian 1000

[ian@atticf22 ~]$ echo $SHELL $HOME $PWD

/bin/bash /home/ian /home/ian

[ian@atticf22 ~]$ (exit 0);echo $?;(exit 4);echo $?

0

4

[ian@atticf22 ~]$ echo $0

bash

[ian@atticf22 ~]$ echo $$ $PPID

12761 9169

[ian@atticf22 ~]$ # see what my process and its parent are running

[ian@atticf22 ~]$ ps -p $$,$PPID -o "pid ppid cmd"

PID  PPID CMD

9169 1 /usr/libexec/gnome-terminal-server

12761  9169 bash

在 bash shell 中,还可以通过在命令前加上名称 = 值对作为前缀,将环境值设置为在单个命令的持续时间内有效

4. 为单个命令设置 bash 环境值

[ian@atticf22 ~]$ echo "$VAR5 / $VAR6"

/

[ian@atticf22 ~]$ VAR5=5 VAR6="some value" bash

[ian@atticf22 ~]$ echo "$VAR5 / $VAR6"

5 / some value

[ian@atticf22 ~]$ exit

[ian@atticf22 ~]$ echo "$VAR5 / $VAR6"

readonly和其他变量属性                                                                 上一页       回页首

一些 shell 参数无法修改。还可以将变量限制为 readonly、integer或 string。可以使用 declare命令设置变量属性。使用 -p选项显示变量和各种属性。了解 declare命令:

info bash "Shell Builtin Commands" "Bash Builtins"  --index-search declare

help declare

5. 变量属性

[ian@atticf22 ~]$ declare -r rov1="this is readonly"

[ian@atticf22 ~]$ rov="Who says it's read only?"

[ian@atticf22 ~]$ readonly rov2="another constant value"

[ian@atticf22 ~]$ rov2=3

bash: rov2: readonly variable

[ian@atticf22 ~]$ UID=99

bash: UID: readonly variable

[ian@atticf22 ~]$ declare -pr

declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:

force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath"

declare -ir BASHPID

declare -r BASH_COMPLETION_COMPAT_DIR="/etc/bash_completion.d"

declare -ar BASH_VERSINFO='([0]="4" [1]="3" [2]="42" [3]="1" [4]="release" [5]=

"x86_64-redhat-linux-gnu")'

declare -ir EUID="1000"

declare -ir PPID="12761"

declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"

declare -ir UID="1000"

declare -r rov1="this is readonly"

declare -r rov2="another constant value"

[ian@atticf22 ~]$ help declare

declare: declare [-aAfFgilnrtux] [-p] [name[=value] ...]

Set variable values and attributes.

Declare variables and give them attributes.  If no NAMEs are given,

display the attributes and values of all variables.

Options:

-f   restrict action or display to function names and definitions

-F   restrict display to function names only (plus line number and

source file when debugging)

-g   create global variables when used in a shell function; otherwise

ignored

-p   display the attributes and value of each NAME

Options which set attributes:

-a   to make NAMEs indexed arrays (if supported)

-A   to make NAMEs associative arrays (if supported)

-i   to make NAMEs have the `integer' attribute

-l   to convert NAMEs to lower case on assignment

-n   make NAME a reference to the variable named by its value

-r   to make NAMEs readonly

-t   to make NAMEs have the `trace' attribute

-u   to convert NAMEs to upper case on assignment

-x   to make NAMEs export

Using `+' instead of `-' turns off the given attribute.

Variables with the integer attribute have arithmetic evaluation (see

the `let' command) performed when the variable is assigned a value.

When used in a function, `declare' makes NAMEs local, as with the `local'

command.  The `-g' option suppresses this behavior.

Exit Status:

Returns success unless an invalid option is supplied or a variable

取消设置变量                                                                           上一页       回页首

使用 unset命令从 bash shell 删除一个变量。使用 -v选项确保删除了变量定义。函数可拥有与变量相同的名称,删除一个函数定义,可使用 -f。如果没有 -f或 -v。

6. 取消设置 bash 变量

ian@atticf22 ~]$ bash

[ian@atticf22 ~]$ VAR1=v1

[ian@atticf22 ~]$ declare -i VAR2

[ian@atticf22 ~]$ VAR2=3+4

[ian@atticf22 ~]$ echo $VAR1 $VAR2

v1 7

[ian@atticf22 ~]$ unset VAR1

[ian@atticf22 ~]$ echo $VAR1 $VAR2

7

[ian@atticf22 ~]$ unset -v VAR2

[ian@atticf22 ~]$ echo $VAR1 $VAR2

[ian@atticf22 ~]$ exit

exit

注意,变量被定义为 integer,向它赋的值会计算为算术表达式。

默认情况下,bash 将未设置的变量视为拥有空值。为什么取消设置一个变量,而不是向它分配一个空值?在 bash 和其他许多 shell 中,如果应用未定义的变量,可能会产生一个错误。可使用 set -u命令生成未定义变量的错误,使用 set +u禁用该警告。

7. 错误和取消设置变量

[ian@atticf22 ~]$ bash

[ian@atticf22 ~]$ set -u

[ian@atticf22 ~]$ VAR1=var1

[ian@atticf22 ~]$ echo $VAR1

var1

[ian@atticf22 ~]$ unset VAR1

[ian@atticf22 ~]$ echo $VAR1

bash: VAR1: unbound variable

[ian@atticf22 ~]$ VAR1=

[ian@atticf22 ~]$ echo $VAR1

[ian@atticf22 ~]$ unset VAR1

[ian@atticf22 ~]$ echo $VAR1

bash: VAR1: unbound variable

[ian@atticf22 ~]$ unset -v VAR1

[ian@atticf22 ~]$ set +u

[ian@atticf22 ~]$ echo $VAR1

[ian@atticf22 ~]$ exit

exit

取消设置一个不存在的变量不会出错,甚至在指定了 set -u时也是如此。

上一页       回页首

转载于:https://blog.51cto.com/risingair/1868669

linux自定义和使用 shell 环境(一)相关推荐

  1. linux系统默认的环境变量path,Linux编程 12 (默认shell环境变量, PATH变量重要讲解)...

    一 .概述 默认情况下, bash shell会用一些特定的环境变量来定义系统的环境.这些默认环境变量可以理解是上篇所讲的系统全局环境变量. 1.1 bash  shell支持的Bourne变量 Bo ...

  2. Linux系统 熟练掌握 shell环境变量

     熟练掌握 shell环境变量      shell就是用户与操作系统内核之间的接口,起着协调用户与系统的一致性和在用户与系统之间进行交互的作用.      shell支持具有字符串值的变量.shel ...

  3. 更改Linux用户的登录shell环境

    使用普通用户zhangrong登录系统,并将自己的登录的shell改为tcsh. 设置了新的登录shell后,将在该用户下次登录系统时生效. root用户可以直接通过修改"/etc/pass ...

  4. linux crontab环境变量,Linux下crontab内环境变量与Shell环境变量的关系【转】

    crontab,总是不会缺省的从用户profile文件中读取环境变量参数 经常导致在手工执行某个脚本时是成功的,但是到crontab中试图执行时就会报错. 解决办法如下: 方法一:在shell文件中获 ...

  5. 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter6-Linux 环境变量

    六.Linux 环境变量 bash shell 使用环境变量来存储 shell 会话和工作环境的相关信息(这也是被称作环境变量的原因).环境变量允许在内存中存储数据, 以便 shell 中运行的程序或 ...

  6. linux超级基础系列——shell变量(本地变量和环境变量)

    linux超级基础系列--shell变量(本地变量和环境变量) 2006-12-04 00:39 为使shell编程更有效,系统提供了一些shell变量.shell变量可以保存诸如路径名.文件名或者一 ...

  7. 国内Linux shell,管理你的 shell 环境 | Linux 中国

    原标题:管理你的 shell 环境 | Linux 中国 定制它来更有效地使用它 -- Eduard Lucena 前段时间,Fedora Magazine 发表了一篇 的文章,它是 Fedora 默 ...

  8. Shell入门:掌握Linux,OS X,Unix的Shell环境

    为什么80%的码农都做不了架构师?>>>    在Linux或类Unix系统中,每个用户和进程都运行在一个特定环境中.这个环境包含了变量.设置.别名.函数以及更多的东西.下面是对Sh ...

  9. linux如何美化桌面,Gnome Shell 环境桌面图标主题美化记

    几天前我分享了我的Gnome Shell桌面,有同学希望我分享一下Gnome Shell 环境桌面图标主题教程,其实我自己也想写一篇关于 Gnome shell 桌面主题安装的文章,是如何安装漂亮的图 ...

最新文章

  1. Educational Codeforces Round 86 (Rated for Div. 2)c和d
  2. python打开excel的函数-Python读取excel文件中带公式的值的实现
  3. UILabel 调整行间距
  4. AI真的会杀人?DeepMind开发了二维网格游戏来做测试
  5. zip()和zip(*)的区别与使用
  6. debian 删除mysql数据库_Debian中完全卸载MySQL的方法
  7. 如何提高JVM的性能?
  8. 循环单链表 python_循环单链表报错
  9. (第七天)DOM练习一
  10. python卸载_Python包管理工具pip - amanlikethis
  11. 【嵌入式开发】STM8S103F3P6单线半双工串口通信
  12. 54_集合类库(上)
  13. 量化C++国产框架千星+ WonderTrader
  14. Vue实现前端3D展示及node环境搭建
  15. Typing for mac(打字训练工具)
  16. Leetcode刷题:贪心算法
  17. 让人眼花缭乱的视错觉,太酷炫了!
  18. SSDP 服务发现协议
  19. intellijIdea新手上路
  20. 开始甲骨文培训了,第一天说了一下上课学习规矩及计算机基础

热门文章

  1. 锁相放大器sr830_各位谁会用Stanford SR830啊,我都快被这个锁相放大器折腾死了!!!!-北京搜狐焦点...
  2. import 别名_es6模块 import, export 知识点小结
  3. esxi直通 gen8_HP MicroServer Gen8与ESXI采坑之旅
  4. 微型计算机中负数以()存放,130.在微型计算机中,负数常用( )表示。
  5. java线程睡眠分析,java线程睡眠有关问题
  6. 1.2 函数间隔和几何间隔理解2
  7. Warning: POST Content-Length of 29328854 bytes exceeds the limit of 8388608 bytes in Unknown on line
  8. Shell特殊变量:Shell $0,$#,$*,$@,$?,$$和命令行参数
  9. 在jupyter界面误删了jupyter notebook
  10. java图像处理之自动对比度