标签 命令行 下的文章

为你的用户提供选项是任何应用的一个重要功能,而 Commander.js 使它变得容易做到。你最喜欢的 JavaScript 命令行构建器是什么?

 title=

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 应用程序运行方式。

 title=

通常向终端中输入命令时,无论是启动 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 中定义带参选项

有时用户需要通过选项提供 truefalse 以外的信息,比如给出配置文件、输入文件或诸如日期、颜色这样的设置项值。这种情况可以使用 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 &lt;config&gt;   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 时,它们可能更顺手。

我们都知道在一个系统上使用终端会更高效。当你编辑和排版一个文本文件时,终端会让你确切的感受到,生活如此简单。

本文将向你介绍 wcsorttrsed 命令。

wc

wc 是一个实用工具,全称是 “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

sort

sort 命令是最有用的工具之一。它会对文件的数据进行排序。可以根据字符或数字进行升序或降序排列。它也可以用来对文件中的行进行排序和随机化。

使用 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 文件中。

sed

sed 是一个流编辑器,用于过滤和转换输出中的文本。这意味着我们不需要对原文件进行修改,只需要对输出进行修改。如果需要,我们可以将更改保存到一个新的文件中。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/ / / 表示它是一个正则表达式。在两个 / 之间的就是定位的单词和需要替换的新单词。

tr

tr 命令可以用来转换或删除字符。它可以将小写字母转换为大写字母,也可以将大写字母转换为小写字母,可以消除重复字符,也可以删除特定字符。

tr 的奇怪之处在于,它不同于 wcsortsed 那样接受文件作为输入。我们使用 | (管道符)为 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-zA-Z 表示我们想要将 az 范围内的小写字符转换为大写字符。

删除文件中的 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.

总结

这是使用 wcsortsedtr 命令的快速演示。这些命令可以方便快捷的操作终端上的文本文件。你可以使用 man 命令来了解这些命令的更多信息。


via: https://fedoramagazine.org/command-line-quick-tips-wc-sort-sed-and-tr/

作者:mahesh1b 选题:lujun9972 译者:perfiffer 校对:wxy

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

直接在命令行中对文件进行转换、打印、保护等操作。

 title=

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

 title=

或者如果你需要电子表格应用方面的帮助:

$ 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中国 荣誉推出

作为一个工程师,我们经常与命令行打交道,但除了工作用的命令,你是否尝试过让命令来替代你生活中方方面面?

为了让更多的爱好者可以用命令行作为自己的有效工具,Linux 中国特别邀请了三位作者,撰写了《命令行生存指南》,希望可以通过这个系列的文章,让你换一个视角,来看待命令行的存在。如果你想体验一下不一样的命令行,那就不妨来看看今天的《命令行生存指南》。

本次的内容为试读内容,也欢迎你针对今天的内容提出自己的意见和建议。

操作概述

备份文件时常常涉及到大文件传输的问题,遇到网络质量不佳或者其他问题常常会导致传输中断,而不得不进行重传。如果采用先将大文件拆分成多个小文件进行传输、待全部传输完成后合并所有文件的方式,往往可以改善传输体验。

这一节将会介绍 Linux 命令行下的文件拆分与合并操作。

概念和术语

拆分,顾名思义,就是将一个大的文件分割成若干个较小的文件,这些小文件按次序拼接后可以还原大文件。通常情况下,根据文件大小进行拆分是较为常见的方式;但由于文本文件具有行数特征,所以除了按大小拆分之外,也可以按行数拆分。

合并,就是将若干个较小的文件拼接成一个较大文件。通常只需要按次序连接即可,相对比较简单。

通常情况下,为确保拆分前和合并后的两个文件相同,需要进行验证。

操作实战

场景一:使用 split 拆分文件

难度
演示用发行版Fedora 32
涉及命令split

split 是 Linux 环境提供的文件拆分实用程序,同时支持二进制文件和文本文件。通常情况下已经随 coreutils 内置于系统中,无需另行安装。

按大小拆分

二进制文件和文本文件按大小拆分时使用的选项不同:

  • 二进制文件使用 -b 选项指定分割后的文件大小。
  • 文本文件则使用 -C 选项指定分割后的文件大小。

二者用法类似,只需要:

split [选项] [大小] [待拆分文件] [拆分后的前缀(可选)]

以将 debian-live-10.5.0-amd64-lxqt.iso(约 2.4 GB)按 100MB 大小进行拆分为例:

> split -b 100M debian-live-10.5.0-amd64-lxqt.iso debian-live-

可以看到原文件被拆分成 25 个更小的文件,从 aa 到 ay:

debian-live-aa  debian-live-ad  debian-live-ag  debian-live-aj  debian-live-am  debian-live-ap  debian-live-as  debian-live-av  debian-live-ay
debian-live-ab  debian-live-ae  debian-live-ah  debian-live-ak  debian-live-an  debian-live-aq  debian-live-at  debian-live-aw
debian-live-ac  debian-live-af  debian-live-ai  debian-live-al  debian-live-ao  debian-live-ar  debian-live-au  debian-live-ax

场景二:使用 cat 合并文件

