Seth Kenlon 发布的文章

用你喜欢的 sed 版本去除“智能”引号。

 title=

在排版学中,一对引号传统上是朝向彼此的。它们看起来像这样:

“智能引号”

随着计算机在二十世纪中期的普及,这种朝向往往被放弃了。计算机的原始字符集没有太多的空间,所以在 ASCII 规范中,两个双引号和两个单引号被缩减为各一个是合理的。如今,通用的字符集是 Unicode,有足够的空间容纳许多花哨的引号和撇号,但许多人已经习惯了开头和结尾引号都只有一个字符的极简主义。此外,计算机实际上将不同种类的引号和撇号视为不同的字符。换句话说,对计算机来说,右双引号与左双引号或直引号是不同的。

用 sed 替换智能引号

计算机并不是打字机。当你按下键盘上的一个键时,你不是在按一个带有印章的控制杆。你只是按下一个按钮,向你的计算机发送一个信号,计算机将其解释为一个显示特定预定义字符的请求。这个请求取决于你的键盘映射。作为一个 Dvorak 打字员,我目睹了人们在发现我的键盘上的 “asdf” 在屏幕上产生 “aoeu” 时脸上的困惑。你也可能按了一些特殊的组合键来产生字符,如 ™ 或 ß 或 ≠,这甚至没有印在你的键盘上。

每个字母或字符,不管它是否印在你的键盘上,都有一个编码。字符编码可以用不同的方式表达,但对计算机来说,Unicode 序列 u2018 和 u2019 产生 ,而代码 u201c 和 u201d 产生 字符。知道这些“秘密”代码意味着你可以使用 sed 这样的命令以编程方式替换它们。任何版本的 sed 都可以,所以你可以使用 GNU sed 或 BSD sed,甚至是 Busybox sed。

下面是我使用的简单的 shell 脚本:

#!/bin/sh
# GNU All-Permissive License

SDQUO=$(echo -ne '\u2018\u2019')
RDQUO=$(echo -ne '\u201C\u201D')
$SED -i -e "s/[$SDQUO]/\'/g" -e "s/[$RDQUO]/\"/g" "${1}"

将此脚本保存为 fixquotes.sh,然后创建一个包含智能引号的单独测试文件:

‘Single quote’
“Double quote”

运行该脚本,然后使用 cat 命令查看结果:

$ sh ./fixquotes.sh test.txt
$ cat test.txt
'Single quote'
"Double quote"

安装 sed

如果你使用的是 Linux、BSD 或 macOS,那么你已经安装了 GNU 或 BSD 的 sed。这是原始 sed 命令的两个独特的重新实现,对于本文中的脚本来说,它们在功能上是一样的(不过并不是所有的脚本都是这样)。

在 Windows 上,你可以用 Chocolatey 安装 GNU sed


via: https://opensource.com/article/21/9/sed-replace-smart-quotes

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

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

获取到任何文件或文件系统的所有信息,仅需要一条 Linux 命令。

 title=

在 GNU coreutils 软件包中包含 stat 命令,它提供了关于文件和文件系统包括文件大小、节点位置、访问权限和 SELinux 上下文,以及创建和修改时间等各种元数据。通常情况下,你需要多个不同命令获取的信息,而这一个命令就可以实现。

在 Linux 上安装 stat 命令

在 Linux 系统中,可能已经预装了 stat 命令,因为它属于核心功能软件包,通常默认包含在 Linux 发行版里。

如果系统中没有安装 stat 命令,你可以使用包管理器安装 coreutils 软件包。

另外,你可以 通过源码编译安装 coreutils 包

获取文件状态

运行 stat 命令可以获取指定文件或目录易读的状态信息。

$ stat planets.xml
  File: planets.xml
  Size: 325      Blocks: 8     IO Block: 4096   regular file
Device: fd03h/64771d    Inode: 140217      Links: 1
Access: (0664/-rw-rw-r--)  Uid: (1000/tux)   Gid: (100/users)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2021-08-17 18:26:57.281330711 +1200
Modify: 2021-08-17 18:26:58.738332799 +1200
Change: 2021-08-17 18:26:58.738332799 +1200
 Birth: 2021-08-17 18:26:57.281330711 +1200

