标签 点文件 下的文章

这篇面向初学者的文章探讨了在 Linux 中如何在普通视图中隐藏文件和文件夹。图形用户界面和命令行方法都有所涉猎。

有时你需要在 Linux 中隐藏文件。

不要误会,我不是指那些你不想让你的家人看到的“特殊文件”。尽管你可以隐藏这些特殊文件,但更好的办法还是用密码锁定它们以提供额外的保护。

回到隐藏文件的话题。名称以 . 开头的任何文件或文件夹在 Linux 中是“隐藏的”。

Linux 有很多这样的文件和文件夹,在普通视图中它们是隐藏的。这些主要是系统和程序所需的配置文件。

用户通常不需要理会它们,因此它们在普通视图中是隐藏的,这样一来你就不会被许多看起来很奇怪的而不是你所创建的文件所淹没。

下图展示了我的主目录中隐藏的文件和文件夹。

linux 普通视图

linux 显示隐藏文件

如果你使用的是桌面版 Linux,你可以通过在文件管理器中按 Ctrl+H 快捷键来轻松 查看隐藏文件。在终端中,你可以使用 ls -a 命令显示隐藏文件和普通文件。

那么,如何在 Linux 中创建隐藏文件呢?你只需用一个在命名的时候加一个 . 前缀。就是这样。

在桌面版 Linux 里创建隐藏文件和文件夹(GUI 方法)

如果你使用的是文件管理器,在文件或文件夹上右键并选择重命名选项。现在你所要做的就是在文件名的开头添加一个 .

当你以这种方式创建隐藏文件时,GNOME 的 Nautilus 文件管理器也会显示一个警告。

ubuntu linux 隐藏文件

你可以以相同的方式隐藏文件夹及其所有内容。

你可以按 Ctrl+H 键来显示隐藏文件。哦!我是多么的喜欢 Ubuntu 中的键盘快捷键 和我使用的任何其他程序或操作系统!

要使隐藏文件变回普通文件,只需再次重命名这些文件删掉文件名前缀的 . 即可。

在 Linux 终端创建隐藏文件和文件夹(CLI 方法)

如果你热衷于终端,你可以 使用 mv 命令 重命名文件。你只需在原始文件名的开头添加一个 .

mv filename .filename

你可以使用以下命令显示隐藏文件:

ls -la

你也可以使用 ls -lA。这条命令不会显示点文件(...)。

额外提示:用非重命名的方法隐藏文件和文件夹(仅适用于 GUI)

你刚刚学了在 Linux 中隐藏文件。问题是你必须重命名文件,而这种操作不适用于所有的场合。

例如,在 Ubuntu 中,你会在目录中看到一个名为 snap 的文件夹。你不会使用它,但如果重命名它,你的 Snap 应用程序将无法按预期工作。类似的情况是,在 Ubuntu 22.04(安装有 Snap 版本的 Firefox)的 Downloads 目录下有一个 firefox.tmp 文件夹。

有一个巧妙的技巧可以在 Linux 桌面中使用。它应该可以在 Nemo、Thunar、Dolphin 等各种文件管理器下工作,但我不能保证。它确实适用于 GNOME 的 Nautilus 文件管理器。

因此,你在这里所做的是在你想要隐藏的文件或文件所在的目录中创建一个名为 .hidden 的新文件。

在 Linux 中隐藏文件的另一种方法

Ctrl+H 显示隐藏文件并 打开 .hidden 文件 进行编辑。在单独的行中添加文件或文件夹的名称。注意不能使用绝对或相对路径。你想要隐藏的 文件和文件夹应与此特殊 .hidden 文件 位于同一路径下。

这是我以不重命名的方式隐藏 cpufetch 目录和 pcloud 文件的示例:

pcloud
cpufetch

Ctrl+H 以再次隐藏 .hidden 文件。

现在,关闭你的文件资源管理器并重新启动它。你将不会再看到 .hidden 文件中提到的文件和目录。

如果你想再次查看它们,请按 Ctrl+H 键。

如果你不想再隐藏文件,请从 .hidden 文件中删除其名称或完全删除 .hidden 文件。

额外琐事:隐藏文件“功能”实际上是一个 bug

你知道吗?在文件名的开头添加一个 . 来隐藏文件的“功能” 实际上是一个 bug

在早期的 UNIX 时代,当创建文件系统时,添加了 .(当前目录)和 ..(父目录)文件以方便导航。

由于这些特殊的 ... 文件中没有实际数据,因此给 ls 命令添加了一个新的“功能”:该功能是检查文件名的第一个字符,如果它是一个点(.),则不再使用 ls 命令显示它。

这对隐藏 ... 文件有效,但它引入了一个 “bug”:ls 命令的输出会隐藏任何文件名以 . 开头的文件。

这个 bug 变成了一个功能,因为程序员喜欢它来“隐藏”他们的配置文件。ls 命令可能是后来修改添加了一个显示隐藏点文件的选项。

Linux 遵循相同的约定,因为 Linux 是以 UNIX 为原型开发的。

结论

我讨论了如何从普通视图中创建隐藏文件。如果要创建让其他人无法访问的机密文件或文件夹,则应对其进行加密。我曾经写过 在 Linux 中使用密码锁定文件夹。这是一篇有点儿旧的文章,但它可能仍然有效。

我希望你喜欢这个简单的话题并学到新的东西。发布你的评论让我知道你的想法吧。


via: https://itsfoss.com/hide-files-folders-linux/

作者:Abhishek Prakash 选题:lkxed 译者:hanszhao80 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

当你把环境保持在源码控制中,开发虚拟机和容器就成了一个解决方案,而不是一个问题。

 title=

你是否曾经开始使用一台新的电脑,不管是出于自愿还是因为旧的电脑让你的魔法烟消云散,并且对花了多长时间才把所有东西都 弄好 而感到沮丧?更糟糕的是,有没有花了一些时间重新配置你的 shell 提示符,然后意识到你更喜欢以前的样子?

对我来说,当我决定要在 容器 中进行开发时,这个问题就变得很严重了。容器是非持久的。开发工具很容易解决:一个带有工具的容器镜像就可以工作。源码很容易解决:源码控制维护它,开发是在分支上。但是,如果每次我创建一个容器,我都需要仔细地配置它,这就太痛苦了。

主目录的版本控制

将配置文件保存在版本控制中一直是一个有吸引力的选择。但是天真地这么做是令人担忧的。不可能直接对 ~ 进行版本控制。

