当前位置: 首页 > 科技观察

深入了解自定义Bash

时间:2023-03-17 20:00:32 科技观察

操作系统的最外层——直接与您打交道的那一层——称为外壳(“外壳”)。Fedora预装了几种不同的shell。shell可以是图形界面,也可以是字符界面。在文档中,您经常会看到两个首字母缩略词GUI(图形用户界面)和CLI(命令行界面),用于区分图形和基于字符的shell/界面。GNOME和Bash分别是Fedora的默认图形界面和命令行界面,但您也可以使用其他GUI或CLIshell。在本文的下一篇中,我们将讨论Bash字符界面的一些推荐的点文件配置。Bash概述Bash参考手册说:从根本上说,shell只是一个执行命令的宏处理器。文字宏处理器是指通过扩展文字和符号来组成更复杂的表达方式。BashReference,FifthEdition,Bash5.0May2019除了能够使用其他程序外,Bashshell还内置了一些命令和关键字。Bash具有如此多的内置功能,以至于它甚至可以作为一种高级语言独立存在。Bash的几个关键字和运算符与C语言类似。Bash可以以交互或非交互模式启动。Bash的交互方式是很多人都熟悉的典型终端/命令行界面。GNOME终端默认以交互模式打开Bash。Bash在非交互模式下运行的一个示例是命令和数据从文件或shell脚本通过管道传输到Bash中。Bash可以运行的其他模式包括:登录登录、非登录非登录、远程远程、POSIX、Unixsh、受限以及使用与用户不同的UID/GID的模式。各种模式可以相互组合。比如交互+受限+POSIX或者非交互+非登录+远程。不同的启动模式决定了Bash读取的启动文件。了解这些运行方式,将有助于我们修改启动文件。根据Bash参考手册,它读取输入:来自文件...,来自作为参数传递给-c调用选项的字符...,或来自用户的终端。按照[its]引用规则将输入分解为单词和运算符。...这些标签由元字符分隔。此步骤执行别名扩展。将标记解析为简单和复合命令。执行各种shell扩展...,将扩展的标记分解为文件名...以及命令和参数列表。执行必要的重定向...并从参数列表中删除重定向运算符及其操作数。执行命令。如有必要,等待命令完成,并收集退出状态。Bash参考文档第五版,Bash版本5.02019年5月当用户打开终端仿真器进入命令行环境时,将启动交互式shell会话。GNOMETerminal默认为非登录模式的用户打开一个shell。您可以在“编辑→首选项→配置文件→CommandEdit→首选项→配置文件→命令”中配置模式(登录和非登录)以启动GNOME终端。也可以通过在启动时传递-login标志来要求Bash进入登录模式。请注意,Bash的登录模式和非交互模式并不相互排斥。可以让Bash在登录模式和非交互模式下运行。启动Bash除非传递-noprofile选项,登录模式下的Bashshell默认会读取并执行初始化文件中的一些命令。如果/etc/profile存在,它将是第一个执行的文件,然后是按照~/.bash_profile、~/.bash_login或~/.profile的顺序找到的第一个文件。当用户退出登录模式的shell,或者脚本调用非交互登录模式的shell中内置的exit命令时,Bash会读取并执行~/.bash_logout中的命令,如果/etc/bash_logout存在,它会立即执行它。一般来说,/etc/profile会引用source/etc/bashrc文件,读取并执行其中的命令,然后在/etc/profile.d目录下查找并读取并执行以.sh结尾的文件。同样,~/.bash_profile通常也引用源~/.bashrc文件。/etc/bashrc和~/.bashrc都会被检查以避免重复引用源代码。(LCTT译注:在Bash中,一个脚本会通过source或.命令将另一个脚本引入其中。这种行为被称为“source”和“sourcing”,但是对于这种行为一直没有公认和通用的翻译方法。之后许多经过考虑,我认为可以译为“引用”,原因如下:1.“引用”有“引用,介绍”的意思,符合这种行为;2.这个词的读音“元”与“源”的汉语普通含义“源”读音相同,容易记忆。以上是我们的拙见,供大家参考讨论。——老王,2020/7/19)互动shell,如果不是登录shell,那么当它第一次被调用时,会执行~/.bashrc文件。这是用户在Fedora上打开终端时通常输入的shell类型。当Bash以非交互模式启动时——就像运行脚本时一样——它会查找BASH_ENV环境变量。如果找到,则将其值扩展为文件名,然后读取并执行该文件。效果与执行以下命令相同:if[-n"$BASH_ENV"];然后。“$BASH_ENV”;值得注意的是,PATH环境变量的值将不会用于搜索文件名(将检索搜索路径)。重要的用户点文件Bash最著名的用户点文件是~/.bashrc。通过编辑此文件,可以设置大多数个性化选项。由于我们经常需要设置一些选项,我们会更改上面提到或没有提到的文件,所以大部分自定义选项都会变得很麻烦。Bash环境是高度可定制的,只是为了适应不同用户的不同需求。当登录shell正常退出时,如果存在~/.bash_logout和/etc/bash_logout则调用它们。下图显示了Bash作为交互式shell启动时的过程。例如,当用户从桌面环境打开终端仿真器时,会发生以下序列。我们已经知道Bash在不同的启动模式下执行不同的命令,因此显然只有几种典型的启动模式需要最注意。它们分别是非交互式、交互式登录shell和非交互式、交互式非登录shell。如果要定义一些全局环境,需要在/etc/profile.d目录下放置一个名称唯一且后缀为.sh的文件(如custom.sh)。非交互式非登录启动方式需要特别小心。在这种模式下,Bash检查BASH_ENV变量。如果定义了这个变量,Bash将引用它指向的文件。另外,PATH变量中存储的值在处理BASH_ENV时并没有用到(LCTT译注:意思是不检索搜索路径),所以必须包含可执行文件的绝对路径。例如,如果有人希望shell在以非交互方式执行脚本时读取~/.bashrc文件中的设置,他可以将如下内容放入一个名为/etc/profile.d/custom.sh的文件中...#custom.sh...#如果你使用FedoraWorkstationBASH_ENV="/home/username/.bashrc"...#如果你使用FedoraSilverblueWorkstationBASH_ENV="/var/home/username/.bashrc"export的BASH_ENV上面的脚本将导致每个shell脚本在运行之前执行用户的~/.bashrc。用户通常会自定义系统环境以适合自己的工作习惯和喜好。例如,用户可以通过别名实现这种级别的定制。具有相同起始参数的常用命令最适合使用别名。下面显示了一些在~/.bashrc文件中定义的别名。#.bashrc#执行全局文件if[-f/etc/bashrc];然后。/etc/bashrcfi...#用户别名和函数别名ls='ls-hF--color=auto'aliasla='ls-ahF--color=auto'#让dir命令像在Windows中一样工作aliasdir='ls--color=auto--format=long'#highlightgrepresultswithcoloraliasgrep='grep--color=auto'在系统中,别名是一种自定义各种命令的方式。它减少了击键并使命令更易于使用。用户级别名通常存储在用户的~/.bashrc文件中。如果您发现自己经常去历史记录中查找已执行的命令,您可能需要更改历史记录设置。您仍然可以在~/.bashrc文件中设置用户级别的历史记录选项。例如,如果您习惯于同时使用多个终端,您可能希望启用histappend选项。某些与Bash相关的shell选项本质上是布尔值(接收开或关),通常可以使用shopt内置命令启用或禁用。接受更复杂值的Bash选项(例如HISTTIMEFORMAT)通常被分配给环境变量以用于配置目的。下面演示了如何使用shell选项和环境变量自定义Bash。#ConfigureBashHistory#Tabexpanddirectoryenvironmentvariablesandsethistappendshopt-sdirexpandhistappend#ignoreboth相当于ignoredspace和ignoredupHISTCONTROL='ignoreboth'#控制`history`输出中的时间格式HISTTIMEFORMAT="[%F%T]"#UnlimitedHistory#注意:在较新版本的Bash中,任何<0都有效,但在CentOS/RHEL中,只有HISTSIZE=HISTFILESIZE=#或对于使用较新版本Bash的人HISTSIZE=-1HISTFILESIZE=-1上面示例中的direxpand选项允许bash在补全文件名时用扩展结果的单词替换目录名。它改变了readline编辑缓冲区的内容,所以无论你输入什么,都会被完成的结果所取代。HISTCONTROL变量用于启用或禁用命令历史记录的某些过滤选项。通过此选项可以从命令历史记录中过滤掉重复行和以空格开头的行。引用DustyMabe的话,这是我从他那里得到的一个技巧:ignoredup防止历史记录重复的条目(如果您一遍又一遍地执行相同的命令)。ignorespace忽略带有前导空格的条目,这在您设置包含敏感信息的环境变量或执行不希望记录到磁盘的命令时很有用。ignoreboth相当于这两个选项的组合。DustyMabe–首席软件工程师,Redhat,2020.6.19对于重度命令行用户,Bash有一个CDPATH环境变量。如果CDPATH包含cd命令要搜索的目录列表,并且相对路径作为第一个参数提供,它将按顺序检查所有列出的目录,寻找匹配的子目录并切换到第一个匹配的结果目录。#.bash_profile#SetCDPATHCDPATH="/var/home/username/favdir1:/var/home/username/favdir2:/var/home/username/favdir3"#也可以这样写CDPATH="/:~:/var:~/favdir1:~/favdir2:~/favdir3"exportCDPATHCDPATH通常以与PATH相同的方式更新——通过在赋值的右侧引用自身以保留原始值。#.bash_profile#SetCDPATHCDPATH="/var/home/username/favdir1:/var/home/username/favdir2:/var/home/username/favdir3"#或者这样写CDPATH="/:~:/var:~/favdir1:~/favdir2:~/favdir3"CDPATH="$CDPATH:~/favdir4:~/favdir5"exportCDPATHPATH是另一个极其重要的变量。它是系统上命令的搜索路径。请注意,某些应用程序需要将自己的目录添加到PATH变量中才能正确使用。与CDPATH一样,通过引用赋值右侧的原始值将新值附加到PATH变量。如果你想把新值放在前面,只需将旧值($PATH)放在列表的末尾。另请注意,在Fedora上,此列中的值以冒号(:)分隔。#.bash_profile#添加PATH值到PAHT环境变量PATH="$PATH:~/bin:~:/usr/bin:/bin:~/jdk-13.0.2:~/apache-maven-3.6.3"exportPATH命令提示符是另一个流行的自定义选项。它有七个可自定义的参数:PROMPT_COMMAND:如果设置,该值将在每个主提示符($PS1)之前执行。PROMPT_DIRTRIM:如果设置为大于零的数字,则此值用作扩展\w和\W提示字符串转义时要保留的尾随目录组件的数量。删除的字符将替换为省略号。PS0:这个参数的值像PS1一样展开,在交互式shell读取命令之后,执行命令之前显示。PS1:主要提示字符串。默认为\s-\v\$。PS2:二级提示字符串。默认值为>。PS2在展示之前就像PS1一样展开。PS3:该参数的值作为select命令的提示。如果未设置此变量,选择命令将使用#?作为提示。PS4:这个参数的值像PS1一样进行了扩展。如果设置了-x选项,扩展值将在回显命令行之前显示为提示。扩展值的第一个字符根据需要被复制多次,表示间接级别。默认值为+。Bash参考文档第五版,Bash版本5.02019年5月Bash的这一方面可能需要一整篇文章。您可以找到大量信息和示例。本文末尾链接的存储库中提供了一些示例点文件,包括提示重新配置。请随意使用此存储库中的示例来学习和试验。总结现在您已经掌握了Bash的工作原理,很容易修改Bash点文件以适应您自己的需要和习惯。美化您的提示并制作一些别名,以便您的计算机真正属于您。查看文件/etc/profile、/etc/bashrc和/etc/profile.d/的内容以获得一些灵感。您还可以在此处撰写有关终端仿真器的一些评论。有很多方法可以完全按照您想要的方式配置您喜欢的终端。您之前可能已经想到了这一点,但您通常可以使用...嗯...用户主目录中的点文件来做到这一点。终端仿真器也可以作为登录会话启动,有些人更喜欢使用登录环境。您如何使用您的终端和计算机取决于您如何修改(或不修改)您的点文件。如果您对命令行处于什么会话状态感到好奇,请使用以下脚本来确定它。#!/bin/bashcase"$-"in(*i*)echo这个shell是交互式的;;(*)echo这个shell不是交互式的;;esac把这些行放到一个有可执行权限的文件中,然后运行,就可以看到你当前是什么类型的shell。$-在Bash中是一个包含字母i的变量,如果是交互式shell的话。或者,您可以直接输出$变量并检查其输出是否有i标志。$echo$-参考信息您可以参考以下资源以获取更多信息和示例。Bash手册也是一个很好的信息来源。请注意,确保您的本地手册页记录了您当前正在运行的Bash版本的功能,因为在线找到的信息有时可能太旧(过时)或太新(未安装在您的系统上)。https://opensource.com/tags/command-linehttps://opensource.com/downloads/bash-cheat-sheet(在这个网站,你必须输入一个有效的电子邮件地址,或者注册才能下载。)https://opensource.com/article/19/12/bash-script-template以各种形式(点文件示例、提示和脚本文件)为本文做出贡献的社区成员:MicahAbbott–首席质量工程师JohnLebon–首席软件工程师DustyMabe-首席软件工程师ColinWalters-高级首席软件工程师示例点文件和脚本可以在此存储库中找到:https://github.com/TheOneandOnlyJakfrost/bash-article-repo请仔细检查提供的存储库中的上述信息。有些可能已经过时了。它还包含许多开发中的自定义脚本和pet容器配置示例,这些不是点文件。我建议从JohnLebon的点文件开始,它们从头到尾都有很好的解释,它们是我见过的最详细的,并且包含非常好的描述。祝您学习愉快!