输出的信息易懂,但是包含了很多的信息,这里是 stat 所包含的项:

  • File:文件名
  • Size:文件大小,以字节表示
  • Blocks:在硬盘驱动器上为文件保留的数据块的数量
  • IO Block:文件系统块大小
  • regular file:文件类型(普通文件、目录、文件系统)
  • Device:文件所在的设备
  • Inode:文件所在的 Inode 号
  • Links:文件的链接数
  • AccessUIDGID:文件权限、用户和组的所有者
  • Context:SELinux 上下文
  • AccessModifyChangeBirth:文件被访问、修改、更改状态以及创建时的时间戳

精简输出

对于精通输出或者想要使用其它工具(例如:awk)解析输出的人,这里可以使用 --terse(短参数为 -t)参数,实现没有标题或换行符的格式化输出。

$ stat --terse planets.xml
planets.xml 325 8 81b4 100977 100 fd03 140217 1 0 0 1629181617 1629181618 1629181618 1629181617 4096 unconfined_u:object_r:user_home_t:s0

自定义格式

你可以使用 --printf 参数以及与 printf 类似的语法定义自己的输出格式。stat 的每一个属性都有一个格式序列(%C 表示 SELinux 上下文,%n 表示文件名等等),所以,你可以定义输出格式。

$ stat --printf="%n\n%C\n" planets.xml
planets.xml
unconfined_u:object_r:user_home_t:s0
$ $ stat --printf="Name: %n\nModified: %y\n" planets.xml
Name: planets.xml
Modified: 2021-08-17 18:26:58.738332799 +1200

下面是一些常见的格式序列:

  • %a 访问权限
  • %F 文件类型
  • %n 文件名
  • %U 用户名
  • %u 用户 ID
  • %g 组 ID
  • %w 创建时间
  • %y 修改时间

stat 手册和 coreutils 信息页中都有完整的格式化序列列表。

文件信息

如果你曾尝试解析过 ls -l 的输出,那么,你会很喜欢 stat 命令的灵活性。你并不是每次都需要 stat 提供的所有信息,但是,当你需要其中一些或全部的时候它是非常有用的。不管你是读取默认输出,还是你自己创建的查询输出,stat 命令都可以查看所需的数据。


via: https://opensource.com/article/21/8/linux-stat-file-status

作者:Seth Kenlon 选题:lujun9972 译者:New-World-2019 校对:turbokernel

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

无论新手老手,这 20 个 Linux 命令都能让你的操作更轻松。

 title=

在黝黑的终端窗口中输入命令,这样的方式对某些人群来说可能好像过时了,但对许多专业计算机人员来说,这几乎是计算机完成能够执行的所有任务的最有效、最简便和最清晰的方式。如今,一些项目将开源命令引入了 macOS 和 Windows 等非开放平台,因此终端命令不仅仅是针对 Linux 和 BSD 用户,更是与每个人都息息相关。你可能会惊讶地发现,在一台普通的 POSIX 计算机上安装了数千个命令,当然,其中很多命令并不是真的有用,至少不是直接或经常性被使用。而其中的一部分命令虽然不是有效终端必须使用的命令,但相比其他命令而言使用频率较高,值得大家学习一下。

以下是终端用户最可能会使用的前 20 个命令:

cd

在终端外,你可以单击图标从一个文件夹移动到另一个文件夹,但在终端中,你需要使用 cdcd 命令代表 变更目录 change directory ,是用户在 Linux 系统中移动的方式。这是 Linux 中从一个地方到另一个地方最快、最直接的路线。

例如,在桌面上,当你想从你的主目录(你保存所有文件夹的地方)移动到一个名为 presentations 的文件夹时,你首先要打开你的 Documents 文件夹,然后打开一个名叫 work 的文件夹,然后是 projects 文件夹,然后是 conference 文件夹,最后是 presentations 文件夹,里面存放的是 LibreOffice Impress 幻灯片。这个过程包含了很多次的双击操作。同时屏幕上还需要许多鼠标移动动作,这取决于新窗口出现的位置,以及大脑需要跟踪的许多路径点。许多人通过将 所有文件 都放在桌面上来避免这个看似微不足道的任务。

而终端用户只需键入以下内容即可避免此问题:

$ cd ~/Documents/work/projects/conference/presentations

一些有经验的终端用户甚至都懒得输入所有这些,而是使用 Tab 键自动完成单词填充。更甚者,有时你都不必依赖自动完成,而是改用通配符:

