# Core Utilities (简体中文)

翻译状态： 本文是英文页面 Core_Utilities 的翻译，最后翻译时间：2014-07-26，点击这里可以查看翻译后英文页面的改动。

本页面或部分需要翻译，部分内容可能已经与英文文章脱节。如果您希望贡献翻译，请访问简体中文翻译组。

附注: please use the first argument of the template to provide more detailed indications.

相关文章

- Bash
- Zsh
- 常用建议
- GNU Project

本文涉及 GNU/Linux 系统的所谓的 "核心" 工具，就像 less, ls, 和 grep，包括了"但不限于"以上集成于GNU coreutils 中的工具。下文提供了颇为丰富的软件技巧和有帮助的其他信息。

## cat

cat (catenate)是一件能够连接并显示多文件的标准Unix工具。

- cat 并不内置于 shell ，不过若您追求高性能，您会发现在很多情况下改用重定向就很方便得许多，例如编写脚本。事实上，`$ < file`的效果就如同`$ cat file`一样。

- 按照以下结构可直接在某文件添加多行文字：

    $  cat << EOF >> path/file
     first line
     ...
     last line
     EOF

- 如果您希望能以倒读顺序显示文件内容，有个工具叫 tac (cat reversed).

## cron

cron 是在 Unix-like 操作系统中的一种计划任务。

参见 cron。

Note: systemd 可以处理许多 cron 用例. 参阅 related article.

## dd

dd 是在 unix 和 类unix 系统中主要用于转换和拷贝文件的命令

Note: cp 等同于不带操作数的 dd ，但其并非被设计用于通用的磁盘擦除程序.

### 检查 dd 运行时的进度

默认情况下在任务完成前 dd 都没有输出，使用 kill 和 `USR1` 信号可以在不结束进程的情况下强制状态输出，打开第二个 root 终端并输入以下命令

    # killall -USR1 dd

Note: 这也将影响到其他运行 dd 的进程.

或者:

    # kill -USR1 pid_of_dd_command

例如:

    # kill -USR1 $(pidof dd)

这将使 dd 立即输出进度到终端，例如:

    605+0 records in
    605+0 records out
    634388480 bytes (634 MB) copied, 8.17097 s, 77.6 MB/s

### dd 衍生

其他类似 dd 带状态输出的程序, 例如一个简单的进度条.

dcfldd
  dcfldd 一个用于鉴证和安全的dd增强版. 它接受多数 dd 的参数并且包括状态输出. 最后一个稳定版于2006年12月19日发布.[1]

ddrescue
  GNU ddrescue 是一个数据恢复工具. 它能忽略读取错误, 这在磁盘清理时几乎无用. 参见 official manual 获取跟多细节.

## grep