首先,太多的程序认为把秘密放在那里是安全的。此外,它也是 ~/Downloads~/Pictures 等文件夹的位置,这些文件夹可能不应该被版本化。

小心翼翼地在主目录下保留一个 .gitignore 文件来管理 includeexclude 列表是有风险的。在某些时候,其中一个路径会出错,花费了几个小时的配置会丢失,大文件会出现在 Git 历史记录中,或者最糟糕的是,秘密和密码会被泄露。当这一策略失败时,它就成了灾难性的失败。

手动维护大量的符号链接也是行不通的。版本控制的全部原因是为了避免手动维护配置。

写一个安装脚本

这暗示了在源码控制中维护点文件的第一条线索:写一个安装脚本。

就像所有好的安装脚本一样,让它 幂等:运行两次不会两次增加配置。

像所有好的安装脚本一样,让它 只做最少的事情:使用其他的技巧来指向你的源码控制中的配置文件。

~/.config 目录

现代 Linux 程序在直接在主目录中寻找配置之前,会先在 ~/.config 中寻找。最重要的例子是 git,它在 ~/.config/git 中寻找。

这意味着安装脚本可以将 ~/.config 符号链接到主目录中源码控制的管理目录中的一个目录:

#!/bin/bash
set -e
DOTFILES="$(dirname $(realpath $0))"
[ -L ~/.config ] || ln -s $DOTFILES/config ~/.config

此脚本寻找它的位置,然后将 ~/.config 链接到它被签出的地方。这意味着几乎没有关于它需要位于主目录中的位置的假设。

获取文件

大多数 shells 仍然直接在主目录下寻找文件。为了解决这个问题,你要增加一层指示。从 $DOTFILES 中获取文件意味着在修改 shell 配置时不需要重新运行安装程序。

$!/bin/bash
set -e
DOTFILES="$(dirname $(realpath $0))"
grep -q 'SETTING UP BASH' ~/.bashrc || \
  echo "source $DOTFILES/starship.bash # SETTING UP BASH" >> ~/.bashrc

再次注意,这个脚本很仔细地做了幂等:如果这一行已经在那里了,它就不会再添加。它还考虑到了你在 .bashrc 上已经做的任何编辑,虽然这不是一个好主意,但也没有必要惩罚它。

反复测试

当你把环境保持在源码控制中时,开发虚拟机和容器就成了一个解决方案,而不是一个问题。试着做一个实验。建立一个新的开发环境,克隆你的点文件,安装,并看看有什么问题。

不要只做一次。至少每周做一次。这将使你更快地完成工作,同时也会告诉你什么是不可行的。暴露问题,修复它们,然后重复。


via: https://opensource.com/article/22/2/dotfiles-source-control

作者:Moshe Zadka 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

操作系统的最外层 —— 也就是跟你直接打交道的 —— 叫做 shell)(“外壳”)。Fedora 预装了好几种不同的 shell。shell 可以是图形界面,或者字符界面。在文档中,你常常能见到两个母缩写词 GUI ( 图形用户界面 Graphical User Interface )跟 CLI( 命令行界面 Command-Line Interface ),它们用来区分图形和基于字符的 shell/界面。GNOMEBash) 分别是 Fedora 默认的图形和命令行界面,不过你也可以使用其它 GUI 或者 CLI shell。

接下来在这篇文章中,我们会讨论一些比较推荐的 Bash 字符界面的点文件配置。

Bash 概览

Bash 参考手册中写道:

根本上来说,shell 只是一个能执行命令的宏处理器。宏处理器这个词意味着通过扩展文本跟符号,从而构成更复杂的表达式。

Bash 参考手册 第五版,Bash 5.0 2019 年 5 月

除了能使用其它程序之外,Bash shell 还含有一些内置命令和关键字。Bash 内置功能很强大,甚至能够作为一门 高级语言 独当一面。Bash 的几个关键字和操作符类似于 C 语言)。

Bash 能够以交互式或非交互式模式启动。Bash 的交互模式是一个很多人都熟悉的典型的终端/命令行界面。GNOME 终端 默认以交互模式打开 Bash。Bash 在非交互模式下运行的例子是,当命令和数据从文件或 shell 脚本通过 管道) 传送到 Bash 时。其它 Bash 可以运行的模式包括: 登录 login 非登录 non-login 远程 remote 、POSIX、Unix sh、 受限 restricted ,以及使用与用户不同的 UID/GID 模式。各种模式是可以相互组合的。比如,交互式 + 受限 + POSIX 或者非交互式 + 非登录 + 远程。不同的启动模式,决定着 Bash 所读取的启动文件。理解这些操作模式,有助于帮助我们修改启动文件。

根据 Bash 参考手册,它会:

  1. 从文件中...、从作为 -c 调用选项传入参数的字符...,或者从用户的终端中读取输入。
  2. 将输入分解成单词和操作符,遵循 [它的] 引用规则。...这些标记使用元字符隔开。这一步执行别名展开。
  3. 将标记解析成简单与复合命令。
  4. 执行各种 shell 展开...,将展开之后的标记分解成文件名...以及命令和参数的列表。
  5. 执行必要的重定向...并从参数列表中去除重定向操作符及其操作数。
  6. 执行命令。
  7. 必要时等待命令完成,并收集退出状态。

Bash 参考文档 第五版,Bash 版本 5.0 2019 年 5 月

当用户开启终端模拟器进入命令行环境时,便启动了一次交互式 shell 会话。GNOME 终端默认以非登录模式为用户打开 Shell。你可以在 “ 编辑 → 首选项 → 配置文件 → 命令 Edit → Preferences → Profilles → Command ” 中配置 GNOME 终端以何种模式(登录与非登录式)启动。也可以在 Bash 启动时通过向其传递 -login 标志来要求进入登录模式。要注意一点,Bash 的登录模式与非交互模式并不互斥。可以让 Bash 同时以登录模式和非交互模式运行。

启动 Bash

除非传入 -noprofile 选项,否则登录模式的 Bash shell 会默认读取并执行某些初始化文件中命令。如果 /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 通常也会 援引 source ~/.bashrc 文件。/etc/bashrc~/.bashrc 都会进行检查,避免重复 援引 source