$ cd ~/Doc*/work/*/conf*/p*

pwd

用 Buckaroo Banzai 的话来说:“无论你走到哪里,你就在那里。”

当你想弄清楚确切位置时,就可以使用 pwd 命令。pwd 代表 打印工作目录 print working directory ,这正是它的作用。--physical(在某些情况时缩写为 -P)显示解析所有符号链接后的确切位置。

$ pwd
/home/tux/presentation

$ pwd --physical
/home/tux/Documents/work/projects/conference/presentations

sed

流编辑器 sed 更广为人知的是一个强大的批量 查找和替换 命令,但它同时也是一个正当合理的文本编辑器。你可以通过阅读我的 介绍性文章 来学习使用它,然后通过我的 高级教程和备忘录 成为老手。

grep

grep 命令使用很普遍,以至于经常被用作动词(例如 “我会对一些文件进行 grep”)和动名词(例如 “grep 一些输出”)。无论是查看日志文件还是解析其他命令的输出,它都是在 shell 中解析文本时的关键组件。这是忙碌的用户专注于特定信息的一种方式。考虑一下计算世界中的数据量,grep 命令的流行就见怪不怪了。你可以通过阅读我的 介绍性文章 了解 grep,然后下载 备忘录 学习。

file

当你需要知道文件包含什么类型的数据时,请使用 file 命令:

$ file example.foo
example.foo: RIFF (little-endian) data, Web/P image [...]

$ file example.bar
example.bar: ELF 64-bit LSB executable, x86-64 [...]

当然,file 命令并不神奇。它只不过是根据文件如何标识自身而进行输出的,并且文件可能是错误的、损坏的或伪装的。使用 hexdump 进行严格检查的方式确定性更强,但对于日常使用而言,file 命令非常方便。

awk

awk 不仅仅是一个命令,它还是一种字面意义上的 编程语言点此下载我们的免费 Awk 电子书 进行学习,你可能会写出远超你想象的脚本。

curl

curl 命令是用于终端的 非交互式 Web 浏览器。它是面向 Web 和 API 开发人员的 开发工具。它是一个复杂灵活的命令,但如果你想从你的终端顺利地与 Web 服务交互,该命令是很值得学习的。

下载我们免费的 curl 备忘录,你可以从中学会 curl 的许多选项。

ps

管理系统资源主要由内核负责,当你更喜欢或更需要手动管理时,可以使用 ps 命令。读者可以在我的 使用 procps-ng 监控 Linux 系统 文章中了解 ps

cat

cat 命令 连接 concatenate 的缩写,它曾因为能将若干小文件合并而显得非常有用,这些小文件可能是由于大小限制而(使用 split 命令)拆分的。如今,cat 主要是用来将文本文件的内容转储到终端中以供快速阅读,除非你为此专门去使用 headtailmoreless 等命令。

尽管它的原始用途几乎已被弃用,并且其他几个命令也主要提供了其次要功能,但 cat 仍然是一个有用的工具。例如,它可以是复制(cp)命令的替代品:

$ cat myfile.ogg > /backups/myfile.ogg

它可以显示文件中不便观察的隐形字符。例如,使用 --show-tabs 选项,分割 YAMLTab 字符就会显示为 ^I

$ cat --show-tabs my.yaml

---

- hosts: all
  tasks:
  - name: Make sure the current version of 'sysstat' is installed.
    dnf:
     name:
^I- sysstat
^I- httpd
^I- mariadb-server
     state: latest

它还可以用 --show-nonprinting 显示非打印字符,用 --show-ends 标记行尾,用 --number 提供行号,等等。

find

find 命令可以用来查找文件,但它还有许多选项,这些选项可以帮助你通过各种过滤器和参数查找文件。读者可以从我的 介绍性文章 中学习该命令的基础知识。

如果你一直想知道为什么最基本的、不起眼的 ls 命令,不在本文列表中,那是因为 find 的灵活性。它不仅可以列表文件:

$ find .
./bar.txt
./baz.xml
./foo.txt
[...]

它还可以提供包含详细信息的长列表功能:

