有时我与一些害怕使用命令行的朋友交谈，我感到自己给不出好的建议（我已经使用命令行太长时间了），因此我向一些 Mastodon 上的人提出了以下问题：如果在过去一到三年内，你刚刚不再害怕使用命令行了，是什么帮助了你？（如果你不记得，或者你已经使用命令行舒适地工作了 15 年，则无需回答——这个问题不适用于你 ?）这个列表还不如我希望的那么长，但我希望通过发布它来收集更多的答案。显然，并没有一个单一的方法适用于所有人，不同的人会选择不同的路径。我认为舒适使用命令行有三个方面：减少风险、动机和资源。我将先谈谈减少风险，然后是一些动机，并列出一些资源。减少风险的方式很多人（没错！）对在命令行上意外执行了一些无法撤销的破坏性操作感到担心。以下是一些人们提到的帮助他们减少风险的策略：定期备份（有人提到他们在上周的一个命令行错误中意外删除了整个家目录，但很幸运他们有备份）。对于代码，尽可能多地使用 git。将 rm 设置为类似 safe-rm 或 rmtrash 这样的工具的别名，这样你就不会意外删除不应删除的内容（或者就设置别名到 rm -i）。尽量避免使用通配符，使用制表符键补全代替（我的 Shell 会使用 TAB 键补全 rm *.txt 并显示我将要删除的内容）。使用精美的终端提示符，可以显示当前目录、计算机名称、git 分支和你是否具有 root 权限。如果你计划对文件运行未经测试或危险的命令，先备份文件副本。拥有一台专用的测试机器（如便宜的旧 Linux 计算机或树莓派）进行特别危险的测试，例如测试备份软件或分区。对于危险命令，如果有的话，使用 --dry-run 选项来查看执行结果而不实际执行操作。在你的 Shell 脚本中构建自己的 --dry-run 选项。这些策略有助于降低在命令行上引发不可逆操作的风险。杀手级应用程序一些人提到了一个“杀手级命令行应用程序”，这激励他们开始花更多时间在命令行上。例如：ripgrepjqwget / curlgit（一些人发现他们更喜欢使用 git 命令行界面而不是使用图形界面）ffmpeg（用于视频处理）yt-dlp硬盘数据恢复工具（来自 这个精彩的故事）还有一些人提到他们对图形界面工具感到失望（例如使用了所有内存，并使计算机崩溃的重型集成开发环境），并因此有动机用更轻量级的命令行工具替代它们。激发人们的命令行技巧有人提到被其他人在命令行上展示的酷炫功能所激励，例如：命令行工具可以比你的 Hadoop 集群快 235 倍Gary Bernhardt 的这个“命令行链锯”演讲explainshell有几个人提到了 explainshell，它可以让你粘贴任何命令行指令，并将其分解成不同的部分解释。命令历史、制表符补全等等有很多小技巧和窍门可以使在命令行上工作更容易，例如：使用向上箭头查看先前的命令使用 Ctrl+R 搜索你的 Bash 历史记录使用快捷键在行内导航：Ctrl+w （删除一个单词）、Ctrl+a（跳转到行首）、Ctrl+e（跳转到行尾），以及 Ctrl+left arrow / Ctrl+right arrow（向前/向后跳转一个单词）将 Bash 历史记录设置为无限制使用 cd - 返回上一个目录文件名和命令名的制表符自动补全学习如何使用像 less 这样的分页工具阅读手册页或其他大型文本文件（如搜索、滚动等）在 macOS 上使用 pbcopy/pbpaste 将剪贴板内容复制/粘贴到 stdout/stdin在编辑配置文件之前备份它们fzf很多人提到使用 fzf 作为模糊搜索 Shell 历史记录的更好方法。除了作为更好的模糊搜索 Shell 历史记录的工具，人们还提到了一些其他用途：选择 git 分支（git checkout $(git for-each-ref --format='%(refname:short)' refs/heads/ | fzf)）快速查找要编辑的文件（nvim $(fzf)）切换 Kubernetes 上下文（kubectl config use-context $(kubectl config get-contexts -o name | fzf --height=10 --prompt="Kubernetes Context> ")）从测试套件中选择要运行的特定测试一般的模式是使用 fzf 来选择某个对象（文件、git 分支、命令行参数），fzf 将所选对象输出到标准输出，然后将其插入作为另一个命令的命令行参数。你还可以将 fzf 用作工具，自动预览输出并快速迭代，例如：自动预览 jq 的输出（echo '' | fzf --preview "jq {q} < YOURFILE.json"）自动预览 sed 的输出（echo '' | fzf --preview "sed {q} YOURFILE"）自动预览 awk 的输出（echo '' | fzf --preview "awk {q} YOURFILE"）你可以参考这个思路。通常，人们会为 fzf 的使用定义别名，比如输入 gcb 或其他命令，以快速选择要检出的 git 分支。树莓派一些人开始使用树莓派，这样可以更安全地进行实验，而不必担心损坏计算机（只需擦除 SD 卡然后重新开始即可！）。漂亮的 Shell 环境很多人说，当他们开始使用像 oh-my-zsh 或 Fish 这样更用户友好的 Shell 环境时，他们在命令行上感到更舒适。我非常同意这一点 – 我已经使用 Fish 十年了，我非常喜欢它。在这里还有一些其他的事情可以做：有些人说，让他们的终端更漂亮可以帮助他们感到更舒适（“让它变成粉色！”）。设置一个漂亮的 Shell 提示符来提供更多信息（例如，当命令失败时，可以将提示符设置为红色）。特别是 transient prompts（在当前命令设置一个非常花哨的提示符，但在之前的命令中设置一个简单得多的提示符）看起来非常好。一些用于美化终端的工具：我使用 base16-shellpowerlevel10k 是一个流行的漂亮的 Zsh 主题，具有 transient promptsstarship 是一个漂亮的提示符工具在 Mac 上，我认为 iTerm2 比默认的终端更容易自定义。漂亮的文件管理器一些人提到了像 ranger 或 nnn 这样的漂亮的终端文件管理器，这是我之前没有听说过的。一个有帮助的朋友或同事一个可以回答初学者问题并给你指点的人是无价的。通过肩并肩地观察学习有人提到观察更有经验的人使用终端 - 有很多经验丰富的用户甚至没有意识到自己在做什么，你可以从中学到很多小技巧。别名很多人说，为常用任务创建自己的别名或脚本就像是一个神奇的“灵光一现”时刻，因为：他们不必记住语法然后他们就有了一份自己常用命令的列表，可以轻松调用查找示例的备忘单很多手册页没有示例，例如 openssl s\_client 的手册页就没有示例。这使得起步变得更加困难！人们提到了一些备忘单工具，比如：tldr.shcheat（还可以进行编辑 - 你可以添加自己的命令以供以后参考）um（一个非常精简的需要自己构建的系统）例如，openssl 的备忘单 非常棒 - 我认为它几乎包含了我在实际中使用 openssl 时用过的所有内容（除了 openssl s_client 的 -servername 选项）。有人说他们配置了他们的 .bash_profile，这样每次登录时都会打印出一张备忘单。不要试图背诵一些人说他们需要改变自己的方法 - 他们意识到不需要试图记住所有的命令，只需按需查找命令，随着时间的推移，他们会自然而然地记住最常用的命令。（我最近对学习阅读 x86 汇编有了完全相同的体会 - 我正在上一门课程，讲师说“是的，刚开始时可以每次都查找，最终你会记住最常见的指令。”）还有一些人说相反的观点 - 他们使用间隔重复应用程序（如 Anki）来记忆常用的命令。Vim有人提到他们开始在命令行上使用 Vim 编辑文件，一旦他们开始使用终端文本编辑器，使用命令行处理其他事情也变得更自然。此外，显然有一个名为 micro 的新编辑器，像是更好的 pico/nano，适用于那些不想学习 Emacs 或 Vim 的人。桌面上使用 Linux有人说他们开始使用 Linux 作为他们的日常主力系统，而需要修复 Linux 问题可以帮助他们学习。这也是我在大约 2004 年熟悉命令行的方式（我非常喜欢安装各种不同的 Linux 发行版，以找到我最喜欢的那个），但我猜这不是如今最受欢迎的策略。被迫仅使用终端有些人说他们参加了一门大学课程，教授让他们在终端上做所有事情，或者他们自己制定了一个规则，一段时间内必须在终端上完成所有工作。工作坊有几个人说像 Software Carpentry 这样的工作坊（面向科学家的命令行、Git 和 Python/R 编程简介）帮助他们更熟悉命令行。你可以在这里查看 Software Carpentry 课程。书籍和文章一些提到的材料：文章：《终端》《命令行功夫》（包含 UNIX 和 Windows 命令行技巧）书籍：《Effective Linux at The Command Line》《Unix Power Tools》（可能有些过时）《The Linux Pocket guide》视频：Mindy Preston 的 CLI tools aren’t inherently user-hostileGary Bernhardt 的 destroy all software screencastsDistroTube（题图：MJ/c0dc082a-a477-434b-b826-77a42c8f61c3）via: https://jvns.ca/blog/2023/08/08/what-helps-people-get-comfortable-on-the-command-line-/作者：Julia Evans 选题：lujun9972 译者：ChatGPT 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
使用 Python 中的 scaffold 和 click 库，你可以将一个简单的实用程序升级为一个成熟的命令行界面工具。在我的职业生涯中，我写过、用过和看到过很多随意的脚本。一些人需要半自动化完成任务，于是它们诞生了。一段时间后，它们变得越来越大。它们在一生中可能转手很多次。我常常希望这些脚本提供更多的命令行工具式的感觉。但是，从一次性脚本到合适的工具，真正提高质量水平有多难呢？事实证明这在 Python 中并不难。搭建骨架脚本在本文中，我将从一小段 Python 代码开始。我将把它应用到 scaffold 模块中，并使用 click 库扩展它以接受命令行参数。#!/usr/bin/python from glob import glob from os.path import join, basename from shutil import move from datetime import datetime from os import link, unlink LATEST = 'latest.txt' ARCHIVE = '/Users/mark/archive' INCOMING = '/Users/mark/incoming' TPATTERN = '%Y-%m-%d' def transmogrify_filename(fname): bname = basename(fname) ts = datetime.now().strftime(TPATTERN) return '-'.join([ts, bname]) def set_current_latest(file): latest = join(ARCHIVE, LATEST) try: unlink(latest) except: pass link(file, latest) def rotate_file(source): target = join(ARCHIVE, transmogrify_filename(source)) move(source, target) set_current_latest(target) def rotoscope(): file_no = 0 folder = join(INCOMING, '*.txt') print(f'Looking in {INCOMING}') for file in glob(folder): rotate_file(file) print(f'Rotated: {file}') file_no = file_no + 1 print(f'Total files rotated: {file_no}') if __name__ == '__main__': print('This is rotoscope 0.4.1. Bleep, bloop.') rotoscope() 本文所有没有在这里插入显示的代码示例，你都可以在 https://codeberg.org/ofosos/rotoscope 中找到特定版本的代码。该仓库中的每个提交都描述了本文操作过程中一些有意义的步骤。这个片段做了几件事：检查 INCOMING 指定的路径中是否有文本文件如果存在，则使用当前时间戳创建一个新文件名，并将其移动到 ARCHIVE删除当前的 ARCHIVE/latest.txt 链接，并创建一个指向刚刚添加文件的新链接作为一个示例，它很简单，但它会让你理解这个过程。使用 Pyscaffold 创建应用程序首先，你需要安装 scaffold、click 和 tox Python 库。$ python3 -m pip install scaffold click tox 安装 scaffold 后，切换到示例的 rotoscope 项目所在的目录，然后执行以下命令：$ putup rotoscope -p rotoscope \ --force --no-skeleton -n rotoscope \ -d 'Move some files around.' -l GLWT \ -u http://codeberg.org/ofosos/rotoscope \ --save-config --pre-commit --markdown Pyscaffold 会重写我的 README.md，所以从 Git 恢复它：$ git checkout README.md Pyscaffold 在文档中说明了如何设置一个完整的示例项目，我不会在这里介绍，你之后可以探索。除此之外，Pyscaffold 还可以在项目中为你提供持续集成（CI）模板：打包: 你的项目现在启用了 PyPi，所以你可以将其上传到一个仓库并从那里安装它。文档: 你的项目现在有了一个完整的文档文件夹层次结构，它基于 Sphinx，包括一个 readthedocs.org 构建器。测试: 你的项目现在可以与 tox 一起使用，测试文件夹包含运行基于 pytest 的测试所需的所有样板文件。依赖管理: 打包和测试基础结构都需要一种管理依赖关系的方法。setup.cfg 文件解决了这个问题，它包含所有依赖项。预提交钩子: 包括 Python 源代码格式工具 black 和 Python 风格检查器 flake8。查看测试文件夹并在项目目录中运行 tox 命令，它会立即输出一个错误：打包基础设施无法找到相关库。现在创建一个 Git 标记（例如 v0.2），此工具会将其识别为可安装版本。在提交更改之前，浏览一下自动生成的 setup.cfg 并根据需要编辑它。对于此示例，你可以修改 LICENSE 和项目描述，将这些更改添加到 Git 的暂存区，我必须禁用预提交钩子，然后提交它们。否则，我会遇到错误，因为 Python 风格检查器 flake8 会抱怨糟糕的格式。$ PRE_COMMIT_ALLOW_NO_CONFIG=1 git commit 如果这个脚本有一个入口点，用户可以从命令行调用，那就更好了。现在，你只能通过找 .py 文件并手动执行它来运行。幸运的是，Python 的打包基础设施有一个很好的“罐装”方式，可以轻松地进行配置更改。将以下内容添加到 setup.cfg 的 options.entry_points 部分：console_scripts = roto = rotoscope.rotoscope:rotoscope 这个更改会创建一个名为 roto 的 shell 命令，你可以使用它来调用 rotoscope 脚本，使用 pip 安装 rotoscope 后，可以使用 roto 命令。就是这样，你可以从 Pyscaffold 免费获得所有打包、测试和文档设置。你还获得了一个预提交钩子来保证（大部分情况下）你按照设定规则提交。CLI 工具化现在，一些值会硬编码到脚本中，它们作为命令 参数 会更方便。例如，将 INCOMING 常量作为命令行参数会更好。首先，导入 click 库，使用 Click 提供的命令装饰器对 rotoscope() 方法进行装饰，并添加一个 Click 传递给 rotoscope 函数的参数。Click 提供了一组验证器，因此要向参数添加一个路径验证器。Click 还方便地使用函数的内嵌字符串作为命令行文档的一部分。所以你最终会得到以下方法签名：@click.command() @click.argument('incoming', type=click.Path(exists=True)) def rotoscope(incoming): """ Rotoscope 0.4 - Bleep, blooop. Simple sample that move files. """ 主函数会调用 rotoscope()，它现在是一个 Click 命令，不需要传递任何参数。选项也可以使用 环境变量 自动填充。例如，将 ARCHIVE 常量改为一个选项：@click.option('archive', '--archive', default='/Users/mark/archive', envvar='ROTO_ARCHIVE', type=click.Path()) 使用相同的路径验证器。这一次，让 Click 填充环境变量，如果环境变量没有提供任何内容，则默认为旧常量的值。Click 可以做更多的事情，它有彩色的控制台输出、提示和子命令，可以让你构建复杂的 CLI 工具。浏览 Click 文档会发现它的更多功能。现在添加一些测试。测试Click 对使用 CLI 运行器 运行端到端测试 提供了一些建议。你可以用它来实现一个完整的测试（在 示例项目 中，测试在 tests 文件夹中。）测试位于测试类的一个方法中。大多数约定与我在其他 Python 项目中使用的非常接近，但有一些细节，因为 rotoscope 使用 click。在 test 方法中，我创建了一个 CliRunner。测试使用它在一个隔离的文件系统中运行此命令。然后测试在隔离的文件系统中创建 incoming 和 archive 目录和一个虚拟的 incoming/test.txt 文件，然后它调用 CliRunner，就像你调用命令行应用程序一样。运行完成后，测试会检查隔离的文件系统，并验证 incoming 为空，并且 archive 包含两个文件（最新链接和存档文件）。from os import listdir, mkdir from click.testing import CliRunner from rotoscope.rotoscope import rotoscope class TestRotoscope: def test_roto_good(self, tmp_path): runner = CliRunner() with runner.isolated_filesystem(temp_dir=tmp_path) as td: mkdir("incoming") mkdir("archive") with open("incoming/test.txt", "w") as f: f.write("hello") result = runner.invoke(rotoscope, ["incoming", "--archive", "archive"]) assert result.exit_code == 0 print(td) incoming_f = listdir("incoming") archive_f = listdir("archive") assert len(incoming_f) == 0 assert len(archive_f) == 2 要在控制台上执行这些测试，在项目的根目录中运行 tox。在执行测试期间，我在代码中发现了一个错误。当我进行 Click 转换时，rotoscope 只是取消了最新文件的链接，无论它是否存在。测试从一个新的文件系统（不是我的主文件夹）开始，很快就失败了。我可以通过在一个很好的隔离和自动化测试环境中运行来防止这种错误。这将避免很多“它在我的机器上正常工作”的问题。搭建骨架脚本和模块本文到此结束，我们可以使用 scaffold 和 click 完成一些高级操作。有很多方法可以升级一个普通的 Python 脚本，甚至可以将你的简单实用程序变成成熟的 CLI 工具。via: https://opensource.com/article/22/7/bootstrap-python-command-line-application作者：Mark Meyer 选题：lkxed 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
我们并不是每天都会谈论 Linux 的命令行。但正如一些读者指出的那样，你们也想学习一些命令行的技巧。因此，我整理了一份基本的 Linux 网络命令清单，这些命令在我的大学时代帮助了我，让我对如何在网络方面使用 Linux 有了坚定的认识。这些命令将帮助你设置网络，以及解决你在 Linux 系统中可能遇到的各种网络问题。Linux 中的基本网络命令这个汇编包括了 CLI 实用程序，它们将帮助你排除网络问题、监控数据包和连接的设备，以及更多。在我展示这些命令的一些细节之前，让我分享一下我今天要讨论的所有命令的简要概述。命令说明ip操纵路由来分配和配置网络参数traceroute识别数据包到达主机的路径tracepath在追踪网络主机的路径时，获取最大传输单元ping通常用于检查主机和服务器之间的连接情况ss获得有关网络套接字的详细信息dig给出所有关于 DNS 名称服务器的必要信息host输出特定域和主机的 IP 地址hostname主要用于输出和更改主机名curl在网络上通过各种协议传输数据mtrping 和 traceroute 的组合，用于诊断网络whois获取有关注册的域名、IP 地址、名称服务器等信息ifplugstatus检测本地以太网设备的链接状态iftop监视与带宽有关的统计信息tcpdump数据包嗅探和分析工具，用于捕获、分析和过滤网络流量ethtool允许用户配置以太网设备nmcli用于网络连接的故障排除工具nmap主要用于审计网络安全bmon开源工具，用于监控实时带宽firewalld配置防火墙规则的 CLI 工具iperf测量网络性能和调整的工具speedtest-clispeedtest.net 的 CLI 工具，用于检查网速vnstat主要用于监控网络流量和带宽消耗现在，让我们用例子和更深入的方式讨论它们。请注意，并不是所有的命令都会预装。我已经添加了针对 Debian/Ubuntu 的说明。对于其他发行版，请使用你的软件包管理器进行安装。1、ip 命令ip 命令是最基本的，但也是最重要的，你会发现系统管理员经常使用它，其用于从操纵路由到分配和配置网络参数。虽然用例可能无穷无尽，但让我向你展示 ip 命令的最基本用例（寻找 IP 地址）。ip address 同样，你也可以使用 ip 命令来持续监控设备的状态，请使用 monitor 参数而不是我们之前用来获取 IP 地址的 address 参数：ip monitor 2、traceroute使用 traceroute 命令，你可以确定数据包到达主机的路线。而且，当你想询问数据包的传输情况和数据包所走的跳数时，它可能相当有用。默认情况下，你的系统可能没有安装 traceroute，如果你使用的是 Debian 及派生的发行版（包括 Ubuntu），安装时只需使用一个命令：sudo apt install traceroute 例如，追踪到 google.com 的数据包：traceroute google.com 默认情况下，traceroute 会使用 IPv4，但是你可以通过使用 -6 选项来改变这一行为，该选项将指示 traceroute 使用 IPv6。让我告诉你怎么做：3、tracepathtracepath 命令用于发现 MTU（最大传输单元），同时追踪到网络主机的路径。它与我上面讨论的 traceroute 很相似，但它不需要 sudo 权限，而且也没有像它那么多功能。但是，首先什么是 MTU？MTU 就是可以在网络上传输或接收的最大帧或数据包。现在，让我们看一下 google.com 的 tracepath 的基本例子：tracepath google.com 同样，你可以使用 -b 选项同时打印出 IP 地址和主机名。tracepath -b google.com 4、pingping 命令（ 数据包网络飞龙探云手 Packet Internet Groper ?） 可以说是在排除网络故障时最重要的命令之一，因为它是检查主机和服务器之间连接情况的最常用方法。例如，我 ping 谷歌：ping google.com 这里，最后一行（min/avg/max）表示从指定的服务器获得响应的时间。如果你得到一个错误提示 bash: ping: command not found （LCTT 译注：不会吧？），你可以查看我们的指南 如何在 Ubuntu 上安装 Ping。5、ssss（ 套接字统计 socket statistics ）命令用于详细了解网络套接字（在网络上发送和接收数据的端点）。要列出所有监听和非监听的 TCP 连接，你必须使用 -at 选项，如下所示：ss -at 同样，你可以使用 -au 选项对 UDP 端口进行同样的操作：ss -au 6、digdig 命令（ 域信息龙爪手 Domain Information Groper ?）用于获取有关域名的所有必要信息。要在基于 Ubuntu 的发行版上安装 dig 工具，请按照给出的命令进行：sudo apt install dnsutils 现在，让我告诉你如何获取一个特定主机的信息，在这个例子中，我将获取 itsfoss.com 的信息：dig itsfoss.com 7、hosthost 命令主要用于获取一个特定主机的 IP 地址，或者你可以从一个特定的 IP 地址获取主机名。换句话说，它是一个 DNS 查询工具。要找到主机的 IP，你只需要在 host 命令中附加主机名。让我告诉你怎么做：host itsfoss.com 同样，你可以用一个 IP 地址来获取主机名：host 8.8.4.4 8、hostname如果你已经使用了一段时间的 Linux，你一定很熟悉这个命令，因为这主要是用来 改变你的系统的主机名 和 NIS（网络信息系统）的主机名。当不使用任何选项时，它可以得到系统当前的主机名。hostname 从包含所需主机名的文件中改变主机名是这个工具的另一个有趣的功能：sudo hostname -F <filename> 9、curlcurl（ 客户端 URL （ Client URL ） ）命令主要用于在网络上传输数据，支持各种协议，包括 HTTP、FTP、IMAP 和许多其他协议。这个工具是首选的自动化工具，因为它是在没有任何人类互动的情况下工作的，也可以用于端点测试、调试和错误记录。curl 工具没有预装，如果你在任何 Debian 及其派生发行版上，你只需要使用以下命令进行安装：sudo apt install curl 使用 curl 命令 下载文件 非常容易，你只需在 URL 中使用 -O 选项，就可以开始了。curl -O [URL] 在下载大文件时，进度条会很方便，你可以用 curl 的 -# 选项来显示进度条。10、mtr它是 ping 和 traceroute 工具的组合，主要用于网络诊断，并提供网络响应和连接的实时情况。使用 mtr 的最简单方法是用它跟上一个主机名或 IP 地址，它将给出一个实时的 traceroute 报告。mtr [URL/IP] 如果你想让 mtr 同时显示主机名和 IP 地址，你可以把它和 -b 选项配对，如下图：mtr -b [URL] 11、whoiswhois 可以帮助你找到有关注册的域名、IP 地址、名称服务器等信息，因为它是 whois 目录服务的客户端。这个工具可能没有预装在你的设备上，要在基于 Debian/Ubuntu 的发行版上安装，你可以使用给出的命令：sudo apt install whois 一般来说，whois 命令是与给出的域名配对使用的：whois [DomainName] 另外，你也可以用一个 IP 地址来代替域名，你会得到同样的细节。12、ifplugstatusifplugstatus 是一个最基本的，但也是最有用的工具，足以在基本水平上排除连接问题。它用于检测本地以太网的链接状态，其工作方式与 mii-diag、mii-tool 和 ethtool 类似，支持所有三个 API。在基于 Debian/Ubuntu 的发行版上安装，你可以按照给出的命令进行：sudo apt install ifplugd 这个工具没有任何花哨的选项，经常不需要与任何配对选项而使用：ifplugstatus 13、iftopiftop（ 接口的 top Interface TOP ）经常被管理员用来监控与带宽有关的统计数据，当你遇到网络问题时，也可以作为诊断工具使用。这个工具需要手动安装，可以通过给出的命令在运行 Debian/Ubuntu 的机器上轻松安装。sudo apt install iftop 当 iftop 在没有任何选项的情况下使用时，它会显示默认接口的带宽统计。sudo iftop 你也可以通过在设备名称后面加上 -i 选项来指定网络设备。sudo iftop -i <DeviceName>. 在我的例子中，是 enp1s0，所以我的输出将是如下：14、tcpdumptcpdump 是一个数据包嗅探和分析工具，用于捕获、分析和过滤网络流量。它也可以作为一个安全工具使用，因为它将捕获的数据保存在可以 通过 Wireshark 访问 的 pcap 文件中。像许多其他工具一样，tcpdump 没有预装，如果你是在Debian/Ubuntu 上，你可以按照下面的命令进行安装：sudo apt install tcpdump 一旦你完成了安装，你可以获得当前接口的捕获数据包，如下所示：sudo tcpdump 那么如何将捕获的数据包保存在 pcap 文件中呢？让我告诉你怎么做：sudo tcpdump -w Captured_Packets.cap -i < networkdevice > 要访问保存的文件，你需要使用 -r 选项加上文件名。sudo tcpdump -r Captured_Packets.pcap 15、ethtool顾名思义，ethtool 工具主要涉及管理以太网设备。使用这个工具，你可以调整网卡速度、自动协商特性等。但它可能没有预装在你的机器上，可以通过利用给出的命令安装在 Debian/Ubuntu 机器上：sudo apt install ethtool 要获取接口的详细信息，你只需在命令后面加上设备名称，如下所示：sudo ethtool <InterfaceName> 16、nmcli作为一个简单而强大的网络故障排除工具，它是任何系统管理员在排除网络故障时首先使用的工具之一，也可以在脚本中使用。你可以使用 nmcli 命令来监控设备的连接状态：nmcli dev status 当不使用任何选项时，它将带来你系统中所有现有设备的信息：nmcli 17、nmapnmap 是一个探索和审计网络安全的工具。它经常被黑客和安全爱好者使用，因为它允许你获得网络的实时信息、连接到你的网络的 IP 的详细信息、端口扫描，以及更多。要在基于 Debian/Ubuntu 的发行版上安装 nmap 工具，请使用给出的命令：sudo apt install nmap 让我们开始扫描主机名：nmap itsfoss.com 18、bmonbmon 是一个开源的工具，用于监测实时带宽和调试问题，以更人性化的方式呈现统计数据。这个工具最好的部分是图形显示，甚至可以在 HTML 中得到你的输出！安装非常简单，因为 bmon 存在于流行的 Linux 发行版的默认仓库中，这也包括 Debian/Ubuntu。sudo apt install bmon 现在，你只需要启动 bmon，就可以用眼睛愉快地监控带宽了：bmon 19、firewalld管理防火墙可以说是网络安全的核心部分，这个工具允许你添加、配置和删除防火墙的规则。但是 firewalld 需要手动安装，如果你使用的是基于 Debian/Ubuntu 的发行版，你可以利用给出的命令进行安装：sudo apt install firewalld 例如，我将向你展示，如何为公共区域永久地打开 80 端口：sudo firewall-cmd --permanent --zone=public --add-port=80/tcp 同样，要删除最近添加的规则，你必须使用 -remove 选项，如下所示：sudo firewall-cmd --zone=public --remove-port=80/tcp 20、iperfiperf 是一个用 C 语言编写的开源工具，允许用户进行网络性能测量和调整。这个工具存在于 Debian/Ubuntu 的默认资源库中，可以通过给出的命令安装：sudo apt install iperf 要开始监控网络，用户必须通过给出的命令在服务器上启动这个客户端：iperf -s -u 其中，-s 选项表示服务器，-u 选项为 UDP 格式。现在，你可以通过提供首选协议的 IP 地址有效载荷连接到你的服务器（使用 -c 选项表示客户端）。在这个例子中，我选择了 UDP（使用 -u 选项），有效载荷为 100：iperf -c 10.0.2.15 -u 100 21、speedtest-cli顾名思义，这是 speedtest.net 网站的 CLI 工具。这个在 Apache 2.0 许可下发布的开源工具，当你想从 CLI 获得一个可靠的 检查网速 的来源时，会有很大帮助。安装非常简单，如果你是在 Debian/Ubuntu 上，可以利用给出的命令轻松安装：sudo apt install speedtest-cli 一旦你完成了安装部分，你只需要使用一行命令即可测试你的速度：speedtest-cli 22、vnstatvnstat 工具主要被系统管理员用来监控网络流量和带宽消耗（大部分情况下），因为这个工具可以监控你系统的网络接口的流量。和其他网络工具一样，你可以在默认的软件库中找到 vnstat，如果你在 Debian/Ubuntu 上，可以通过给出的命令进行安装：sudo apt install vnstat 你可以使用 vnstat 命令，不需要任何选项，它将带来你系统所有可用接口的基本统计信息：vnstat 对于实时监控，你可以将 vnstat 命令与 -l 选项配对。一个长长的清单，对吗？这个汇编连冰山一角都算不上，只是分享了每个命令的目的和基本例子，因为增加更多的命令会使这个清单变得更长。流行的但 已废弃的 Linux 命令，如 ipconfig，已被故意排除在这个列表之外。如果你很好奇，你可以学习 如何最大限度地利用手册页，这将教会你如何使用任何实用程序的最大潜力。如果我忘了提到任何你喜欢的东西，请在评论中告诉我。via: https://itsfoss.com/basic-linux-networking-commands/作者：Sagar Sharma 选题：lkxed 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如果你更喜欢用终端与系统交互，请了解一下我最喜欢的管理文件的命令。在如 GNOME 或 KDE 等图形桌面中使用鼠标点击管理文件。你点击文件的图标，将它移动到另一个文件夹中，或者移动到回收站里。图形交互使得桌面计算机便于使用。但是在 Linux 中，我们并不总是与图形界面交互。如果你在服务器上工作，那么你可能需要使用命令行来解决问题。即使像我这样使用桌面的用户，可能也更喜欢使用终端和命令行和系统交互。我倾向于通过命令行运行命令来管理我的文件：使用 ls 显示文件ls 对任何使用命令行的人来说，如果不知道有什么文件，工作将很难进行下去。ls 命令 会罗列出文件夹中的文件。例如，要查看 Web 服务器的文档根目录 /var/www/html 中的内容，你可以键入：ls /var/www/html 大多数情况，我使用 ls 命令查看当前文件夹内的文件。只需要输入 ls 即可查看所有文件。例如，当我在我的网页项目的根目录时，输入 ls 后可以看到这些：$ ls about fontawesome fonts index.php styles docs fontawesome.zip images prism ls 命令包含 60 种选项，可以以任意方式显示文件和目录。-l 是一个很有用的选项，可以详细的显示文件，包含权限、文件大小以及所有者等信息。$ ls -l total 6252 drwxrwxr-x. 2 jhall jhall 4096 Jun 22 16:18 about drwxr-xr-x. 2 jhall jhall 4096 Jun 25 16:35 docs drwxr-xr-x. 2 jhall jhall 4096 Jun 7 00:00 fontawesome -rw-r--r--. 1 jhall jhall 6365962 Jun 2 16:26 fontawesome.zip drwxrwxr-x. 2 jhall jhall 4096 Jun 22 16:17 fonts drwxr-xr-x. 2 jhall jhall 4096 Jun 25 13:03 images -rw-rw-r--. 1 jhall jhall 327 Jun 22 16:38 index.php drwxrwxr-x. 2 jhall jhall 4096 Jun 22 16:18 prism drwxrwxr-x. 2 jhall jhall 4096 Jun 22 16:17 styles 上方的文件大小是以字节为单位，或许看起来有点吃力。想要以方便我们阅读的格式查看文件大小，只需要添加 -h 或 --human-readable 选项，能以 G 、M 、K 为单位显示文件大小。$ ls -l --human-readable total 6.2M drwxrwxr-x. 2 jhall jhall 4.0K Jun 22 16:18 about drwxr-xr-x. 2 jhall jhall 4.0K Jun 25 16:35 docs drwxr-xr-x. 2 jhall jhall 4.0K Jun 7 00:00 fontawesome -rw-r--r--. 1 jhall jhall 6.1M Jun 2 16:26 fontawesome.zip drwxrwxr-x. 2 jhall jhall 4.0K Jun 22 16:17 fonts drwxr-xr-x. 2 jhall jhall 4.0K Jun 25 13:03 images -rw-rw-r--. 1 jhall jhall 327 Jun 22 16:38 index.php drwxrwxr-x. 2 jhall jhall 4.0K Jun 22 16:18 prism drwxrwxr-x. 2 jhall jhall 4.0K Jun 22 16:17 styles 现在，ls 将 zip 文件显示为 6.1M 或刚刚超过 6 MB 的文件大小，而不是 6365962。使用 cat、head 和 tail 命令查看文件cat head tail 当显示出文件后，需要检查文件夹中的内容。使用很少几个命令即可做到。以我的 Web 服务器中的 docs 文件夹为例：$ ls docs chapter1.tex chapter4.tex chapter7.tex lorem.txt chapter2.tex chapter5.tex chapter8.tex readme.txt chapter3.tex chapter6.tex chapter9.tex workbook.tex 这些文件是什么？我不知道，幸运的是该目录中有一个 readme.txt 文件，我猜它包含了这个项目目录中文件的描述。如果该文件不是很长，那我可以使用 cat 命令查看它：$ cat docs/readme.txt This is the workbook for the C programming self-paced video series. The main file is the workbook.tex file, which includes the other chapters. 如果这个文件很长，则可以使用 head 命令查看文件的前几行。该命令通常显示前 10 行的内容，不过你也可以使用 -n 或者 --lines 选项来指定行数。例如，使用这两个 head 命令的选项查看 lorem.txt 文件的前三行：$ head -n 3 docs/lorem.txt Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam at ligula eget nunc feugiat pharetra. Nullam nec vulputate augue. Suspendisse tincidunt aliquet $ head --lines=3 docs/lorem.txt Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam at ligula eget nunc feugiat pharetra. Nullam nec vulputate augue. Suspendisse tincidunt aliquet 如果我想要查看文件的最后几行的内容，可以以相同方式使用 tail 命令。同样，这两个 tail 命令分别显示 lorem.txt 文件的最后三行：$ tail -n 3 docs/lorem.txt egestas sodales. Vivamus tincidunt ex sed tellus tincidunt varius. Nunc commodo volutpat risus, vitae luctus lacus malesuada tempor. Nulla facilisi. $ tail --lines=3 docs/lorem.txt egestas sodales. Vivamus tincidunt ex sed tellus tincidunt varius. Nunc commodo volutpat risus, vitae luctus lacus malesuada tempor. Nulla facilisi. 使用 head 和 tail 命令在服务器中查看日志文件十分有用。我有一个小型 Web 服务器运行在家庭网络，用于在网站上线前的测试。最近我发现 Web 服务器的日志很长，我好奇它存在多久了。使用 head 命令，我只打印第一行，可以看到该日志文件是在 2020 年 12 月创建的：$ ls -l --human-readable /var/log/httpd total 13M -rw-r--r--. 1 root root 13M Jun 25 16:23 access_log -rw-r--r--. 1 root root 45K Jun 2 00:00 error_log $ sudo head -n 1 /var/log/httpd/access_log 10.0.0.177 - - [05/Dec/2020:14:58:35 -0600] "GET / HTTP/1.1" 403 5564 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" 使用 rm 命令删除文件rm 在包含示例文本文件的目录中，lorem.txt 文件中包含 “ 乱数假文 Lorem Ipsum ” 文本。这只是印刷行业中使用的虚拟文本，因此 lorem.txt 文件并不属于该项目。让我们用 rm 命令删除这样的文件：$ ls docs chapter1.tex chapter4.tex chapter7.tex lorem.txt chapter2.tex chapter5.tex chapter8.tex readme.txt chapter3.tex chapter6.tex chapter9.tex workbook.tex $ rm docs/lorem.txt $ ls docs chapter1.tex chapter4.tex chapter7.tex readme.txt chapter2.tex chapter5.tex chapter8.tex workbook.tex chapter3.tex chapter6.tex chapter9.tex 由于用 rm 命令删除的文件会直接删除，而不会放入回收站，因此它很危险。安装 trash 命令比较安全，例如 trashy 或 trash-cli 命令。这样你可以在文件永久删除前，将其放入暂存区。$ rm docs/lorem.txt 只需很少的命令即可在命令行中管理文件。使用 ls 命令显示目录中的文件，使用 cat 、head 和 tail 命令查看文件中的内容。使用 rm 或者安全的 trash 命令将不需要的文件删除。这五个命令足以帮你在 Linux 中管理文件。想要了解更多，可以使用 --help 选项来查看如何使用这些命令。例如使用 ls --help 查看 ls 命令如何使用。via: https://opensource.com/article/22/7/manage-files-linux-command-line作者：Jim Hall 选题：lkxed 译者：Donkey 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
要好好利用无所不能的 Linux 命令行提供的所有功能Linux 命令行是极其灵活的。无论你是管理服务器还是在桌面系统上启动终端窗口，都可以通过命令行无所不包的工具包来更新文件、调整系统性能或者管理进程。命令行里发生的事情是非常有趣的。我们发布了许多关于如何充分利用系统的优秀文章，证明了命令行的流行。以下是 8 篇关于 Linux 命令阅读量最高的文章：《使用这些技巧让 Bash 命令历史更加有用》文章地址Bash 是大多数 Linux 系统上的默认命令行 Shell。Seth Kenlon 编写了该指南，用于帮助你了解 Bash 命令历史。修改 Bash 命令历史通常没有听起来那么危险，特别是当你带有目的地修改它的时候。告诉 Bash 你希望它记住什么，甚至还可以直接通过删除你不想要或不需要的条目来重写命令历史。根据需要使用你的历史会话，明智地行使你对命令历史的权力。《如何在 Linux 终端中兼顾特性和性能》文章地址Ricardo Gerardi 非常喜欢命令行应用程序，他花了很多时间在终端上工作。Ricardo 投入了一些时间，把命令行变成了一个令人愉快的工作环境。你可以通过了解如何自定义终端应用程序、主题和提示符，来创建一个功能丰富、易于使用系统资源的终端。《放弃 Bash 转投拥有更优美配置的 fish》文章地址Matt Broberg 最近放弃了默认的命令行解释器 —— Bash，转而支持 fish。fish 自豪地宣称自己是 “90 年代的命令行 shell”。这个以鱼为主题的 “友好的交互式 shell” 为命令行创造了更愉快的体验。阅读 Matt 的文章来进一步了解如何充分利用 fish。如果你不想再对你的终端修修补补，换一个更漂亮的默认 shell，把更多精力放在代码上，不妨试一试 fish。《分析 Linux 里二进制文件的 10 种方式》文章地址我们每天都在和二进制文件打交道，但我们对它们的了解甚少。Linux 提供了一组丰富的工具，使分析二进制文件变得轻而易举！这些简单的命令和工具可以帮助你顺利完成分析二进制文件的任务。无论你的工作角色是什么，了解这些工具的基本知识将帮助你更好地了解你的 Linux 系统。Gaurav Kamathe 介绍了一些最流行的用于管理二进制文件的 Linux 工具和命令，包括 file、nm、strings 和 hexdump。《可用于 Linux 命令行的 4 种 Markdown 工具》文章地址当涉及使用 Markdown 格式的文件时，命令行工具占据了主导地位。它们轻巧、快速、强大而又灵活，其中大多数遵循 Unix “把一件事情做好”的哲学。Scott Nesbitt 回顾了 4 种命令行实用工具，它们可以帮助你更高效地处理 Markdown 文件。《禁用 atime 来提高 Linux 系统性能》文章地址每当我在为家里的电脑升级 Linux 时，我都会把我通常要做的任务列出来。这些年来，它们已经成为了习惯：备份文件、还原系统、重新安装、恢复文件，然后重新安装额外的我最喜欢的应用程序。我还会对系统进行了一些调整。其中一个调整就是 atime，它是 Linux 里每个文件的三个时间戳之一。关掉 atime 是一种简单但有效的提升系统性能的方法。下面是关于 atime` 的介绍，以及为什么它会有影响。《使用 fstrim 延长固态硬盘的寿命》文章地址在过去的十年中，固态硬盘（SSD）带来了一种全新的管理存储的方式。相比传统的机械硬盘，固态硬盘具有一些优点，比如安静、更酷的操作和更快的接口规格。当然，新技术带来了新的维护和管理方法。Alan Formy-Duval 写了一个新的 systemd 服务让你更容易管理固态硬盘。《Linux 命令行工具的 5 种新式替代品》文章地址在我们日常使用的 Linux 或 Unix 系统中，我们会使用许多命令行工具来完成我们的工作，并帮助我们更好地了解和管理我们的系统。多年来，这些工具已经现代化并移植到了不同的系统中。然而，总的来讲，它们仍然保持着最初的想法、外观和感觉。近年来，开源社区已经开发出了提供额外好处的替代工具。Ricardo Gerardi 向我们展示了如何通过这 5 种新的替代品改进旧的命令行工具来获得新的好处。总结把这些文章作为跳板，寻找你自己关于命令行的技巧和花招吧！这份清单里还缺少什么吗？请在下方评论，或者提交一篇你自己的文章！via: https://opensource.com/article/21/1/linux-commands作者：Jim Hall 选题：lujun9972 译者：FYJNEVERFOLLOWS 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Linux 命令行以生产力强而闻名。它也是一个可以获得一些乐趣的地方！去年 11 月，我们分享了一篇文章《7 个好玩的 Linux 命令》，并请读者们告诉我们推荐的“好玩”的 Linux 命令是什么，以及为什么？一些读者在下面分享了他们的最爱：这是我的最爱：当然得有 cowsay！fortune，我最喜欢的 “黑科技” 是让用户连接时的 motd 成为一个幽默的格言。sl，在你的终端上的蒸汽机车。xsnow，另一个 XWindow 黑科技，这个命令可以在你的工作区降雪，并堆积在打开的窗口上。GNOME 复活节彩蛋，在 GNOME 2 中，按下 Alt+F2（打开运行对话框）并输入 free the fish，就可以在你的根窗口中释放 “Wanda the Fish”。如果你点击 Wanda，它就会四处游荡，窜来窜去（一段时间）。~Dave Neary我的一天从这些开始:fortune、cowsay、lolcat紧接着是 curl wttr.in。现在我们可以喝咖啡了 ;-）~Tomasz Waraksacmatrix ，因为每当这个时候，你就会觉得自己被插入了机器。~Gary Smithtelnet towel.blinkenlights.nl 这并不完全是 Linux 特有的，但它还挺棒的。~John 'Warthog9' HawleyXroach 是 20 世纪 90 年代你的窗口管理器的一个很酷的附加功能。当时它与 Tab Window Manager （TWM）和 F Virtual Window Manager （FVWM）一起使用时非常有趣，但我已经多年没有使用它了。当你运行 Xroach 时，它添加了小蟑螂并“住”在你的窗口下。当你移动一个窗口或关闭它时，蟑螂就会窜到另一个窗口下躲起来或跑出屏幕。这只是其中一种使桌面更有趣的小方法。看起来有一个 Xroach 的现代移植，我得找个时间试试。~Jim Hall我在 90 年代末担任过计算机科学的助教，我们的计算机实验室里有 Sun Sparc 工作站。有时学生会在实验室时间里走开而不锁屏。每隔一段时间，我就会在他们不注意的时候在终端上执行 xroach &; clear。XRoach 是个好东西。蟑螂躲在窗口下，在屏幕上窜来窜去，当你移动一个窗口时，又躲在另一个窗口下。~Ann Marie Fred我最喜欢的一个是 hollywood，在 这里 了解下。只需运行它并开始随意按键，你就会让星巴克的每个人都相信你正在摧毁美国。~Clint ByrumJim Hall 对此回应道：这真是太棒了! 这让我想起了 Hacker Typer。它是一个网站而不是一个终端程序。只要调出网站，然后敲击键盘。不管你输入什么，Hacker Typer 的输出都似乎是真正的工作。:-）为了回应 Clint Byrum（和 Jim Hall 的回应）带来的乐趣：这两个我都喜欢! 请欣赏这篇关于 Hollywood 黑科技的 博文。我最爱之一。~Greg Scott你最喜欢的“有趣的” Linux 命令是什么？请在下面的评论中分享你的。via: https://opensource.com/article/22/1/fun-linux-commands作者：Opensource.com 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
为你的用户提供选项是任何应用的一个重要功能，而 Commander.js 使它变得容易做到。你最喜欢的 JavaScript 命令行构建器是什么？JavaScript 是一种为 Web 开发的语言，但它的用处已经远远超出了互联网的范畴。由于 Node.js 和 Electron 这样的项目，JavaScript 既是一种通用的脚本语言，也是一种浏览器组件。有专门设计的 JavaScript 库来构建命令行界面。是的，你可以在你的终端中运行 JavaScript。现在，当你在终端中输入一个命令时，一般都有 选项，也叫 开关 或 标志，你可以用来修改命令的运行方式。这是由 POSIX 规范 定义的一个有用的惯例，所以作为一个程序员，知道如何检测和解析这些选项是很有帮助的。要从 JavaScript 获得此功能，使用旨在简化构建命令行界面的库很有用。我最喜欢的是 Commander.js。它很简单，很灵活，而且很直观。安装 node要使用 Commander.js 库，你必须安装 Node.js。在 Linux 上，你可以用你的包管理器安装 Node。例如，在 Fedora、CentOS、Mageia 和其他系统上：$ sudo dnf install nodejs 在 Windows 和 macOS 上，你可以 从 nodejs.org 网站下载安装程序。安装 Commander.js要安装 Commander.js，请使用 npm 命令：$ npm install commander 在你的 JavaScript 代码中添加一个库在 JavaScript 中，你可以使用 require 关键字在你的代码中包含（或者导入，如果你习惯于 Python）一个库。创建一个名为 example.js 的文件，并在你喜欢的文本编辑器中打开它。在顶部添加这一行，以包括 Commander.js 库：const { program } = require('commander'); JavaScript 中的选项解析要解析选项，你必须做的第一件事是定义你的应用可以接受的有效选项。Commander.js 库可以让你定义短选项和长选项，同时还有一个有用的信息来澄清每个选项的目的。program .description('A sample application to parse options') .option('-a, --alpha', 'Alpha') .option('-b, --beta <VALUE>', 'Specify a VALUE', 'Foo'); 第一个选项，我称之为 --alpha（简写 -a），是一个布尔型开关：它要么存在，要么不存在。它不需要任何参数。第二个选项，我称之为 --beta（简写 -b），接受一个参数，甚至在你没有提供任何参数的情况下指定一个默认值。访问命令行数据当你定义了有效的选项，你就可以使用长的选项名称来引用这些值：program.parse(); const options = program.opts(); console.log('Options detected:'); if (options.alpha) console.log('alpha'); const beta = !options.beta ? 'no' : options.beta; console.log('beta is: %s', beta); 运行应用试着用 node 命令来运行它，首先不使用选项：$ node ./example.js Options detected: beta is: Foo 在用户没有覆盖的情况下，beta 的默认值被使用。再次运行它，这次使用选项：$ node ./example.js --beta hello --alpha Options detected: alpha beta is: hello 这次，测试脚本成功检测到了选项 --alpha，以及用户提供的 --beta 选项的值。选项解析下面是完整的演示代码供你参考：const { program } = require('commander'); program .description('A sample application to parse options') .option('-a, --alpha', 'Alpha') .option('-b, --beta <VALUE>', 'Specify a VALUE', 'Foo'); program.parse(); const options = program.opts(); console.log('Options detected:'); console.log(typeof options); if (options.alpha) console.log(' * alpha'); const beta = !options.beta ? 'no' : options.beta; console.log(' * beta is: %s', beta); 在该项目的 Git 仓库 中还有更多例子。对任何应用来说，包括用户的选项都是一个重要的功能，而 Commander.js 使它很容易做到。除了 Commander.js，还有其他库，但我觉得这个库使用起来很方便快捷。你最喜欢的 JavaScript 命令行构建器是什么？via: https://opensource.com/article/21/11/javascript-command-line-apps作者：Seth Kenlon 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
让用户用命令行选项调整你的 Java 应用程序运行方式。通常向终端中输入命令时，无论是启动 GUI 应用程序还是仅启动终端应用程序，都可以使用 命令行选项 options or switches or flags （以下简称选项）来修改应用程序的运行方式。这是 POSIX 规范 设定的标准，因此能够检测和解析选项对 Java 程序员而言是很有用的技能。Java 中有若干种解析选项的方法，其中我最喜欢用的是 Apache Commons CLI 库，简称 commons-cli。安装 commons-cli如果你使用类似 Maven 之类的项目管理系统以及 集成开发环境 Integrated Development Environment （简称 IDE），可以在项目属性（比如 pom.xml 配置文件或者 Eclipse 和 NetBeans 的配置选项卡）中安装 Apache Commons CLI 库。而如果你采用手动方式管理库，则可以从 Apache 网站下载 该库的最新版本。下载到本地的是几个捆绑在一起的 JAR 文件，你只需要其中的一个文件 commons-cli-X.Y.jar（其中 X 和 Y 代指最新版本号）。把这个 JAR 文件或手动或使用 IDE 添加到项目，就可以在代码中使用了。将库导入至 Java 代码在使用 commons-cli 库之前，必须首先导入它。对于本次选项解析的简单示例而言，可以先在 Main.java 文件中简单写入以下标准代码：package com.opensource.myoptparser; import org.apache.commons.cli.*; public class Main { public static void main(String[] args) { // code } } 至此在 Java 中解析选项的准备工作已经做好了。在 Java 中定义布尔选项要实现解析选项，首先要定义应用程序可接收的有效选项。使用 Option（注意是单数）类来创建选项对象，使用 Options（注意是复数）类来追踪项目中创建的所有选项。首先为选项创建一个组，按照惯例命名为 options： //code Options options = new Options(); 接下来，通过列出短选项（即选项名简写）、长选项（即全写）、默认布尔值（LCTT 译注：设置是否需要选项参数，指定为 false 时此选项不带参，即为布尔选项）和帮助信息来定义选项，然后设置该选项是否为必需项（LCTT 译注：下方创建 alpha 对象的代码中未手动设置此项），最后将该选项添加到包含所有选项的 options 组对象中。在下面几行代码中，我只创建了一个选项，命名为 alpha： //define options Option alpha = new Option("a", "alpha", false, "Activate feature alpha"); options.addOption(alpha); 在 Java 中定义带参选项有时用户需要通过选项提供 true 或 false 以外的信息，比如给出配置文件、输入文件或诸如日期、颜色这样的设置项值。这种情况可以使用 builder 方法，根据选项名简写为其创建属性（例如，-c 是短选项，--config 是长选项）。完成定义后，再将定义好的选项添加到 options 组中： Option config = Option.builder("c").longOpt("config") .argName("config") .hasArg() .required(true) .desc("set config file").build(); options.addOption(config); builder 函数可以用来设置短选项、长选项、是否为必需项（本段代码中必需项设置为 true，也就意味着用户启动程序时必须提供此选项，否则应用程序无法运行）、帮助信息等。使用 Java 解析选项定义并添加所有可能用到的选项后，需要对用户提供的参数进行迭代处理，检测是否有参数同预设的有效短选项列表中的内容相匹配。为此要创建命令行 CommandLine 本身的一个实例，其中包含用户提供的所有参数（包含有效选项和无效选项）。为了处理这些参数，还要创建一个 CommandLineParser 对象，我在代码中将其命名为 parser。最后，还可以创建一个 HelpFormatter 对象（我将其命名为 helper），当参数中缺少某些必需项或者用户使用 --help 或 -h 选项时，此对象可以自动向用户提供一些有用的信息。 // define parser CommandLine cmd; CommandLineParser parser = new BasicParser(); HelpFormatter helper = new HelpFormatter(); 最后，添加一些条件判断来分析用户提供的选项，我们假设这些选项已经作为命令行输入被获取并存储在 cmd 变量中。这个示例应用程序有两种不同类型的选项，但对这两种类型都可以使用 .hasOption 方法加上短选项名称来检测选项是否存在。检测到一个存在的选项后，就可以对数据做进一步操作了。try { cmd = parser.parse(options, args); if(cmd.hasOption("a")) { System.out.println("Alpha activated"); } if (cmd.hasOption("c")) { String opt_config = cmd.getOptionValue("config"); System.out.println("Config set to " + opt_config); } } catch (ParseException e) { System.out.println(e.getMessage()); helper.printHelp("Usage:", options); System.exit(0); } 解析过程有可能会产生错误，因为有时可能缺少某些必需项如本例中的 -c 或 --config 选项。这时程序会打印一条帮助信息，并立即结束运行。考虑到此错误（Java 术语中称为异常），在 main 方法的开头要添加语句声明可能的异常：public static void main(String[] args) throws ParseException { 示例程序至此就大功告成了。测试代码你可以通过调整传递给代码的默认参数来在 IDE 中测试应用程序，或者创建一个 JAR 文件并在终端运行测试。这个过程可能会因 IDE 的不同而不同。具体请参阅相应的 IDE 文档，以及我写过的关于如何创建 JAR 文件的文章，或者参考 Daniel Oh 的关于如何使用 Maven 执行同样操作的文章。首先，省略必需项 -c 或 --config 选项，检测解析器的异常处理：$ java -jar dist/myapp.jar Missing required option: c usage: Usage: -a,--alpha Activate feature alpha -c,--config <config> Set config file 然后提供输入选项再进行测试：java -jar dist/myantapp.jar --config foo -a Alpha activated Config set to foo 选项解析为用户提供选项功能对任何应用程序来说都是很重要的。有了 Java 和 Apache Commons，要实现这个功能并不难。以下是完整的演示代码，供读者参考：package com.opensource.myapp; import org.apache.commons.cli.*; public class Main { /** * @param args the command line arguments * @throws org.apache.commons.cli.ParseException */ public static void main(String[] args) throws ParseException { // define options Options options = new Options(); Option alpha = new Option("a", "alpha", false, "Activate feature alpha"); options.addOption(alpha); Option config = Option.builder("c").longOpt("config") .argName("config") .hasArg() .required(true) .desc("Set config file").build(); options.addOption(config); // define parser CommandLine cmd; CommandLineParser parser = new BasicParser(); HelpFormatter helper = new HelpFormatter(); try { cmd = parser.parse(options, args); if(cmd.hasOption("a")) { System.out.println("Alpha activated"); } if (cmd.hasOption("c")) { String opt_config = cmd.getOptionValue("config"); System.out.println("Config set to " + opt_config); } } catch (ParseException e) { System.out.println(e.getMessage()); helper.printHelp("Usage:", options); System.exit(0); } } } 使用 Java 和选项选项使用户可以调整命令的工作方式。使用 Java 时解析选项的方法有很多，其中之一的 commons-cli 是一个强大而灵活的开源解决方案。记得在你的下一个 Java 项目中尝试一下哦。via: https://opensource.com/article/21/8/java-commons-cli作者：Seth Kenlon 选题：lujun9972 译者：unigeorge 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
Linux 发行版十分好用，而且它们有一些用户可能不知道的技巧。让我们来看看一些命令行实用工具，当你热衷于终端而不是 GUI 时，它们可能更顺手。我们都知道在一个系统上使用终端会更高效。当你编辑和排版一个文本文件时，终端会让你确切的感受到，生活如此简单。本文将向你介绍 wc、sort、tr 和 sed 命令。wcwc 是一个实用工具，全称是 “word count”。顾名思义，它可以用来统计任何文件的行数、单词数和字节数。让我们来看看它是如何工作的：$ wc filename lines words characters filename 输出的是文件的行数、单词数、字符数和文件名。想获得特定的输出，我们必须使用选项：-c 打印字节总数-l 打印行数-w 打印单词总数-m 打印字符总数wc 示例让我们来看看它的运行结果。让我们从一个文本文件 lormipsm.txt 开始。首先，我们通过 cat 查看文件内容，然后使用 wc：$ cat loremipsm.txt Linux is the best-known and most-used open source operating system. As an operating system, Linux is software that sits underneath all of the other software on a computer, receiving requests from those programs and replaying these requests to the computer's hardware. $ wc loremipsm.txt 3 41 268 loremipsm.txt 假设我只想查看文件的字节数：$ wc -c loremipsm.txt 268 loremipsm.txt 查看文件的行数：$ wc -l loremipsm.txt 3 loremipsm.txt 查看文件的单词数：$ wc -w loremipsm.txt 41 loremipsm.txt 现在只查看文件的字符数：$ wc -m loremipsm.txt 268 loremipsm.txt sortsort 命令是最有用的工具之一。它会对文件的数据进行排序。可以根据字符或数字进行升序或降序排列。它也可以用来对文件中的行进行排序和随机化。使用 sort 非常简单。我们需要做的仅仅是提供一个文件名：$ sort filename 默认的是按照字母顺序对数据进行排序。需要注意的是 sort 命令仅仅是对数据进行排序展示。它并不会改写文件。使用 sort 命令的一些有用的选项：-r 将文件中的行按倒序进行排序-R 将文件中的行打乱为随机顺序-o 将输出保存到另一个文件中-k 按照特定列进行排序-t 使用指定的分隔符，而不使用空格-n 根据数值对数据进行排序sort 示例让我们看看 sort 的几个简单示例。我们有一个 list.txt 的文件，包含逗号分隔的名称和数值。首先让我们打印出文件内容并简单排序：$ cat list.txt Cieran Wilks, 9 Adelina Rowland, 4 Hayden Mcfarlnd, 1 Ananya Lamb, 5 Shyam Head, 2 Lauryn Fuents, 8 Kristian Felix, 10 Ruden Dyer, 3 Greyson Meyers, 6 Luther Cooke, 7 $ sort list.txt Adelina Rowland, 4 Ananya Lamb, 5 Cieran Wilks, 9 Greyson Meyers, 6 Hayden Mcfarlnd, 1 Kristian Felix, 10 Lauryn Fuents, 8 Luther Cooke, 7 Ruden Dyer, 3 Shyam Head, 2 现在对数据进行倒序排序：$ sort -r list.txt Shyam Head, 2 Ruden Dyer, 3 Luther Cooke, 7 Lauryn Fuents, 8 Kristian Felix, 10 Hayden Mcfarlnd, 1 Greyson Meyers, 6 Cieran Wilks, 9 Ananya Lamb, 5 Adelina Rowland, 4 让我们打乱数据：$ sort -R list.txt Cieran Wilks, 9 Greyson Meyers, 6 Adelina Rowland, 4 Kristian Felix, 10 Luther Cooke, 7 Ruden Dyer, 3 Lauryn Fuents, 8 Hayden Mcfarlnd, 1 Ananya Lamb, 5 Shyam Head, 2 来看一点更复杂的。这次我们根据第二个字段，也就是数值对数据进行排序，并使用 -o 选项将输出保存到另一个文件中：$ sort -n -k2 -t ',' -o sorted_list.txt list.txt $ ls sorted_list.txt list.txt $ cat sorted_list.txt Hayden Mcfarlnd, 1 Shyam Head, 2 Ruden Dyer, 3 Adelina Rowland, 4 Ananya Lamb, 5 Greyson Meyers, 6 Luther Cooke, 7 Lauryn Fuents, 8 Cieran Wilks, 9 Kristian Felix, 10 这里我们使用 -n 选项按数字顺序进行排序，-k 选项用来指定要排序的字段（在本例中为第 2 个字段），-t 选项指定分隔符或字段分隔符（逗号），-o 选项将输出保存到 sorted_list.txt 文件中。sedsed 是一个流编辑器，用于过滤和转换输出中的文本。这意味着我们不需要对原文件进行修改，只需要对输出进行修改。如果需要，我们可以将更改保存到一个新的文件中。sed 提供了很多有用的选项用于过滤和编辑数据。sed 的语法格式如下：$ sed [OPTION] ‘PATTERN’ filename sed 常用的一些选项：-n 取消默认输出p 打印指定的数据d 删除指定行q 退出 sed 脚本sed 示例我们来看看 sed 是如何运作的。我们从 data 文件开始，其中的字段表示编号、名称、年龄和操作系统。如果行出现在特定的行范围内，该行将打印 2 次：$ cat data 1 Vicky Grant 20 linux 2 Nora Burton 19 Mac 3 Willis Castillo 21 Windows 4 Gilberto Mack 30 Windows 5 Aubrey Hayes 17 windows 6 Allan Snyder 21 mac 7 Freddie Dean 25 linux 8 Ralph Martin 19 linux 9 Mindy Howard 20 Mac $ sed '3,7 p' data 1 Vicky Grant 20 linux 2 Nora Burton 19 Mac 3 Willis Castillo 21 Windows 3 Willis Castillo 21 Windows 4 Gilberto Mack 30 Windows 4 Gilberto Mack 30 Windows 5 Aubrey Hayes 17 windows 5 Aubrey Hayes 17 windows 6 Allan Snyder 21 mac 6 Allan Snyder 21 mac 7 Freddie Dean 25 linux 7 Freddie Dean 25 linux 8 Ralph Martin 19 linux 9 Mindy Howard 20 Mac 这里的操作用单引号括起来，表示第 3 行和第 7 行，并且使用了 p 打印出符合匹配规则的数据。sed 的默认行为是在解析后打印每一行。这意味着由于使用了 p ，第 3 行到第 7 行打印了两次。如何打印文件中特定的行？使用 -n 选项来消除在输出中不匹配的行：$ sed -n '3,7 p' data 3 Willis Castillo 21 Windows 4 Gilberto Mack 30 Windows 5 Aubrey Hayes 17 windows 6 Allan Snyder 21 mac 7 Freddie Dean 25 linux 使用 ‘-n’ 仅仅只有第 3 行到第 7 行会被打印。省略文件中的特定行。使用 d 从输出中删除行：$ sed '3 d' data 1 Vicky Grant 20 linux 2 Nora Burton 19 Mac 4 Gilberto Mack 30 Windows 5 Aubrey Hayes 17 windows 6 Allan Snyder 21 mac 7 Freddie Dean 25 linux 8 Ralph Martin 19 linux 9 Mindy Howard 20 Mac $ sed '5,9 d' data 1 Vicky Grant 20 linux 2 Nora Burton 19 Mac 3 Willis Castillo 21 Windows 4 Gilberto Mack 30 Windows 从文件中搜索特定的关键字：$ sed -n '/linux/ p' data 7 Freddie Dean 25 linux 8 Ralph Martin 19 linux $ sed -n '/linux/I p' data 1 Vicky Grant 20 Linux 7 Freddie Dean 25 linux 8 Ralph Martin 19 linux 在这些例子中，我们在 / / 中使用了一个正则表达式。如果文件中有类似的单词，但大小写不一致，可以使用 I 使得搜索不区分大小写。回想一下，-n 删除了输出中不匹配的行。替换文件中的单词：$ sed 's/linux/linus/' data 1 Vicky Grant 20 Linux 2 Nora Burton 19 Mac 3 Willis Castillo 21 Windows 4 Gilberto Mack 30 Windows 5 Aubrey Hayes 17 windows 6 Allan Snyder 21 mac 7 Freddie Dean 25 linus 8 Ralph Martin 19 linus 9 Mindy Howard 20 Mac 这里 s/ / / 表示它是一个正则表达式。在两个 / 之间的就是定位的单词和需要替换的新单词。trtr 命令可以用来转换或删除字符。它可以将小写字母转换为大写字母，也可以将大写字母转换为小写字母，可以消除重复字符，也可以删除特定字符。tr 的奇怪之处在于，它不同于 wc、sort、sed 那样接受文件作为输入。我们使用 | （管道符）为 tr 命令提供输入。$ cat filename | tr [OPTION] tr 命令使用的一些选项：-d 删除给定输入第一个集合中的指定字符，不做转换-s 将重复出现的字符替换为单个tr 示例现在让我们使用 tr 命令将 letter 文件中的所有小写字符转换为大写字符：$ cat letter Linux is too easy to learn, And you should try it too. $ cat letter | tr 'a-z' 'A-Z' LINUX IS TOO EASY TO LEARN, AND YOU SHOULD TRY IT TOO. 这里的 a-z、A-Z 表示我们想要将 a 到 z 范围内的小写字符转换为大写字符。删除文件中的 o 字符：$ cat letter | tr -d 'o' Linux is t easy t learn, And yu shuld try it t. 从文件中压缩字符 o 意味着如果 o 在文件中重复出现，那么它将会被删除并且只打印一次：$ cat letter | tr -s 'o' Linux is to easy to learn, And you should try it to. 总结这是使用 wc、sort、sed、tr 命令的快速演示。这些命令可以方便快捷的操作终端上的文本文件。你可以使用 man 命令来了解这些命令的更多信息。via: https://fedoramagazine.org/command-line-quick-tips-wc-sort-sed-and-tr/作者：mahesh1b 选题：lujun9972 译者：perfiffer 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
直接在命令行中对文件进行转换、打印、保护等操作。LibreOffice 拥有所有你想要的办公软件套件的生产力功能，使其成为微软 Office 或谷歌套件的流行的开源替代品。LibreOffice 的能力之一是可以从命令行操作。例如，Seth Kenlon 最近解释了如何使用 LibreOffice 用全局 命令行选项将多个文件 从 DOCX 转换为 EPUB。他的文章启发我分享一些其他 LibreOffice 命令行技巧和窍门。在查看 LibreOffice 命令的一些隐藏功能之前，你需要了解如何使用应用选项。并不是所有的应用都接受选项（除了像 --help 选项这样的基本选项，它在大多数 Linux 应用中都可以使用）。$ libreoffice --help 这将返回 LibreOffice 接受的其他选项的描述。有些应用没有太多选项，但 LibreOffice 好几页有用的选项，所以有很多东西可以玩。就是说，你可以在终端上使用 LibreOffice 进行以下五项有用的操作，来让使软件更加有用。1、自定义你的启动选项你可以修改你启动 LibreOffice 的方式。例如，如果你想只打开 LibreOffice 的文字处理器组件：$ libreoffice --writer # 启动文字处理器 你可以类似地打开它的其他组件：$ libreoffice --calc # 启动一个空的电子表格 $ libreoffice --draw # 启动一个空的绘图文档 $ libreoffice --web # 启动一个空的 HTML 文档 你也可以从命令行访问特定的帮助文件：$ libreoffice --helpwriter 或者如果你需要电子表格应用方面的帮助：$ libreoffice --helpcalc 你可以在不显示启动屏幕的情况下启动 LibreOffice：$ libreoffice --writer --nologo 你甚至可以在你完成当前窗口的工作时，让它在后台最小化启动：$ libreoffice --writer --minimized 2、以只读模式打开一个文件你可以使用 --view 以只读模式打开文件，以防止意外地对重要文件进行修改和保存：$ libreoffice --view example.odt 3、打开一个模板文档你是否曾经创建过用作信头或发票表格的文档？LibreOffice 具有丰富的内置模板系统，但是你可以使用 -n 选项将任何文档作为模板：$ libreoffice --writer -n example.odt 你的文档将在 LibreOffice 中打开，你可以对其进行修改，但保存时不会覆盖原始文件。4、转换文档当你需要做一个小任务，比如将一个文件转换为新的格式时，应用启动的时间可能与完成任务的时间一样长。解决办法是 --headless 选项，它可以在不启动图形用户界面的情况下执行 LibreOffice 进程。例如，在 LibreOffic 中，将一个文档转换为 EPUB 是一个非常简单的任务，但使用 libreoffice 命令就更容易：$ libreoffice --headless --convert-to epub example.odt 使用通配符意味着你可以一次转换几十个文档：$ libreoffice --headless --convert-to epub *.odt 你可以将文件转换为多种格式，包括 PDF、HTML、DOC、DOCX、EPUB、纯文本等。5、从终端打印你可以从命令行打印 LibreOffice 文档，而无需打开应用：$ libreoffice --headless -p example.odt 这个选项不需要打开 LibreOffice 就可以使用默认打印机打印，它只是将文档发送到你的打印机。要打印一个目录中的所有文件：$ libreoffice -p *.odt （我不止一次执行了这个命令，然后用完了纸，所以在你开始之前，确保你的打印机里有足够的纸张。）你也可以把文件输出成 PDF。通常这和使用 --convert-to-pdf 选项没有什么区别，但是很容易记住：$ libreoffice --print-to-file example.odt --headless 额外技巧：Flatpak 和命令选项如果你是使用 Flatpak 安装的 LibreOffice，所有这些命令选项都可以使用，但你必须通过 Flatpak 传递。下面是一个例子：$ flatpak run org.libreoffice.LibreOffice --writer 它比本地安装要麻烦得多，所以你可能会受到启发 写一个 Bash 别名 来使它更容易直接与 LibreOffice 交互。令人惊讶的终端选项通过查阅手册页面，了解如何从命令行扩展 LibreOffice 的功能：$ man libreoffice 你是否知道 LibreOffice 具有如此丰富的命令行选项？ 你是否发现了其他人似乎都不了解的其他选项？ 请在评论中分享它们！via: https://opensource.com/article/21/3/libreoffice-command-line作者：Don Watkins 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出