(LCTT 译注:在 Bash 中,脚本会通过 source. 命令来将另外一个脚本引入其中,这个行为称之为 “source”、“sourcing”,但是该行为一直没有公认且常用的翻译方法。经过多番斟酌,我认为可以译做“援引”,理由如下:1、“援引”具有“引用、引入”的意思,符合该行为;2、“援”这个词的发音和“source” 常见的汉语意思“源”同音,便于记忆。以上是我们的愚见,供大家参考讨论。—— 老王,2020/7/19)

一个交互式的 shell,如果不是登录 shell,那么当它第一次被调用的时候,会执行 ~/.bashrc 文件。这是用户在 Fedora 上打开终端时通常会进入的 shell 类型。当 Bash 以非交互模式启动 —— 就像运行脚本时那样 —— 它会寻找 BASH_ENV环境变量。如果找到了,就会展开它的值作为文件名,接着读取并执行该文件。效果跟执行以下命令相同:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

值得注意的是,不会使用 PATH 环境变量的值来搜索该文件名(LCTT 译注:意即不会检索搜索路径)。

重要的用户点文件

Bash 最广为人知的用户点文件是 ~/.bashrc。通过编辑该文件,可以设置大多数个性化选项。由于我们常常需要设置一些选项,会改动上面提及甚至没有提及的文件,所以大部分自定义选项会成为一个麻烦事。Bash 环境具有很高的可定制性,正是为了适应不同用户的不同需求。

当登录 shell 正常退出时,如果 ~/.bash_logout/etc/bash_logout 存在,它们会被调用。下一幅图展示了 Bash 作为交互式 shell 启动时的过程。例如,当用户从桌面环境打开终端模拟器时,会按照以下顺序进行。

我们已经知道,在不同的启动模式下,Bash 会执行不同的命令,所以很明显,只有几种最需要关注的典型启动模式。分别是非交互、交互式登录 shell,和非交互式、交互式非登录 shell。如果想定义某些全局环境,那么需要将一个具有唯一名称、以 .sh 为后缀的文件(例如 custom.sh)放置在 /etc/profile.d 目录。

对于非交互式非登录启动方式,需要特别注意。在这种模式下,Bash 会检查 BASH_ENV 变量。如果定义了该变量,Bash 会援引它所指向的文件。另外,处理 BASH_ENV 时并不会使用 PATH 变量所存储的值(LCTT 译注:意即不会检索搜索路径),所以它必须包含执行文件的绝对路径。比如说,如果有人希望非交互式执行脚本时,shell 能读取 ~/.bashrc 文件中的设置,那么他可以把类似下面这样的内容放在一个名为 /etc/profile.d/custom.sh 的文件中...

# custom.sh
.
.
.
# 如果使用 Fedora Workstation
BASH_ENV="/home/username/.bashrc"
.
.
.
# 如果使用 Fedora Silverblue Workstation
BASH_ENV="/var/home/username/.bashrc"

export BASH_ENV

上面这份脚本会让每个 shell 脚本在运行之前先执行该用户的 ~/.bashrc

用户一般都会自定义他们的系统环境,以便契合他们自己的工作习惯与偏好。举例来说,用户可以通过别名来实现这种程度的自定义。拥有相同起始参数、需要频繁使用的命令是制作别名的最佳选择。以下展示了一些来自 ~/.bashrc 文件中定义的别名。

# .bashrc
# 执行全局文件
if [ -f /etc/bashrc ];
   then . /etc/bashrc
fi
.
.
.
# 用户别名和函数
alias ls='ls -hF --color=auto'
alias la='ls -ahF --color=auto'

# 让 dir 命令用起来像在 Windows 那样
alias dir='ls --color=auto --format=long'

# 用颜色高亮 grep 结果
alias grep='grep --color=auto'

在系统中,别名是一种自定义各种命令的方法。它能减少击键次数,而且让命令用起来更方便。针对用户级别的别名通常存放在该用户的 ~/.bashrc 文件中。

如果你发现自己经常要去历史中查找曾经执行过的某条命令,那可能需要改改历史设置了。你依然可以在 ~/.bashrc 文件中设置针对用户级别的历史选项。比如说,如习惯同时使用多个终端,那你可能要启用 histappend 选项。某些 Bash 相关的 shell 选项本质上是布尔值(接收 onoff),通常可以用内置命令 shopt 启用或禁用。接收更复杂的值的 Bash 选项(如 HISTTIMEFORMAT),常常通过赋值给环境变量来达到配置目的。以下演示如何以 shell 选项和环境变量定制 Bash。

# 配置 Bash 历史

# 用制表符扩展目录环境变量,并设置 histappend
shopt -s direxpand histappend

# ignoreboth 等同于 ignorespace 和 ignoredup
HISTCONTROL='ignoreboth'

# 控制 `history` 输出中的时间格式
HISTTIMEFORMAT="[%F %T] "

# 无限历史记录
# NB:在新版 Bash 中,任何 < 0 的写法都有效,但是在 CentOS/RHEL 中,只有这样才行得通
HISTSIZE=
HISTFILESIZE=

# 或者对于使用新版 Bash 的人
HISTSIZE=-1
HISTFILESIZE=-1

上面例子中的 direxpand 选项,可以让 Bash 在文件名补全时,用单词展开结果替换目录名。它会改变 readline 编辑缓冲区的内容,所以你所输入的东西已经被补全得到的结果替换了。

HISTCONTROL 变量用于启用或禁用命令历史的某些过滤选项。重复行、以空白打头的行,都能通过该选项将它们从命令历史中过滤掉。引用自 Dusty Mabe,这是我从他那儿得到的技巧:

ignoredup 可以让历史不记录重复条目(如果你反复执行同一条命令)。ignorespace 会忽略前面有空白的条目,当你在设置一个包含敏感信息的环境变量或者执行一条不想被记录进磁盘的命令时,这就很有用。ignoreboth相当于这两条选项的结合体。

Dusty Mabe – Redhat首席软件工程师,2020.6.19

对于命令行重度用户,Bash 有一个 CDPATH 环境变量。如果 CDPATH 包含一系列供 cd 命令搜索的目录,且提供一个相对路径作为第一个参数,那么它会按顺序检查所有列出的目录,寻找匹配的子目录并切换到第一个匹配结果目录。

# .bash_profile

# 设置 CDPATH
CDPATH="/var/home/username/favdir1:/var/home/username/favdir2:/var/home/username/favdir3"

# 也可以写成这样
CDPATH="/:~:/var:~/favdir1:~/favdir2:~/favdir3"

export CDPATH