$ find . -ls
3014803  464 -rw-rw-r--   1 tux users  473385 Jul 26 07:25 ./foo.txt
3014837  900 -rwxrwxr-x   1 tux users  918217 Nov  6  2019 ./baz.xml
3026891  452 -rw-rw-r--   1 tux users  461354 Aug 10 13:41 ./foo.txt
[...]

这是一个技术问题,但也是很一个巧妙的技巧。

tar

人们有时会引用 BSD 的 tar 语法来拿 Linux 命令开玩笑。尽管有这样的名声,但 tar 命令实际上非常直观。读者可以阅读我的 如何解压缩 tar.gz 文件 文章,了解在需要时使用 tar 命令的简单知识。

more、less 和 most

这些统称为分页命令。分页命令与 cat 类似,但前者会在屏幕底部暂停输出,直到你向下滚动查看更多内容。这些命令比较简单,但每个之间都有细微差别。用户是用箭头键还是空格键滚动?是必须手动退出,还是在显示的文件末尾自动退出?用户的首选搜索行为是什么样的?选择你最喜欢的分页命令并将其设置在 .bashrc 中吧!

ssh 和 scp

OpenSSH 不仅有助于保护与远程系统的连接安全,还可以用于启用其他命令。例如,对于许多用户来说,有了 .ssh 目录,他们才能与 Git 存储库顺利交互、将更新发布到网站、登录云控制平台。

mv

mv 命令有双重作用:它既可以 移动文件 又可以 重命名文件。它有几个可用的保护措施,例如 --interactive--no-clobber 选项避免破坏现有文件,--backup 命令确保数据在新位置验证之前被保留,以及 --update 选项确保旧版本不会替换新版本文件。

sudo

当某个用户账户的用户名已知,且具有 全部 系统权限时,该用户很快就会成为黑客攻击的目标。sudo 命令消除了对字面上 root 用户的需求,从而优雅地移除了有关系统的重要信息。不过这还不是全部,使用 sudo 你还可以轻松地管理单个命令、用户和组的权限。你可以在选定的命令上启用无密码执行、记录用户会话、使用摘要验证来验证命令,等等

alias

使用 alias 命令将长命令变成易于记忆的快捷方式:

$ alias ls='ls --classify --almost-all --ignore-backups --color'

clear

有时终端会显得很混乱,输入 clear(或在某些 shell 中按 Ctrl+L)后,你就能得到漂亮、刷新的屏幕了。

setfacl

传统上,POSIX 文件权限由 chownchmod 决定。然而,如今系统变得更加复杂,因此有一个灵活性更高的命令。setfacl 命令允许创建一个 访问控制列表(ACL),可以配置任意用户所需权限,并可以为文件夹及其中创建的内容设置默认权限。

netcat

可能需要使用 netcatnc)的人不多,但这些使用它的人确离不开它。nc 命令是一个通用的网络连接工具。

它可以连接到一个端口,类似于 telnet 命令:

$ nc -u 192.168.0.12 80

它可以 ping 一个端口,类似于 ping 命令:

$ nc -zvn 192.168.0.12 25

它可以探测开放端口,类似于 nmap 命令:

$ nc -zv 192.168.0.12 25-80

以上仅是该命令的一小部分用途。

你自己构建的命令

在某种程度上,Linux 终端是一个创造性解决问题的平台。当你学习命令时,你也在学习可用于创建自己的命令的组块。我的 shell 历史 中的许多命令都是自己编写的 shell 脚本,从而实现了根据自己想要的工作方式定制工作流程。你为自己的效率和舒适度而设计的命令也可以作为 shell 中的基本命令。花些时间了解一些很棒的命令,然后试着构建自己的命令吧。当你构建出的命令非常好用时,把它开源,这样就可以与他人分享你的想法啦!


via: https://opensource.com/article/21/9/essential-linux-commands

作者:Seth Kenlon 选题:lujun9972 译者:unigeorge 校对:wxy

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

如果系统没有自动检测到你的打印机,这篇文章教你如何在 Linux 系统手动添加打印机。

 title=

即使未来已来, 电子墨水 e-ink 和 AR 技术可以现实应用,我们还是会用到打印机的。打印机制造商还不能做到让自己的专利打印机可以与各种计算机完全标准化传递信息,以至于我们需要各种打印机驱动程序,在任何操作系统上都是如此。电子电气工程师协会信息科学与技术处(IEEE-ISTO)下属的打印机工作组(PWG)和开放打印技术组织(OpenPrinting.org)长期合作致力于让人们可以(使用任何型号打印机)轻松打印。带来的便利就是,很多打印机可以不需要用户进行配置就可以自动被识别使用。