难度
演示用发行版Fedora 32
涉及命令catdiff

cat 是 linux 环境提供的文件连接实用程序,能够连接文件并将其输出到标准输出。通常情况下已经随 coreutils 内置于系统中,无需另行安装。

值得注意的是,为了保证合并后的文件和原始文件一致,在有条件的情况下,可以用 diff 命令验证。

合并拆分后的文件

使用 cat 合并文件可以采用 cat [文件...] > [合并后的文件名] 的格式,此方法对二进制文件和文本文件均有效。

以之前的 debian-live-aa 到 debian-live-ay 为例,合并时可以使用此命令:

> cat debian-live-* > debian-live.iso

可以看到目录下会生成合并后的 debian-live.iso 文件。

debian-live-aa  debian-live-ad  debian-live-ag  debian-live-aj  debian-live-am  debian-live-ap  debian-live-as  debian-live-av  debian-live-ay
debian-live-ab  debian-live-ae  debian-live-ah  debian-live-ak  debian-live-an  debian-live-aq  debian-live-at  debian-live-aw  debian-live.iso
debian-live-ac  debian-live-af  debian-live-ai  debian-live-al  debian-live-ao  debian-live-ar  debian-live-au  debian-live-ax

使用 diff 验证文件

只需要按 diff [原文件] [现文件] 的格式执行即可。如果没有输出,则证明两个文件之间没有差异。

以对比 debian-live-10.5.0-amd64-lxqt.isodebian-live.iso 为例:

> diff debian-live-10.5.0-amd64-lxqt.iso debian-live.iso
> # 无输出,表示二者是相同的。

小练习

  • 尝试以不同方式拆分系统中的日志文件。

拓展阅读

和绝地武士的原力一样,-f 参数是很强大的,并伴随着潜在的毁灭性,在你能用好的时候又很便利。

近些年来,科幻发烧友开始在每年的 5 月 4 日庆祝星战节,其口号是绝地武士的祝福语”愿 原力 Force 和你同在“。虽然大多数 Linux 用户可能不是绝地武士,但我们依然可以使用 原力 Force 。自然,如果尤达大师只是叫天行者卢克输入什么 “man X-Wing 战机“、“man 原力”,或者 RTFM(去读原力手册,肯定是这个意思对不对),那这电影肯定没啥意思。(LCTT 译注:RTFM 是 “Read The Fucking Manual” 的缩写 —— 读读该死的手册吧)。

很多 Linux 命令都有 -f 选项,意思你现在肯定也知道了,原力(LCTT 译注:force 选项原意是“强制”)!很多时候你先尝试执行命令然后失败了,或者提示你需要补充输入更多选项。通常这都是为了保护你试着改变的文件,或者告诉用户该设备正忙或文件已经存在之类的。

如果你不想被这些提醒打扰或者压根就不在乎,就使用原力吧!

不过要小心,通常使用原力选项是摧毁性的。所以用户一定要格外注意!并且确保你知道自己在做什么!用原力就要承担后果!

以下是一些常见 Linux 命令的原力选项和它们的效果,以及常见使用场景。

cp

cp 是 “copy” 的缩写,这是个被用来复制文件或者目录的命令。其 man 页面 说:

-f, –force

如果已经存在的目标文件无法被打开,删除它并重试

你可能会用它来处理只读状态的文件:

[alan@workstation ~]$ ls -l
total 8
-rw-rw---- 1 alan alan 13 May 1 12:24 Hoth
-r--r----- 1 alan alan 14 May 1 12:23 Naboo
[alan@workstation ~]$ cat Hoth Naboo
Icy Planet

Green Planet

如果你想要复制一个叫做 Hoth 的文件到 Naboo,但因为 Naboo 目前是只读状态,cp 命令不会执行:

[alan@workstation ~]$ cp Hoth Naboo
cp: cannot create regular file 'Naboo': Permission denied

但通过使用原力,cp 会强制执行。Hoth 的内容和文件权限会直接被复制到 Naboo

[alan@workstation ~]$ cp -f Hoth Naboo
[alan@workstation ~]$ cat Hoth Naboo
Icy Planet

Icy Planet

[alan@workstation ~]$ ls -l
total 8
-rw-rw---- 1 alan alan 12 May 1 12:32 Hoth
-rw-rw---- 1 alan alan 12 May 1 12:38 Naboo

ln

ln 命令是用来在文件之间建立链接的,其 man 页面 描述的原力选项如下:

-f, –force

移除当前存在的文件

假设莱娅公主在维护一个 Java 应用服务器,并且她又一个存放这所有 Java 版本的目录,比如:

leia@workstation:/usr/lib/java$ ls -lt
total 28
lrwxrwxrwx 1 leia leia   12 Mar  5  2018 jdk -> jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Mar  5  2018 jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Aug 28  2017 jdk1.8.0_144

正如你所看到的,这里有很多个版本的 JDK,并有一个符号链接指向最新版的 JDK。她接着用一个脚本来安装最新版本的 JDK。但是如果没有原力选项的话以下命令是不会成功的:

tar xvzmf jdk1.8.0_181.tar.gz -C jdk1.8.0_181/
ln -vs jdk1.8.0_181 jdk

tar 命令会解压 .gz 文件到一个特定的目标目录,但 ln 命令会失败,因为这个链接已经存在了。这样的结果是该符号链接不会指向最新版本的 JDK:

leia@workstation:/usr/lib/java$ ln -vs jdk1.8.0_181 jdk
ln: failed to create symbolic link 'jdk/jdk1.8.0_181': File exists
leia@workstation:/usr/lib/java$ ls -lt
total 28
drwxr-x--- 2 leia leia 4096 May  1 15:44 jdk1.8.0_181
lrwxrwxrwx 1 leia leia   12 Mar  5  2018 jdk -> jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Mar  5  2018 jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Aug 28  2017 jdk1.8.0_144

她可以通过使用原力选项强制 ln 更新链接,但这里她还需要使用 -n-n 是因为这个情况下链接其实指向一个目录而非文件。这样的话,链接就会正确指向最新版本的JDK了。

leia@workstation:/usr/lib/java$ ln -vsnf jdk1.8.0_181 jdk
'jdk' -> 'jdk1.8.0_181'
leia@workstation:/usr/lib/java$ ls -lt
total 28
lrwxrwxrwx 1 leia leia 12 May 1 16:13 jdk -> jdk1.8.0_181
drwxr-x--- 2 leia leia 4096 May 1 15:44 jdk1.8.0_181
drwxr-xr-x 8 leia leia 4096 Mar 5 2018 jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Aug 28 2017 jdk1.8.0_144

你可以配置 Java 应用使其一直使用在 /usr/lib/java/jdk 处的 JDK,而不用每次升级都更新。

rm

rm 命令是 “remove” 的缩写(也叫做删除,因为某些系统 del 命令也干这事)。其 man 页面 对原力选项的描述如下:

-f, –force

无视不存在的文件或者参数,不向用户确认

如果你尝试删除一个只读的文件,rm 会寻求用户的确认:

[alan@workstation ~]$ ls -l
total 4
-r--r----- 1 alan alan 16 May  1 11:38 B-wing
[alan@workstation ~]$ rm B-wing 
rm: remove write-protected regular file 'B-wing'?

你一定要输入 y 或者 n 来回答确认才能让 rm 命令继续。如果你使用原力选项,rm 就不会寻求你的确认而直接删除文件:

[alan@workstation ~]$ rm -f B-wing
[alan@workstation ~]$ ls -l
total 0
[alan@workstation ~]$

最常见的 rm 原力选项用法是用来删除目录。 -r(递归)选项会让 rm 删除目录,当和原力选项结合起来,它会删除这个文件夹及其内容而无需用户确认。

rm 命令和一些选项结合起来是致命的,一直以来互联网上都有关于误用 rm 删除整个系统之类的玩笑和鬼故事。比如最出名的一不当心执行 rm -rf . 会直接删除目录和文件(没有用户确认)。(LCTT 译注:真的这么干过的校对飘过~~请按下回车前再三确认:我是谁,我在哪里,我在干什么)

userdel

userdel 命令使用来删除用户的。其 man 页面 是这样描述它的原力选项的:

-f, –force

这个选项会强制移除用户,即便用户当前处于登入状态。它同时还会强制 删除用户的目录和邮件存储,即便这个用户目录被别人共享或者邮件存储并不 属于这个用户。如果 USERGROUPS_ENAB/etc/login.defs 里是 yes 并且有一个组和此用户同名的话,这个组也会被移除,即便这个组还是别 的用户的主要用户组也一样。

注意:这个选项有风险并可能让系统处于不稳定状态。

当欧比旺抵达穆斯塔法星的时候,他知道自己的使命。他需要删掉达斯·维达的用户账户——而达斯还在里面呢。

[root@workstation ~]# ps -fu darth
UID        PID  PPID  C STIME TTY          TIME CMD
darth     7663  7655  0 13:28 pts/3    00:00:00 -bash
[root@workstation ~]# userdel darth
userdel: user darth is currently used by process 7663

因为达斯还登在系统里,欧比旺需要使用原力选项操作 userdel。这能强制删除当前登入的用户。

[root@workstation ~]# userdel -f darth
userdel: user darth is currently used by process 7663
[root@workstation ~]# finger darth
finger: darth: no such user.
[root@workstation ~]# ps -fu darth
error: user name does not exist

正如我们所见到的一样,fingerps 命令让我们确认了达斯已经被删除了。

在 Shell 脚本里使用原力

很多命令都有原力选项,而在 shell 脚本里他们特别有用。因为我们经常使用脚本完成定期或者自动化的任务,避免用户输入至关重要,不然的话自动任务就无法完成了

我希望上面的几个例子能帮你理解一些需要使用原力的情况。你在命令行使用原力或把它们写入脚本之前应当完全理解它们的作用。误用原力会有毁灭性的后果——时常是对整个系统,甚至不仅限于一台设备。


via: https://opensource.com/article/19/5/may-the-force-linux

作者:Alan Formy-Duval 选题:lujun9972 译者:Jerry Ling 校对:wxy

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