CDPATH 通常像 PATH 一样的方式进行更新 —— 通过在赋值右侧引用自身来保留原来的值。

# .bash_profile

# 设置 CDPATH
CDPATH="/var/home/username/favdir1:/var/home/username/favdir2:/var/home/username/favdir3"

# 或者写成这样
CDPATH="/:~:/var:~/favdir1:~/favdir2:~/favdir3"

CDPATH="$CDPATH:~/favdir4:~/favdir5"

export CDPATH

PATH 是另一个极其重要的变量。它是系统上的命令的搜索路径。注意,有些应用要求将它们自己的目录加入 PATH 变量,这样才能正常使用。跟 CDPATH 一样,通过在赋值右侧引用原值来追加新值到 PATH 变量。如果你希望将新值前置,只需要把原来的值($PATH)放到列表末尾即可。还有注意的是在 Fedora,这一列值通过冒号分隔(:)。

# .bash_profile

# 添加 PATH 值到 PAHT 环境变量
PATH="$PATH:~/bin:~:/usr/bin:/bin:~/jdk-13.0.2:~/apache-maven-3.6.3"

export PATH

命令提示符是另一个流行的自定义选项。它有七个可定制的参数:

  • PROMPT_COMMAND:如果设置了,会在每一个主提示符($PS1)出现之前执行该值。
  • PROMPT_DIRTRIM:如果设置成大于零的数,则该值用作展开 \w\W 提示符字符串转义符时保留的尾随目录组件数量。删除的字符将替换为省略号。
  • PS0:这个参数的值像 PS1 一样展开,在交互式 shell 读取命令之后、执行命令之前展示。
  • PS1:主提示符字符串。默认值是 \s-\v\$
  • PS2:次提示符字符串。默认是 > 。在显示之前,PS2PS1 那样展开。
  • PS3:这个参数的值用作 select 命令的提示符。如果这个变量没有设置,select 命令会用 #? 作为提示符。
  • PS4:这个参数的值像 PS1 那样展开,如果设置了 -x 选项,这个展开值会在命令行被回显之前作为提示符显示。展开后的值的第一个字符在必要时会复制数次,指示间接层数。默认值是 +

Bash 参考文档 第五版,Bash 版本 5.0 2019 年 5 月

Bash 的这一个方面就可以用整篇文章来讨论。你可以找到许许多多信息和例子。在本文末尾链接的存储库中提供了一些点文件范例,包括提示符重新配置。你可以随意使用该存储库中的例子进行学习和体验。

总结

既然你已经掌握了一些 Bash 的工作原理,那就可以轻松修改你的 Bash 点文件,满足你自己的需求和习惯。美化你的提示符,制作一些别名,这样你的电脑才真的属于你。查看 /etc/profile/etc/bashrc/etc/profile.d/ 这些文件的内容,获得一些启发。

你也可以在这里写一些关于终端模拟器的评论。有很多办法可以将你最喜欢的终端,完全配置成你想要的样子。你或许早就想到了,但是通常可以通过……嗯……用户家目录的点文件实现这个目的。终端模拟器也可以作为登录会话启动,有些人总喜欢用登录环境。你使用终端和电脑的姿势,取决于你如何修改(或不修改)你的点文件。

如果你很好奇自己的命令行处于什么会话状态,使用下面这个脚本来判断一下。

#!/bin/bash

case "$-" in
   (*i*) echo This shell is interactive ;;
   (*) echo This shell is not interactive ;;
esac

把这几行放到一个文件里,加上可执行权限,然后运行,就能看到你当前处于何种类型的 shell。$- 在 Bash 中是一个变量,如果是交互式 shell,它会包含字母 i。此外,你可以直接输出 $- 变量然后检查它的输出中是否含有 i 标记。

$ echo $-

参考信息

可以参考以下资料以获取更多信息和示例。Bash 手册也是一个很好的信息来源。请注意,确保你的本地手册页记录了你当前运行的 Bash 版本的特性,因为在网上找到的信息有时可能太老(过时了)或太新(你的系统还没有安装)。

对本文有各种形式(点文件示例、提示,以及脚本文件)贡献的社区成员:

  • Micah Abbott – 首席质量工程师
  • John Lebon – 首席软件工程师
  • Dusty Mabe – 首席软件工程师
  • Colin Walters – 高级首席软件工程师

示例点文件和脚本可以在这个存储库中找到:

请仔细检查上面所提供的存储库中的信息。有些可能已经过时了。里面还包含很多开发中的自定义脚本和 宠物容器 pet container 配置例子,那些不是点文件。我推荐从 John Lebon 的点文件开始学习,从头到尾都含有完善的解说,它们是我见过的最详细的,并且包含了非常好的描述。祝你学得开心!


via: https://fedoramagazine.org/customizing-bash/

作者:Stephen Snow 选题:lujun9972 译者:nophDog 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在 Linux 中,点文件是隐藏的文本文件,从 Bash、Git 到 i3 或 VSCode 等更复杂的许多应用程序,都用它存储配置设置。

这些文件大多数都放在 ~/.config 目录中或用户主目录中。编辑这些文件使你可以自定义也许没有提供设置菜单的应用程序,并且它们可以跨设备甚至是跨其它 Linux 发行版移植。但是,整个 Linux 发烧友社区的讨论焦点是如何管理这些点文件以及如何共享它们。

我们将展示一个名为 Chezmoi 的工具,该工具与其它工具略有不同。

点文件管理的历史

如果你在 GitHub 上搜索“dotfiles”,那么你将看到有超过 10 万个存储库在解决一个目标:将人们的点文件存储在可共享且可重复的领地中。但是,除了都在使用 Git 之外,它们存储文件的方式各有不同。

虽然 Git 解决了代码管理问题,也将其转换为配置文件管理,但它并没有解决如何区分发行版、角色(例如家用计算机与工作计算机)、机密信息管理以及按设备配置的问题。

因此,许多用户决定制定自己的解决方案,多年来,社区已经做出了许多成果。本文将简要介绍已有的一些解决方案。

在孤立的环境中进行实验

你想在封闭的环境中快速尝试以下解决方案吗?运行:

$ podman run --rm -it fedora

来创建一个 Fedora 容器尝试应用程序。退出容器时,该容器将自动删除自身。

安装问题

如果将点文件存储在 Git 存储库中,你肯定希望可以让更改轻松地自动应用到主目录之中,乍一看,最简单的方法是使用符号链接,例如 ln -s ~/.dotfies/bashrc ~/.bashrc。这可以使你的更改在更新存储库时立即就绪。