如果系统没有自动检测到你的打印机,你可以在这篇文章中找到如何在 Linux 系统手动添加打印机。文中假定你使用的是 GNOME 图形桌面系统,其设置流程同样适用于 KDE 或其他大多数桌面系统。

打印机驱动程序

在你尝试用打印机打印文件时,要先确认你的 Linux 系统上是不是已经安装了更新的打印机驱动程序。

可以尝试安装的打印机驱动程序有三大类:

  • 作为安装包提供的,捆绑在你的 Linux 系统上的开源 Gutenprint 驱动程序
  • 打印机制造商提供的专用驱动程序
  • 第三方开发提供的打印机驱动程序

开源打印机驱动程序库可以驱动 700 多种打印机,值得安装,这里面可能就有你的打印机的驱动,说不定可以自动设置好你的打印机(,你就可以使用它了)。

安装开源驱动程序包(库)

有些 Linux 发行版已经预装了开源打印机驱动程序包,如果没有,你可以用包管理器来安装。比如说,在 Fedora、CentOS、Magela 等类似发行版的 Linux 系统上,执行下面命令来安装:

$ sudo dnf install gutenprint

惠普(HP)系列的打印机,还需要安装惠普的 Linux 图形及打印系统软件包(HPLIP)。如在 Debian、Linux Mint 等类似的系统上,可以使用下面的命令:

$ sudo apt install hplip

安装制造商提供的驱动程序

很多时候因为打印机制造商使用了非标准的接口协议,这种情况开源打印机驱动程序就不能驱动打印机。另外的情况就是,开源驱动程序可以驱动打印机工作,但是会缺少供应商特有的某些性能。这些情况,你需要访问制造商的网站,找到适合你的打印机型号的 Linux 平台驱动。安装过程各异,仔细阅读安装指南逐步安装。

如果你的打印机根本不被厂商支持,你或许也只能尝试第三方提供的该型号打印机的驱动软件了。这类第三方驱动程序不是开源的,但大多数打印机的专用驱动程序也不是。如果你需要额外花费从供应商那里获取帮助服务才能安装好驱动并使用你的打印机,那是很心疼,或者你索性把这台打印机扔掉,至少你知道下次再也不会购买这个品牌的打印机了。

通用打印驱动系统(CUPS)

通用打印驱动系统 Common Unix Printing System (CUPS)是由 Easy Software Products 公司于 1997 年开发的,2007 年被苹果公司收购。这是 Linux 平台打印的开源基础软件包,大多数现代发行版都为它提供了一个定制化的界面。得益于 CUPS 技术,你可以发现通过 USB 接口连接到电脑的打印机,甚至连接在同一网络的共享打印机。

一旦你安装了需要的驱动程序包,你就能手工添加你的打印机了。首先,把打印机连接到运行的电脑上,并打开打印机电源。然后从“活动”屏幕或者应用列表中找到并打开“打印机”设置。

 title=

基于你已经安装的驱动包,你的 Linux 系统有可能自动检测识别到你的打印机型号,不需要额外的设置就可以使用你的打印机了。

 title=

一旦你在列表中找到你的打印机型号,设置使用这个驱动,恭喜你就可以在 Linux 系统上用它打印了。

(如果你的打印机没有被自动识别,)你需要自行添加打印机。在“打印机”设置界面,点击右上角的解锁按钮,输入管理用户密码,按钮转换成“添加打印机”按钮。

然后点击这个“添加打印机”按钮,电脑会搜索已经连接的本地打印机型号并匹配相应驱动程序。如果要添加网络共享打印机,在搜索框输入打印机或者其服务器机的 IP 地址。

 title=

选中你想添加的打印机型号,点击“添加”按钮把打印机驱动加入系统,就可以使用它了。

在 Linux 系统上打印

在 Linux 系统上打印很容易,不管你是在使用本地打印机还是网络打印机。如果你计划购买打印机,建议查看开放打印技术组织的(可支持打印机)数据库(OpenPrinting.org),看看你想购买的打印机是不是有相应的开源驱动程序。如果你已经拥有一台打印机,你现在也知道怎样在你的 Linux 系统上使用你的打印机了。