grep (来自 ed的 g/re/p，全局／正则 表达式／打印） 是最初给 Unix 写的命令行文字搜索工具，`grep`命令在文件或标准输入里搜索符合指定正则表达式模式的行，并把结果打印到标准输出。

- 记住，grep 能直接处理文件，所以用`$ grep pattern file`结构代替`$ cat file | grep pattern`即可。

- 若要 grep 集群服务器（VCS）的源代码，请使用专门的 Perl 工具ack。可访问official web site。

### 彩色化输出

除了美观用途以外，grep的彩色化输出也对学习regexp和grep功能很有用。

请在您的shell配置文件添加以下内容以启用默认的彩色化输出，适用于Bash：

    ~/.bashrc

    alias grep='grep --color=auto'

您还可以直接设置GREP_OPTIONS 环境变量 [2] ，不过这有可能会影响到那些用到grep [3]的脚本：

    export GREP_OPTIONS='--color=auto'

如果要显示行数，添加"-n"参数即可：

    alias grep='grep -n --color=auto'

`GREP_COLORS`环境变量其实可以设定成默认之外的。

## iconv

`iconv` 将转换一个文本的字符编码.

下列命令转换文件`foo`从 ISO-8859-15 到 UTF-8 保存至 `foo.utf`:

    $ iconv -f ISO-8859-15 -t UTF-8 foo >foo.utf

查阅 `man iconv` 获取更多细节.

## ip

ip 显示关于网络设备, IP 地址, 路由表, 和其他Linux IP 软件栈的对象信息.通过附加各种命令, 你可以操纵或配置大多数对象.

Note: ip 命令在iproute2包中提供, 包含在base组.

对象 | 作用 | 手册页名称
--- | --- | ---
ip addr | 协议地址管理 | ip-address
ip addrlabel | 协议地址标签管理 | ip-addrlabel
ip l2tp | tunnel Ethernet over IP (L2TPv3) | ip-l2tp
ip link | 网络设备配置 | ip-link
ip maddr | 多播地址管理 | ip-maddress
ip monitor | 监测 netlink 信息 | ip-monitor
ip mroute | 多播路由缓存管理 | ip-mroute
ip mrule | 多播路由策略数据库的规则 |
ip neigh | 邻居/ARP 表管理 | ip-neighbour
ip netns | process network namespace management | ip-netns
ip ntable | 邻居表配置 | ip-ntable
ip route | 路由表管理 | ip-route
ip rule | 路由策略数据库管理 | ip-rule
ip tcp_metrics | 管理 TCP Metrics | ip-tcp_metrics
ip tunnel | 隧道配置 | ip-tunnel
ip tuntap | 管理 TUN/TAP 设备 |
ip xfrm | 管理 IPsec 策略 | ip-xfrm

`help` 帮助命令可用于所有对象. 例如, 输入 `ip addr help` 将显示地址的命令语法. 高级用法参见 iproute2 documentation.

The Network configuration 显示 ip 命令的多种常见任务中的使用方式.

Note: 您也许很熟悉 ifconfig 命令, 它用于旧版linux的接口配置. 在 archlinx 中现已不赞成使用; 您应当用 ip 替代之.

## less

less 是一个对文本文件内容进行分页显示的终端程序，它和其他的分页显示程序如`more`和`pg`相似，但`less`提供了更高级的界面和更多的功能。[4]

### 通过环境变量设置的彩色化输出

请在您的 shell 配置文件添加：

    ~/.bashrc

    export LESS=-R
    export LESS_TERMCAP_me=$(printf '\e[0m')
    export LESS_TERMCAP_se=$(printf '\e[0m')
    export LESS_TERMCAP_ue=$(printf '\e[0m')
    export LESS_TERMCAP_mb=$(printf '\e[1;32m')
    export LESS_TERMCAP_md=$(printf '\e[1;34m')
    export LESS_TERMCAP_us=$(printf '\e[1;32m')
    export LESS_TERMCAP_so=$(printf '\e[1;44;1m')

值随您所愿修改，请参照：ANSI escape code，

### 直接通过包装来彩色化输出

您可直接开启less内置的代码高亮。先安装好source-highlight再在您的Shell配置文件里添加以下：

    ~/.bashrc

    export LESSOPEN="| /usr/bin/source-highlight-esc.sh %s"
    export LESS='-R '

经常使用命令行界面的用户可以安装lesspipe：

    # pacman -S lesspipe

用户可以使用以下 less 命令列出一个压缩包里的文件列表：

    $ less compressed_file.tar.gz

    ==> use tar_file:contained_file to view a file in the archive
    -rw------- username/group  695 2008-01-04 19:24 compressed_file/content1
    -rw------- username/group   43 2007-11-07 11:17 compressed_file/content2
    compressed_file.tar.gz (END)

`lesspipe`还被赋予`less`对文件而不仅是压缩包进行交互的能力，从而成为打开某一种文件的一个新工具（比如用来代替html2text[broken link: replaced by python-html2text]查看html文件。

安装完`lesspipe`后需重新登录以激活其功能，或者运行

    source /etc/profile.d/lesspipe.sh

### 用Vim代替

Vim (visual editor improved)有内置了某脚本，可直接查看文本文件、压缩包或目录的内容。在您的shell配置文件添加以下即可：

    ~/.bashrc

    alias less='/usr/share/vim/vim73/macros/less.sh'

除了less.sh宏外还有另外一种用法, 依赖于 `PAGER`环境变量. 安装 vimpager 并添加以下内容至shell配置文件:

    ~/.bashrc

    export PAGER='vimpager'
    alias less=$PAGER

所有使用 `PAGER` 环境变量的程序, 如 git, 将使用 vim 作为分页程序.

### 读取标准输入时彩色化输出

Note: 建议将这些 环境变量 添加到 `~/.bashrc` or `~/.zshrc`. 因为本节完全基于: `export LESS=R` 写成

当你运行一个命令和使用管道连接 标准输出 (stdout) 到 less 作为分页视图 (e.g. `yaourt -Qe --date | less`), 你也许会发现输出不再是彩色化的. 这通常是因为该程序试图检测如果其 stdout 是交互式终端, 在这种情况下将输出彩色化文本,否则输出未着色文本. 当你想重定向 stdout 到一个文件中，这是一个很好的行为, e.g. `yaourt -Qe --date > pkglst-backup.txt`. 但是，当你想在 `less` 浏览输出时这将不是很好的行为.

一些程序提供禁用交互式 tty 检测的选项:

    # dmesg --color=always | less

如果程序不提供任何类似选项，可以欺骗程序相信stdout 是交互式终端，有几种可行方式:

1. stdoutisatty 是一个用c写成的小程序, 它可以调用 "fake interactive tty". 你可以通过 AUR: stdoutisattyAUR安装. 用法示例:

    $ stdoutisatty yaourt -Qe --date | less

2. socat 是两个独立的数据通道之间的双向数据传输的中继. 基于 GNU readline 且可用的包位于 official repositories: socat. 用法示例:

    $ socat EXEC:"yaourt -Qe --date",pty STDIO | less

3. script 是一个相当古老的实用工具， 可生成终端会话的typescript. 用法示例:

    $ script -fqc 'yaourt -Qe --date' | less

Tip: Perhaps this helper function from stackoverflow will be useful:

    function faketty {script -qfc "$(printf "'%s' " "$@")"}

4. unbuffer 是一个基于 sh 和 Tcl 的很好的 (手册比程序本身还要长), 古老的脚本. unbuffer 附带 expect. 我们只需要这样使用:

    $ unbuffer yaourt -Qe --date | less

5. zpty 是 zsh 的一个模块, 这里有一个来自 依云[5] 的小函数, 将其放入 `~/.zshrc`:

    ptyless() {
        zmodload zsh/zpty
        zpty ptyless ${1+"$@"}            # ptyless, name of pty
        zpty -r ptyless > /tmp/ptyless.$$ # Write to file, just dunno why pipeline doesn't work fine here
        less /tmp/ptyless.$$
        rm -f /tmp/ptyless.$$
        zpty -d ptyless                   # remove used pty
    }

用法:

    $ ptyless yaourt -Qe --date | less

## locate

locate 用于在文件系统中查找文件. 它通过由 updatedb 预生成的或者由守护进程和增量编码压缩过的文件数据库搜索. 它要快于 find, 但需要经常更新数据库.

参见 main article.

## ls

ls是一个Unix和类Unix系统中列出目录里的文件的一个命令。

- ls 可以列出 file permissions.

- 可以使用一个简单的命令别名启用彩色输出功能，`~/.bashrc`文件应该已经有一句从`/etc/skel/.bashrc`复制过来的指定别名命令：

  `alias ls='ls --color=auto'`

  以下步骤可以进一步改进`ls`的彩色输出功能，比如损坏的符号链接显示为红色，把以下内容添加到`~/.bashrc`，然后重新登录，或者把脚本source一下：
  `eval $(dircolors -b)`

## man

man (manual page)是常见于Unix-like操作系统的一种在线软件文档的格式，内容涉及了计算机程序（包括库或系统调用），常见标准或惯例，甚至还有抽象概念。请阅读Man Pages。

## mkdir

mkdir (make directory)是一条创建目录的命令。

- 若需递归地创建一系列目录，就要用到 -p参数了。已经十分熟悉这原理的高级用户也可直接设为内置参数：

      alias mkdir='mkdir -p -v'

  `-v`参数可以使创建目录的消息更为详细。

- 不必使用 chmod 更改权限模式, 用 `-m`选项可直接定义新建目录的访问权限

Note: 如果您仅仅只是想建个临时目录，也许用mktemp (make termporary)更好: `$ mktemp -p`.

## mv

mv (move)是一条移动或重命名文件和目录的命令。使用这命令的风险可不小，请务必小心。

    alias mv=' timeout 8 mv -iv'

这命令别名可以延迟mv 到8秒后才生效，或是当删除三个以上的文件就会进行确认。

## rm

rm (remove)是一条删除文件或目录的命令。

- 它同样十分危险，使用时请提高警觉：

      alias rm=' timeout 3 rm -Iv --one-file-system'

  这种命令别名可延迟rm到3秒后才生效， 或是当删除三个以上的文件就会进行确认，或是限于只在同一个文件系统生效。
  若您想在删除多文件时一一确认，用`-I`代替`-i`即可。
  Zsh 的使用者可在 `timeout` 前加上 `noglob`，避免隐式扩展。

- 若要移除空目錄，使用 rmdir,　若内含文件则命令失败。

## sed

sed (stream editor)是一条专门解析或替换文本的命令。

这里有一系列现成的示范

Note: awk更为优秀，甚至Perl语言也可以。

## seq

seq (sequence)是一条专门排列数字的命令。可以按照Wikipedia上进行练习。

## shred

shred是一条更安全的删除命令，尽管如此也要小心点。

    alias shred=' timeout 3 shred -v'

这种命令别名可延迟shred到3秒后才生效， 或是当删除三个以上的文件就会进行确认。

## sudo

Sudo (as superuser do)是Unix-like操作系统上的一件允许用户以其他用户的权限（一般是超级用户或root）来运行用户的程序，请阅读Sudo。

## 权限相关工具

- chmod (change mode) 是一个 Unix shell 命令和系统调用名称, 用于修改文件系统对象的访问权限（包括文件和目录）, 也用于指定特殊flags.

- chown (change owner) 用于 Unix-like 系统改变文件拥有者.

- chattr (change attributes) 允许用户设置 linux 系统中文件的某些属性.

- lsattr (list attributes) 列出 linux 扩展文件系统上的属性.

- `ls -l` 列出文件属性.

这些工具在 File permissions and attributes 中说明. 更多高级权限用例请参考 capabilities 和 ACL.

## 另请参阅

- A sampling of coreutils , part 2 , part 3 - coreutils 命令概述

- GNU Coreutils Manpage

- Learn the DD command

Categories:

- System administration (简体中文)
- Command shells (简体中文)