符号链接的问题在于管理符号链接可能很麻烦。Stow 和 RCM(在 Fedora 杂志上介绍过)可以帮助你管理这些,但是这些并不是非常舒服的解决方案。下载后,需要对私有文件进行适当的修改和设置访问模式。如果你在一个系统上修改了点文件,然后将存储库下载到另一个系统,则可能会发生冲突并需要进行故障排除。

解决此问题的另一种方法是编写自己的安装脚本。这是最灵活的选项,但要权衡花费更多时间来构建自定义解决方案是否值得。

机密信息问题

Git 旨在跟踪更改。如果你在 Git 存储库中存储密码或 API 密钥之类的机密信息,则会比较麻烦,并且需要重写 Git 历史记录以删除该机密信息。如果你的存储库是公开的,那么如果其他人下载了你的存储库,你的机密信息将不再保密。仅这个问题就会阻止许多人与公共世界共享其点文件。

多设备配置问题

问题不在于如何将配置拉到多个设备,而是当你有多个需要不同配置的设备的问题。大多数人通过使用不同的文件夹或使用不同的 复刻 fork 来处理此问题。这使得难以在不同设备和角色集之间共享配置。

Chezmoi 是如何干的

Chezmoi 是一种考虑了以上问题的用于管理点文件的工具,它不会盲目地从存储库复制或符号链接文件。 Chezmoi 更像是模板引擎,可以根据系统变量、模板、机密信息管理器和 Chezmoi 自己的配置文件来生成你的点文件。

Chezmoi 入门

目前,Chezmoi 并不在 Fedora 的默认软件库中。你可以使用以下命令下载 Chezmoi 的当前版本。

$ sudo dnf install https://github.com/twpayne/chezmoi/releases/download/v1.7.17/chezmoi-1.7.17-x86_64.rpm

这会将预打包的 RPM 安装到你的系统中。

让我们继续使用以下方法创建你的存储库:

$ chezmoi init

它将在 ~/.local/share/chezmoi/ 中创建你的新存储库。你可以使用以下命令轻松地切换到该目录:

$ chezmoi cd

让我们添加第一个文件:

chezmoi add ~/.bashrc

这将你的 .bashrc 文件添加到 chezmoi 存储库。

注意:如果你的 .bashrc 文件实际上是一个符号链接,则需要添加 -f 标志以跟随它来读取实际文件的内容。

现在,你可以使用以下命令编辑该文件:

$ chezmoi edit ~/.bashrc

现在让我们添加一个私有文件,这是一个具有 600 或类似权限的文件。我在 .ssh/config 中有一个文件,我想通过使用如下命令添加它:

$ chezmoi add ~/.ssh/config

Chezmoi 使用特殊的前缀来跟踪隐藏文件和私有文件,以解决 Git 的限制。运行以下命令以查看它:

$ chezmoi cd

请注意,标记为私有的文件实际上并不是私有的,它们仍会以纯文本格式保存在你的 Git 存储库中。稍后会进一步解释。

你可以使用以下方法应用任何更改:

$ chezmoi apply

并使用如下命令检查有什么不同:

$ chezmoi diff

使用变量和模板

要导出 Chezmoi 可以收集的所有数据,请运行:

$ chezmoi data

其中大多数是有关用户名、架构、主机名、操作系统类型和操作系统名称的信息。但是你也可以添加我们自己的变量。

继续,运行:

$ chezmoi edit-config

然后输入以下内容:

[data]
         email = "[email protected]"
         name = "Fedora Mcdora"

保存文件,然后再次运行 chezmoi data。你将在底部看到你的电子邮件和姓名已经添加成功。现在,你可以将这些与 Chezmoi 的模板一起使用。运行:

$ chezmoi add  -T --autotemplate ~/.gitconfig

来将你的 .gitconfig 作为模板添加到 Chezmoi 中。如果 Chezmoi 成功地正确推断了模板,你将获得以下信息:

[user]
         email = "{{ .email }}"
         name = "{{ .name }}"

如果没有,则可以将文件更改为这样。

使用以下方法检查文件:

$ chezmoi edit ~/.gitconfig

然后使用:

$ chezmoi cat ~/.gitconfig

来查看 Chezmoi 为此文件生成什么。我生成的示例如下:

[root@a6e273a8d010 ~]# chezmoi cat ~/.gitconfig
[user]
    email = "[email protected]"
    name = "Fedora Mcdora"
[root@a6e273a8d010 ~]#

它将在我们的 Chezmoi 配置中生成一个充满变量的文件。你也可以使用变量执行简单的逻辑语句。一个例子是:

{{- if eq .chezmoi.hostname "fsteel" }}
# 如果主机名为 "fsteel" 才包括此部分
{{- end }}

请注意,要使其正常工作,该文件必须是模板。你可以通过查看文件是否在 chezmoi cd 中的文件名后附加 .tmpl 或使用 -T 选项读取文件来进行检查。

让机密信息保持机密

要对设置进行故障排除,请使用以下命令。

$ chezmoi doctor

这里重要的是它还向你显示了所支持的密码管理器

[root@a6e273a8d010 ~]# chezmoi doctor
 warning: version dev
      ok: runtime.GOOS linux, runtime.GOARCH amd64
      ok: /root/.local/share/chezmoi (source directory, perm 700)
      ok: /root (destination directory, perm 550)
      ok: /root/.config/chezmoi/chezmoi.toml (configuration file)
      ok: /bin/bash (shell)
      ok: /usr/bin/vi (editor)
 warning: vimdiff (merge command, not found)
      ok: /usr/bin/git (source VCS command, version 2.25.1)
      ok: /usr/bin/gpg (GnuPG, version 2.2.18)
 warning: op (1Password CLI, not found)
 warning: bw (Bitwarden CLI, not found)
 warning: gopass (gopass CLI, not found)
 warning: keepassxc-cli (KeePassXC CLI, not found)
 warning: lpass (LastPass CLI, not found)
 warning: pass (pass CLI, not found)
 warning: vault (Vault CLI, not found)
 [root@a6e273a8d010 ~]#

你可以使用这些客户端,也可以使用通用客户端,也可以使用系统的密钥环

对于 GPG,你需要使用以下命令将以下内容添加到配置中:

$ chezmoi edit-config
[gpg]
   recipient = "<Your GPG keys Recipient"