via: https://opensource.com/article/21/8/add-printer-linux

作者:Seth Kenlon 选题:lujun9972 译者:fisherue 校对:wxy

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

给你的 shell 脚本添加选项。

 title=

终端命令通常具有 选项或开关,用户可以使用它们来修改命令的执行方式。关于命令行界面的 POSIX 规范 中就对选项做出了规范,这也是最早的 UNIX 应用程序建立的一个由来已久的惯例,因此你在创建自己的命令时,最好知道如何将选项包含进 Bash 脚本 中。

与大多数语言一样,有若干种方法可以解决 Bash 中解析选项的问题。但直到今天,我最喜欢的方法仍然是我从 Patrick Volkerding 的 Slackware 构建脚本中学到的方法,当我第一次发现 Linux 并敢于冒险探索操作系统所附带的纯文本文件时,这些脚本就是我的 shell 脚本的引路人。

Bash 中的选项解析

在 Bash 中解析选项的策略是循环遍历所有传递给 shell 脚本的参数,确定它们是否是一个选项,然后转向下一个参数。重复这个过程,直到没有选项为止。

#!/bin/bash

while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
else
    break
fi
done

echo $ALPHA

在这段代码中,我创建了一个 while 循环,它会一直进行循环操作,直到处理完所有参数。if 语句会试着将在第一个位置($1)中找到的参数与 --alpha-a 匹配。(此处的待匹配项是任意选项名称,并没有特殊意义。在实际的脚本中,你可以使用 --verbose-v 来触发详细输出)。

shift 关键字会使所有参数位移一位,这样位置 2($2)的参数移动到位置 1($1)。处理完所有参数后会触发 else 语句,进而中断 while 循环。

在脚本的末尾,$ALPHA 的值会输出到终端。

测试一下这个脚本:

$ bash ./test.sh --alpha
1
$ bash ./test.sh

$ bash ./test.sh -a
1

可以看到,选项被正确地检测到了。

在 Bash 中检测参数

但上面的脚本还有一个问题:多余的参数被忽略了。

$ bash ./test.sh --alpha foo
1
$

要想捕获非选项名的参数,可以将剩余的参数转储到 Bash 数组 中。

#!/bin/bash

while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
else
    break
fi
done

echo $ALPHA

ARG=( "${@}" )
for i in ${ARG[@]}; do
    echo $i
done

测试一下新版的脚本:

$ bash ./test.sh --alpha foo
1
foo
$ bash ./test.sh foo

foo
$ bash ./test.sh --alpha foo bar
1
foo
bar

带参选项

有一些选项需要传入参数。比如,你可能希望允许用户设置诸如颜色或图形分辨率之类的属性,或者将应用程序指向自定义配置文件。

要在 Bash 中实现这一点,你仍然可以像使用布尔开关一样使用 shift 关键字,但参数需要位移两位而不是一位。

#!/bin/bash

while [ True ]; do
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
    ALPHA=1
    shift 1
elif [ "$1" = "--config" -o "$1" = "-c" ]; then
    CONFIG=$2
    shift 2
else
    break
fi
done

echo $ALPHA
echo $CONFIG

ARG=( "${@}" )

for i in ${ARG[@]}; do
    echo $i
done

在这段代码中,我添加了一个 elif 子句来将每个参数与 --config-c 进行比较。如果匹配,名为 CONFIG 的变量的值就设置为下一个参数的值(这就表示 --config 选项需要一个参数)。所有参数都位移两位:其中一位是跳过 --config-c,另一位是跳过其参数。与上节一样,循环重复直到没有匹配的参数。

下面是新版脚本的测试:

$ bash ./test.sh --config my.conf foo bar
my.conf
foo
bar
$ bash ./test.sh -a --config my.conf baz
1
my.conf
baz

Bash 让选项解析变得简单

还有一些其他方法也可以解析 Bash 中的选项。你可以替换使用 case 语句或 getopt 命令。无论使用什么方法,给你的用户提供选项都是应用程序的重要功能,而 Bash 让解析选项成为了一件简单的事。


via: https://opensource.com/article/21/8/option-parsing-bash

作者:Seth Kenlon 选题:lujun9972 译者:unigeorge 校对:wxy

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