你可以使用:

$ chezmoi add --encrypt

来添加任何文件,这些文件将在你的源存储库中加密,并且不会以纯文本格式公开。Chezmoi 会在应用时自动将其解密。

我们也可以在模板中使用它们。例如,存储在 Pass(已在 Fedora 杂志上介绍)中的机密令牌。继续,生成你的机密信息。

在此示例中,它称为 githubtoken

rwaltr@fsteel:~] $ pass ls
 Password Store
 └── githubtoken
 [rwaltr@fsteel:~] $

接下来,编辑你的模板,例如我们之前创建的 .gitconfig 并添加以下行。

token = {{ pass "githubtoken" }}

然后让我们使用检查:

$ chezmoi cat ~/.gitconfig
[rwaltr@fsteel:~] $ chezmoi cat ~/.gitconfig
 This is Git's per-user configuration file.
 [user]
           name = Ryan Walter
           email = [email protected]
           token = mysecrettoken
 [rwaltr@fsteel:~] $

现在,你的机密信息已在密码管理器中妥善保护,你的配置可以公开共享而没有任何风险!

最后的笔记

这里仅仅涉及到表面。请访问 Chezmoi 的网站了解更多信息。如果你正在寻找有关如何使用 Chezmoi 的更多示例,作者还可以公开了他的点文件


via: https://fedoramagazine.org/take-back-your-dotfiles-with-chezmoi/

作者:Ryan Walter 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

通过在 GitLab 或 GitHub 上分享你的点文件,可以在整个系统上备份或同步你的自定义配置。

通过隐藏文件集(称为 点文件 dotfile )来定制操作系统是个非常棒的想法。在这篇 Shell 点文件可以为你做点什么中,H. Waldo Grunenwald 详细介绍了为什么以及如何设置点文件的细节。现在让我们深入探讨分享它们的原因和方式。

什么是点文件?

点文件 dotfile ”是指我们计算机中四处漂泊的配置文件。这些文件通常在文件名的开头以 . 开头,例如 .gitconfig,并且操作系统通常在默认情况下将其隐藏。例如,当我在 MacOS 上使用 ls -a 时,它才会显示所有可爱的点文件,否则就不会显示这些点文件。

dotfiles on master
➜ ls
README.md  Rakefile   bin       misc    profiles   zsh-custom

dotfiles on master
➜ ls -a
.               .gitignore      .oh-my-zsh      README.md       zsh-custom
..              .gitmodules     .tmux           Rakefile
.gemrc          .global_ignore .vimrc           bin
.git            .gvimrc         .zlogin         misc
.gitconfig      .maid           .zshrc          profiles

如果看一下用于 Git 配置的 .gitconfig,我能看到大量的自定义配置。我设置了帐户信息、终端颜色首选项和大量别名,这些别名可以使我的命令行界面看起来就像我的一样。这是 [alias] 块的摘录:

87   # Show the diff between the latest commit and the current state
88   d = !"git diff-index --quiet HEAD -- || clear; git --no-pager diff --patch-with-stat"
89
90   # `git di $number` shows the diff between the state `$number` revisions ago and the current state
91   di = !"d() { git diff --patch-with-stat HEAD~$1; }; git diff-index --quiet HEAD -- || clear; d"
92
93   # Pull in remote changes for the current repository and all its submodules
94   p = !"git pull; git submodule foreach git pull origin master"
95
96   # Checkout a pull request from origin (of a github repository)
97   pr = !"pr() { git fetch origin pull/$1/head:pr-$1; git checkout pr-$1; }; pr"

由于我的 .gitconfig 有 200 多行的自定义设置,我无意于在我使用的每一台新计算机或系统上重写它,其他人肯定也不想这样。这是分享点文件变得越来越流行的原因之一,尤其是随着社交编码网站 GitHub 的兴起。正式提倡分享点文件的文章是 Zach Holman 在 2008 年发表的《点文件意味着被复刻》。其前提到今天依然如此:我想与我自己、与点文件新手,以及那些分享了他们的自定义配置从而教会了我很多知识的人分享它们。

分享点文件

我们中的许多人拥有多个系统,或者知道硬盘变化无常,因此我们希望备份我们精心策划的自定义设置。那么我们如何在环境之间同步这些精彩的文件?

我最喜欢的答案是分布式版本控制,最好是可以为我处理繁重任务的服务。我经常使用 GitHub,随着我对 GitLab 的使用经验越来越丰富,我肯定会一如既往地继续喜欢它。任何一个这样的服务都是共享你的信息的理想场所。要自己设置的话可以这样做:

  1. 登录到你首选的基于 Git 的服务。
  2. 创建一个名为 dotfiles 的存储库。(将其设置为公开!分享即关爱。)
  3. 将其克隆到你的本地环境。(你可能需要设置 Git 配置命令来克隆存储库。GitHub 和 GitLab 都会提示你需要运行的命令。)
  4. 将你的点文件复制到该文件夹中。
  5. 将它们符号链接回到其目标文件夹(最常见的是 $HOME)。
  6. 将它们推送到远程存储库。

上面的步骤 4 是这项工作的关键,可能有些棘手。无论是使用脚本还是手动执行,工作流程都是从 dotfiles 文件夹符号链接到点文件的目标位置,以便对点文件的任何更新都可以轻松地推送到远程存储库。要对我的 .gitconfig 文件执行此操作,我要输入:

$ cd dotfiles/
$ ln -nfs .gitconfig $HOME/.gitconfig

添加到符号链接命令的标志还具有其他一些用处:

  • -s 创建符号链接而不是硬链接。
  • -f 在发生错误时继续做其他符号链接(此处不需要,但在循环中很有用)
  • -n 避免符号链接到一个符号链接文件(等同于其他版本的 ln-h 标志)

如果要更深入地研究可用参数,可以查看 IEEE 和开放小组的 ln 规范以及 MacOS 10.14.3 上的版本。自从其他人的点文件中拉取出这些标志以来,我才发现了这些标志。

你还可以使用一些其他代码来简化更新,例如我从 Brad Parbs 复刻的 Rakefile。另外,你也可以像 Jeff Geerling 在其点文件中那样,使它保持极其简单的状态。他使用此 Ansible 剧本对文件进行符号链接。这样使所有内容保持同步很容易:你可以从点文件的文件夹中进行 cron 作业或偶尔进行 git push

简单旁注:什么不能分享

在继续之前,值得注意的是你不应该添加到共享的点文件存储库中的内容 —— 即使它以点开头。任何有安全风险的东西,例如 .ssh/ 文件夹中的文件,都不是使用此方法分享的好选择。确保在在线发布配置文件之前仔细检查配置文件,并再三检查文件中没有 API 令牌。

我应该从哪里开始?

如果你不熟悉 Git,那么我有关 Git 术语的文章和常用命令备忘清单将会帮助你继续前进。

还有其他超棒的资源可帮助你开始使用点文件。多年前,我就发现了 dotfiles.github.io,并继续使用它来更广泛地了解人们在做什么。在其他人的点文件中隐藏了许多秘传知识。花时间浏览一些,大胆地将它们添加到自己的内容中。

我希望这是让你在计算机上拥有一致的点文件的快乐开端。

你最喜欢的点文件技巧是什么?添加评论或在 Twitter 上找我 @mbbroberg


via: https://opensource.com/article/19/3/move-your-dotfiles-version-control

作者:Matthew Broberg 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

了解如何使用配置文件来改善你的工作环境。

不要问你可以为你的 shell 点文件 dotfile 做什么,而是要问一个 shell 点文件可以为你做什么!

我一直在操作系统领域里面打转,但是在过去的几年中,我的日常使用的一直是 Mac。很长一段时间,我都在使用 Bash,但是当几个朋友开始把 zsh 当成宗教信仰时,我也试试了它。我没用太长时间就喜欢上了它,几年后,我越发喜欢它做的许多小事情。

我一直在使用 zsh(通过 Homebrew 提供,而不是由操作系统安装的)和 Oh My Zsh 增强功能

本文中的示例是我的个人 .zshrc。大多数都可以直接用在 Bash 中,我觉得不是每个人都依赖于 Oh My Zsh,但是如果不用的话你的工作量可能会有所不同。曾经有一段时间,我同时为 zsh 和 Bash 维护一个 shell 点文件,但是最终我还是放弃了我的 .bashrc

不偏执不行

如果你希望在各个操作系统上使用相同的点文件,则需要让你的点文件聪明点。

### Mac 专用
if [[ "$OSTYPE" == "darwin"* ]]; then
        # Mac 专用内容在此

例如,我希望 Alt + 箭头键 将光标按单词移动而不是单个空格。为了在 iTerm2(我的首选终端)中实现这一目标,我将此代码段添加到了 .zshrc 的 Mac 专用部分:

### Mac 专用
if [[ "$OSTYPE" == "darwin"* ]]; then
        ### Mac 用于 iTerm2 的光标命令;映射 ctrl+arrows 或 alt+arrows 来快速移动
        bindkey -e
        bindkey '^[[1;9C' forward-word
        bindkey '^[[1;9D' backward-word
        bindkey '\e\e[D' backward-word
        bindkey '\e\e[C' forward-word
fi

(LCTT 译注:标题 “We’re all mad here” 是电影《爱丽丝梦游仙境》中,微笑猫对爱丽丝讲的一句话:“我们这儿全都是疯的”。)

在家不工作

虽然我开始喜欢我的 Shell 点文件了,但我并不总是想要家用计算机上的东西与工作的计算机上的东西一样。解决此问题的一种方法是让补充的点文件在家中使用,而不是在工作中使用。以下是我的实现方式:

if [[ `egrep 'dnssuffix1|dnssuffix2' /etc/resolv.conf` ]]; then
        if [ -e $HOME/.work ]
                source $HOME/.work
        else
                echo "This looks like a work machine, but I can't find the ~/.work file"
        fi
fi

在这种情况下,我根据我的工作 dns 后缀(或多个后缀,具体取决于你的情况)来提供(source)一个可以使我的工作环境更好的单独文件。

(LCTT 译注:标题 “What about Bob?” 是 1991 年的美国电影《天才也疯狂》。)

你该这么做

现在可能是放弃使用波浪号(~)表示编写脚本时的主目录的好时机。你会发现在某些上下文中无法识别它。养成使用环境变量 $HOME 的习惯,这将为你节省大量的故障排除时间和以后的工作。

如果你愿意,合乎逻辑的扩展是应该包括特定于操作系统的点文件。

(LCTT 译注:标题 “That thing you do” 是 1996 年由汤姆·汉克斯执导的喜剧片《挡不住的奇迹》。)

别指望记忆

我写了那么多 shell 脚本,我真的再也不想写脚本了。并不是说 shell 脚本不能满足我大部分时间的需求,而是我发现写 shell 脚本,可能只是拼凑了一个胶带式解决方案,而不是永久地解决问题。

同样,我讨厌记住事情,在我的整个职业生涯中,我经常不得不在一天之中就彻彻底底地改换环境。实际的结果是这些年来,我不得不一再重新学习很多东西。(“等等……这种语言使用哪种 for 循环结构?”)

因此,每隔一段时间我就会觉得自己厌倦了再次寻找做某事的方法。我改善生活的一种方法是添加别名。

对于任何一个使用操作系统的人来说,一个常见的情况是找出占用了所有磁盘的内容。不幸的是,我从来没有记住过这个咒语,所以我做了一个 shell 别名,创造性地叫做 bigdirs

alias bigdirs='du --max-depth=1 2> /dev/null | sort -n -r | head -n20'

虽然我可能不那么懒惰,并实际记住了它,但是,那不太 Unix ……

(LCTT 译注:标题 “Memory, all alone in the moonlight” 是一手英文老歌。)

输错的人们

使用 shell 别名改善我的生活的另一种方法是使我免于输入错误。我不知道为什么,但是我已经养成了这种讨厌的习惯,在序列 ea 之后输入 w,所以如果我想清除终端,我经常会输入 cleawr。不幸的是,这对我的 shell 没有任何意义。直到我添加了这个小东西:

alias cleawr='clear'

在 Windows 中有一个等效但更好的命令 cls,但我发现自己会在 Shell 也输入它。看到你的 shell 表示抗议真令人沮丧,因此我添加:

alias cls='clear'

是的,我知道 ctrl + l,但是我从不使用它。

(LCTT 译注:标题 “Typos, and the people who love them” 可能来自某部电影。)

要自娱自乐

工作压力很大。有时你需要找点乐子。如果你的 shell 不知道它显然应该执行的命令,则可能你想直接让它耸耸肩!你可以使用以下功能执行此操作:

shrug() { echo "¯\_(ツ)_/¯"; }