用 ncdu Linux 命令获得关于磁盘使用的交互式报告。

 title=

计算机用户多年来往往积累了大量的数据,无论是重要的个人项目、数码照片、视频、音乐还是代码库。虽然现在的硬盘往往相当大,但有时你必须退一步,评估一下你在硬盘上实际存储了什么。经典的 Linux 命令 dfdu 是快速了解硬盘上的内容的方法,它们提供了一个可靠的报告,易于解析和处理。这对脚本和处理来说是很好的,但人的大脑对数百行的原始数据并不总是反应良好。认识到这一点,ncdu 命令旨在提供一份关于你在硬盘上使用的空间的交互式报告。

在 Linux 上安装 ncdu

在 Linux 上,你可以从你的软件仓库安装 ncdu。例如,在 Fedora 或 CentOS 上:

$ sudo dnf install ncdu

在 BSD 上,你可以使用 pkgsrc

在 macOS 上,你可以从 MacPortsHomeBrew 安装。

另外,你也可以 从源码编译 ncdu

使用 ncdu

ncdu 界面使用 ncurses 库,它将你的终端窗口变成一个基本的图形应用,所以你可以使用方向键来浏览菜单。

 title=

这是 ncdu 的主要吸引力之一,也是它与最初的 du 命令不同的地方。

要获得一个目录的完整列表,启动 ncdu。它默认为当前目录。

$ ncdu
ncdu 1.16 ~ Use the arrow keys to navigate, press ? for help                                                                  
--- /home/tux -----------------------------------------------
   22.1 GiB [##################] /.var
   19.0 GiB [###############   ] /Iso
   10.0 GiB [########          ] /.local
    7.9 GiB [######            ] /.cache
    3.8 GiB [###               ] /Downloads
    3.6 GiB [##                ] /.mail
    2.9 GiB [##                ] /Code
    2.8 GiB [##                ] /Documents
    2.3 GiB [#                 ] /Videos
[...]

这个列表首先显示了最大的目录(在这个例子中,那是 ~/.var 目录,塞满了很多的 flatpak 包)。

使用键盘上的方向键,你可以浏览列表,深入到一个目录,这样你就可以更好地了解什么东西占用了最大的空间。

获取一个特定目录的大小

你可以在启动 ncdu 时提供任意一个文件夹的路径:

$ ncdu ~/chromiumos

排除目录

默认情况下,ncdu 包括一切可以包括的东西,包括符号链接和伪文件系统,如 procfs 和 sysfs。你可以用 --exclude-kernfs 来排除这些。

你可以使用 --exclude 选项排除任意文件和目录,并在后面加上一个匹配模式。

$ ncdu --exclude ".var"
   19.0 GiB [##################] /Iso
   10.0 GiB [#########         ] /.local
    7.9 GiB [#######           ] /.cache
    3.8 GiB [###               ] /Downloads
[...]

另外,你可以在文件中列出要排除的文件和目录,并使用 --exclude-from 选项来引用该文件:

$ ncdu --exclude-from myexcludes.txt /home/tux
   10.0 GiB [#########         ] /.local
    7.9 GiB [#######           ] /.cache
    3.8 GiB [###               ] /Downloads
[...]

颜色方案

你可以用 --color dark 选项给 ncdu 添加一些颜色。

 title=

包括符号链接

ncdu 输出按字面意思处理符号链接,这意味着一个指向 9GB 文件的符号链接只占用 40 个字节。

$ ncdu ~/Iso
    9.3 GiB [##################]  CentOS-Stream-8-x86_64-20210427-dvd1.iso                                                    
@   0.0   B [                  ]  fake.iso

你可以用 --follow-symlinks 选项强制 ncdu 跟踪符号链接:

$ ncdu --follow-symlinks ~/Iso
    9.3 GiB [##################]  fake.iso                                                                                    
    9.3 GiB [##################]  CentOS-Stream-8-x86_64-20210427-dvd1.iso

磁盘使用率

磁盘空间用完并不有趣,所以监控你的磁盘使用情况很重要。ncdu 命令使它变得简单和互动。下次当你对你的电脑上存储的东西感到好奇时,或者只是想以一种新的方式探索你的文件系统时,不妨试试 ncdu


via: https://opensource.com/article/21/8/ncdu-check-free-disk-space-linux

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

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