如果还不行,也许你需要掀桌不干了:

fliptable() { echo "(╯°□°)╯ ┻━┻"; } # 掀桌,用法示例: fsck -y /dev/sdb1 || fliptable

想想看,当我想掀桌子时而我不记得我给它起了个什么名字,我会有多沮丧和失望,所以我添加了更多的 shell 别名:

alias flipdesk='fliptable'
alias deskflip='fliptable'
alias tableflip='fliptable'

而有时你需要庆祝一下:

disco() {
        echo "(•_•)"
        echo "<)   )╯"
        echo " /    \ "
        echo ""
        echo "\(•_•)"
        echo " (   (>"
        echo " /    \ "
        echo ""
        echo " (•_•)"
        echo "<)   )>"
        echo " /    \ "
}

通常,我会将这些命令的输出通过管道传递到 pbcopy,并将其粘贴到我正在使用的相关聊天工具中。

我从一个我关注的一个叫 “Command Line Magic” @ climagic 的 Twitter 帐户得到了下面这个有趣的函数。自从我现在住在佛罗里达州以来,我很高兴看到我这一生中唯一的一次下雪:

snow() {
        clear;while :;do echo $LINES $COLUMNS $(($RANDOM%$COLUMNS));sleep 0.1;done|gawk '{a[$3]=0;for(x in a) {o=a[x];a[x]=a[x]+1;printf "\033[%s;%sH ",o,x;printf "\033[%s;%sH*\033[0;0H",a[x],x;}}'
}

(LCTT 译注:标题 “Amuse yourself” 是 1936 年的美国电影《自娱自乐》)

函数的乐趣

我们已经看到了一些我使用的函数示例。由于这些示例中几乎不需要参数,因此可以将它们作为别名来完成。 当比一个短句更长时,我出于个人喜好使用函数。

在我职业生涯的很多时期我都运行过 Graphite,这是一个开源、可扩展的时间序列指标解决方案。 在很多的情况下,我需要将度量路径(用句点表示)转换到文件系统路径(用斜杠表示),反之亦然,拥有专用于这些任务的函数就变得很有用:

# 在 Graphite 指标和文件路径之间转换很有用
function dottoslash() {
        echo $1 | sed 's/\./\//g'
}
function slashtodot() {
        echo $1 | sed 's/\//\./g'
}

在我的另外一段职业生涯里,我运行了很多 Kubernetes。如果你对运行 Kubernetes 不熟悉,你需要编写很多 YAML。不幸的是,一不小心就会编写了无效的 YAML。更糟糕的是,Kubernetes 不会在尝试应用 YAML 之前对其进行验证,因此,除非你应用它,否则你不会发现它是无效的。除非你先进行验证:

function yamllint() {
        for i in $(find . -name '*.yml' -o -name '*.yaml'); do echo $i; ruby -e "require 'yaml';YAML.load_file(\"$i\")"; done
}

因为我厌倦了偶尔破坏客户的设置而让自己感到尴尬,所以我写了这个小片段并将其作为提交前挂钩添加到我所有相关的存储库中。在持续集成过程中,类似的内容将非常有帮助,尤其是在你作为团队成员的情况下。

(LCTT 译注:哦抱歉,我不知道这个标题的出处。)

手指不听话

我曾经是一位出色的盲打打字员。但那些日子已经一去不回。我的打字错误超出了我的想象。

在各种时期,我多次用过 Chef 或 Kubernetes。对我来说幸运的是,我从未同时使用过这两者。

Chef 生态系统的一部分是 Test Kitchen,它是加快测试的一组工具,可通过命令 kitchen test 来调用。Kubernetes 使用 CLI 工具 kubectl 进行管理。这两个命令都需要几个子命令,并且这两者都不会特别顺畅地移动手指。

我没有创建一堆“输错别名”,而是将这两个命令别名为 k

alias k='kitchen test $@'

alias k='kubectl $@'

(LCTT 译注:标题 “Oh, fingers, where art thou?” 演绎自《O Brother, Where Art Thou?》,这是 2000 年美国的一部电影《逃狱三王》。)

分裂与合并

我职业生涯的后半截涉及与其他人一起编写更多代码。我曾在许多环境中工作过,在这些环境中,我们在帐户中复刻了存储库副本,并将拉取请求用作审核过程的一部分。当我想确保给定存储库的复刻与父版本保持最新时,我使用 fetchupstream

alias fetchupstream='git fetch upstream && git checkout master && git merge upstream/master && git push'

(LCTT 译注:标题 “Timesplitters” 是一款视频游戏《时空分裂者》。)

颜色之荣耀

我喜欢颜色。它可以使 diff 之类的东西更易于使用。

alias diff='colordiff'

我觉得彩色的手册页是个巧妙的技巧,因此我合并了以下函数:

# 彩色化手册页,来自:
# http://boredzo.org/blog/archives/2016-08-15/colorized-man-pages-understood-and-customized
man() {
        env \
                LESS_TERMCAP_md=$(printf "\e[1;36m") \
                LESS_TERMCAP_me=$(printf "\e[0m") \
                LESS_TERMCAP_se=$(printf "\e[0m") \
                LESS_TERMCAP_so=$(printf "\e[1;44;33m") \
                LESS_TERMCAP_ue=$(printf "\e[0m") \
                LESS_TERMCAP_us=$(printf "\e[1;32m") \
                man "$@"
}

我喜欢命令 which,但它只是告诉你正在运行的命令在文件系统中的位置,除非它是 Shell 函数才能告诉你更多。在多个级联的点文件之后,有时会不清楚函数的定义位置或作用。事实证明,whencetype 命令可以帮助解决这一问题。

# 函数定义在哪里?
whichfunc() {
        whence -v $1
        type -a $1
}

(LCTT 译注:标题“Mine eyes have seen the glory of the coming of color” 演绎自歌曲 《Mine Eyes Have Seen The Glory Of The Coming Of The Lord》)

总结

希望本文对你有所帮助,并能激发你找到改善日常使用 Shell 的方法。这些方法不必庞大、新颖或复杂。它们可能会解决一些微小但频繁的摩擦、创建捷径,甚至提供减少常见输入错误的解决方案。

欢迎你浏览我的 dotfiles 存储库,但我要警示你,这样做可能会花费很多时间。请随意使用你认为有帮助的任何东西,并互相取长补短。


via: https://opensource.com/article/18/9/shell-dotfile

作者:H.Waldo Grunenwald 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出