the-art-of-command-line - 一页掌握命令行

Created at: 2015-05-20 23:11:03
Language:

🌍 捷克语德语Ελληνικά英语西班牙语法语印度尼西亚语 ∙ 意大利语日本语한국어polski葡萄牙语 ∙ 罗曼纳语 ∙ Русский斯洛文尼亚语 ∙ Українська简体中文 ∙ 繁體中文

命令行的艺术

注意:我正计划对此进行修订,并寻找新的合著者来帮助将其扩展为更全面的指南。虽然它非常受欢迎,但它可能更广泛、更深入。如果你喜欢写作,并且接近成为该材料的专家并愿意考虑提供帮助,请给我留言 josh (0x40) holloway.com。–jlevy霍洛威。谢谢!

curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' |egrep -o '\w+' |tr -d ''' |牛说-W50

熟练使用命令行是一项经常被忽视或被认为是晦涩难懂的技能,但它以明显和微妙的方式提高了你作为工程师的灵活性和生产力。这是一些关于使用命令行的笔记和技巧,我们发现在 Linux 上工作时很有用。有些技巧是基本的,有些则相当具体、复杂或晦涩难懂。这个页面不长,但如果你能使用和回忆这里的所有项目,你就会知道很多。

这项工作是许多作者和翻译的成果。其中一些最初出现在Quora上,但后来转移到了GitHub上,在那里,比原作者更有才华的人进行了许多改进。如果你有与命令行相关的问题,请提交问题。如果你看到错误或可以做得更好的东西,请做出贡献

范围:

  • 本指南适用于初学者和有经验的用户。目标是广度(所有重要的事情)、具体性(给出最常见情况的具体例子)和简洁(避免不必要的事情或你可以在其他地方轻松查找的题外话)。在某些情况下,每个提示都是必不可少的,或者比替代方案显着节省时间。
  • 这是为 Linux 编写的,但“仅限 macOS”和“仅限 Windows”部分除外。许多其他项目适用于或可以安装在其他 Unices 或 macOS(甚至 Cygwin)上。
  • 重点是交互式 Bash,尽管许多技巧适用于其他 shell 和一般 Bash 脚本。
  • 它既包括“标准”Unix命令,也包括那些需要特殊软件包安装的命令——只要它们足够重要,值得包含。

笔记:

  • 为了将其保留在一个页面上,内容通过引用隐式包含。你足够聪明,一旦你知道谷歌的想法或命令,你就会在其他地方查找更多细节。使用 、 、 、 或(视情况而定)安装新程序。
    apt
    yum
    dnf
    pacman
    pip
    brew
  • 使用 Explainshell 可以对命令、选项、管道等的功能进行有用的细分。

基本

  • 学习基本的 Bash。实际上,输入并至少浏览整个内容;它很容易遵循,而且时间不长。备用 shell 可能很好,但 Bash 功能强大且始终可用(学习 zsh、fish 等,虽然在你自己的笔记本电脑上很诱人,但在许多情况下会限制你,例如使用现有服务器)。

    man bash

  • 至少学习一个基于文本的编辑器。编辑器是最简单的基本编辑(打开、编辑、保存、搜索)之一。然而,对于文本终端中的高级用户来说,Vim()是无可替代的,Vim()是一个难以学习但古老、快速且功能齐全的编辑器。许多人也使用经典的 Emacs,特别是对于大型编辑任务。(当然,任何从事广泛项目的现代软件开发人员都不太可能只使用纯基于文本的编辑器,并且还应该熟悉现代图形 IDE 和工具。

    nano
    vi

  • 查找文档:

    • 知道如何阅读官方文档(对于好奇者,列出部分编号,例如 1 是“常规”命令,5 是文件/约定,8 是管理)。查找带有 的手册页。
      man
      man man
      apropos
    • 要知道有些命令不是可执行文件,而是 Bash 内置函数,你可以通过 和 获得有关它们的帮助。你可以使用 来确定命令是可执行文件、shell 内置文件还是别名。
      help
      help -d
      type command
    • curl cheat.sh/command
      将给出一个简短的“备忘单”,其中包含如何使用 shell 命令的常见示例。
  • 了解如何使用 和 以及管道 使用 的输出和输入重定向。Know 将覆盖输出文件并追加。了解 stdout 和 stderr。

    >
    <
    |
    >
    >>

  • 了解使用 (也许还有 ...) 和引号进行文件通配扩展,以及双引号和单引号之间的区别。(请参阅下文有关变量扩展的更多信息。

    *
    ?
    [
    ]
    "
    '

  • 熟悉 Bash 作业管理:、ctrl-z、ctrl-c、等。

    &
    jobs
    fg
    bg
    kill

  • 了解 ,以及通过 、 等进行无密码身份验证的基础知识。

    ssh
    ssh-agent
    ssh-add

  • 基本文件管理:and(特别是了解每一列的含义)、、、和(甚至更好)、和(了解硬链接与软链接的区别和优势)、、、(有关磁盘使用情况的快速摘要:)。对于文件系统管理,、、、、。了解 inode 是什么 ( 或 )。

    ls
    ls -l
    ls -l
    less
    head
    tail
    tail -f
    less +F
    ln
    ln -s
    chown
    chmod
    du
    du -hs *
    df
    mount
    fdisk
    mkfs
    lsblk
    ls -i
    df -i

  • 基本网络管理:或 、 、 、 。

    ip
    ifconfig
    dig
    traceroute
    route

  • 学习和使用版本控制管理系统,例如 .

    git

  • 熟悉正则表达式,以及 / 的各种标志。、、、和选项值得了解。

    grep
    egrep
    -i
    -o
    -v
    -A
    -B
    -C

  • 学习使用 、 或(取决于发行版)来查找和安装软件包。并确保你必须安装基于 Python 的命令行工具(以下几个最容易安装)。

    apt-get
    yum
    dnf
    pacman
    pip
    pip

日常使用

  • 在 Bash 中,使用 Tab 完成参数或列出所有可用命令,使用 ctrl-r 搜索命令历史记录(按下后,键入进行搜索,反复按 ctrl-r 循环显示更多匹配项,按 Enter 执行找到的命令,或按右箭头将结果放在当前行中以允许编辑)。

  • 在 Bash 中,使用 ctrl-w 删除最后一个单词,并使用 ctrl-u 将当前光标中的内容删除回行首。使用 alt-b 和 alt-f 按单词移动,ctrl-a 将光标移动到行首,ctrl-e 将光标移动到行尾,ctrl-k 将 kill 移动到行尾, ctrl-l 清除屏幕。 请参阅 Bash 中的所有默认键绑定。有很多。例如,alt-. 循环显示先前的参数,alt-* 扩展 glob。

    man readline

  • 或者,如果你喜欢 vi 样式的键绑定,请使用(并将其放回原处)。

    set -o vi
    set -o emacs

  • 对于编辑长命令,在设置编辑器(例如)后,ctrl-x ctrl-e 将在编辑器中打开当前命令进行多行编辑。或者以 vi 风格,escape-v

    export EDITOR=vim

  • 要查看最近的命令,请使用 .跟着(其中是命令编号)再次执行。你还可以使用许多缩写,最有用的可能是最后一个参数和最后一个命令(请参见手册页中的“HISTORY EXPANSION”)。但是,这些通常很容易替换为 ctrl-ralt-.

    history
    !n
    n
    !$
    !!

  • 使用 转到主目录。使用前缀(例如 )访问相对于主目录的文件。在脚本中,将主目录称为 。

    cd
    ~
    ~/.bashrc
    sh
    $HOME

  • 要返回到上一个工作目录:。

    cd -

  • 如果你在键入命令的中途改变了主意,请按 alt-# 在开头添加 a 并将其作为注释输入(或使用 ctrl-a#enter)。然后,你可以稍后通过命令历史记录返回到它。

    #

  • 使用 (或 )。它非常强大。请注意,你可以控制每行执行的项数 () 以及并行度 ()。如果你不确定它是否能做正确的事情,请先使用。另外,很方便。例子:

    xargs
    parallel
    -L
    -P
    xargs echo
    -I{}

      find . -name '*.py' | xargs grep some_function
      cat hosts | xargs -I{} ssh root@{} hostname
  • pstree -p
    是进程树的有用显示。

  • 使用 和 按名称查找进程或发出信号(很有帮助)。

    pgrep
    pkill
    -f

  • 了解你可以发送进程的各种信号。例如,要挂起进程,请使用 .有关完整列表,请参阅

    kill -STOP [pid]
    man 7 signal

  • 使用 或者,如果你希望后台进程永远保持运行。

    nohup
    disown

  • 检查哪些进程正在通过 or(对于 TCP;add 对于 UDP)或(在 macOS 上也有效)进行侦听。

    netstat -lntp
    ss -plat
    -u
    lsof -iTCP -sTCP:LISTEN -P -n

  • 另请参阅 和 有关打开的套接字和文件。

    lsof
    fuser

  • 查看或了解系统已运行了多长时间。

    uptime
    w

  • 用于为常用命令创建快捷方式。例如,创建一个新别名。

    alias
    alias ll='ls -latr'
    ll

  • 保存别名、shell 设置和常用函数,并安排登录 shell 来获取它。这将使你的设置在所有 shell 会话中都可用。

    ~/.bashrc

  • 放置环境变量的设置以及登录时应执行的命令。对于从图形环境登录名和作业启动的 shell,需要单独配置。

    ~/.bash_profile
    cron

  • 同步你的配置文件(例如 和 ) 在具有 Git 的各种计算机中。

    .bashrc
    .bash_profile

  • 了解当变量和文件名包含空格时需要小心。用引号将 Bash 变量括起来,例如 .首选 or 选项以启用空字符来分隔文件名,例如 或。要遍历 for 循环中包含空格的文件名,请使用 将 IFS 设置为仅换行符。

    "$FOO"
    -0
    -print0
    locate -0 pattern | xargs -0 ls -al
    find / -print0 -type d | xargs -0 ls -al
    IFS=$'\n'

  • 在 Bash 脚本中,使用 (或 variant ,用于记录原始输入,包括未展开的变量和注释)来调试输出。使用严格模式,除非你有充分的理由不这样做: 用于在出现错误时中止(非零退出代码)。用于检测未设置的变量用法。还要考虑中止管道中的错误(尽管如果你这样做,请多读一些,因为这个主题有点微妙)。对于更复杂的脚本,也可在 EXIT 或 ERR 上使用。一个有用的习惯是启动这样的脚本,这将使它检测并中止常见错误并打印一条消息:

    set -x
    set -v
    set -e
    set -u
    set -o pipefail
    trap

      set -euo pipefail
      trap "echo 'error: Script failed: see failed command above'" ERR
  • 在 Bash 脚本中,subshell(用括号写)是对命令进行分组的便捷方法。一个常见的例子是暂时移动到不同的工作目录,例如
      # do something in current dir
      (cd /some/other/dir && other-command)
      # continue in original dir
  • 请注意,在 Bash 中有很多种变量扩展。检查变量是否存在:。例如,如果 Bash 脚本需要单个参数,只需编写 .如果变量为空,则使用默认值:。如果要在上一个示例中添加一个附加(可选)参数,可以使用类似 .如果省略,因此为空,则将设置为 。算术展开:。序列:。字符串的修剪:和 .例如,如果 ,则打印 .

    ${name:?error message}
    input_file=${1:?usage: $0 input_file}
    ${name:-default}
    output_file=${2:-logfile}
    $2
    output_file
    logfile
    i=$(( (i + 1) % 5 ))
    {1..10}
    ${var%suffix}
    ${var#prefix}
    var=foo.pdf
    echo ${var%.pdf}.txt
    foo.txt

  • 使用支架扩展 ...可以减少重新键入相似文本的次数,并自动组合项目。这在(移动两个文件)、(扩展到 )或(扩展所有可能的组合并创建目录树)等示例中很有帮助。在任何其他扩展之前执行大括号扩展。

    {
    }
    mv foo.{txt,pdf} some-dir
    cp somefile{,.bak}
    cp somefile somefile.bak
    mkdir -p test-{a,b,c}/subtest-{1,2,3}

  • 展开的顺序为:大括号展开;波浪号扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);分词;和文件名扩展。(例如,不能用变量来表示像这样的范围。请改用 或 循环,例如,或 .)

    {1..20}
    {$a..$b}
    seq
    for
    seq $a $b
    for((i=a; i<=b; i++)); do ... ; done

  • 命令的输出可以像文件一样处理(称为进程替换)。例如,将本地与远程进行比较:

    <(some command)
    /etc/hosts

      diff /etc/hosts <(ssh somehost cat /etc/hosts)
  • 编写脚本时,你可能希望将所有代码放在大括号中。如果缺少右大括号,则脚本将因语法错误而无法执行。当你的脚本要从 Web 下载时,这很有意义,因为它会阻止部分下载的脚本执行:
{
      # Your code here
}
  • “here 文档”允许重定向多行输入,就像从文件中重定向一样:
cat <<EOF
input
on multiple lines
EOF
  • 在 Bash 中,通过以下方式重定向标准输出和标准错误: 或 .通常,为了确保命令不会将打开的文件句柄留给标准输入,将其绑定到你所在的终端,添加 .

    some-command >logfile 2>&1
    some-command &>logfile
    </dev/null

  • 用于具有十六进制和十进制值的良好 ASCII 表。对于常规编码信息,、、和很有帮助。

    man ascii
    man unicode
    man utf-8
    man latin1

  • 使用 或 tmux 对屏幕进行多路复用,这在远程 ssh 会话以及分离和重新附加到会话时特别有用。 可以通过提供更多信息和更轻松的管理来增强屏幕或 TMUX。仅会话持久性的最小替代方法是 dtach

    screen
    byobu

  • 在 ssh 中,知道如何使用 或(偶尔)移植隧道很有用,例如从远程服务器访问网站。

    -L
    -D
    -R

  • 对 ssh 配置进行一些优化可能很有用;例如,这包含避免在某些网络环境中断开连接的设置,使用压缩(这有助于通过低带宽连接进行 SCP),以及使用本地控制文件将通道多路复用到同一服务器:

    ~/.ssh/config

      TCPKeepAlive=yes
      ServerAliveInterval=15
      ServerAliveCountMax=6
      Compression=yes
      ControlMaster auto
      ControlPath /tmp/%r@%h:%p
      ControlPersist yes
  • 与 ssh 相关的其他一些选项对安全敏感,应谨慎启用,例如每个子网或主机或受信任的网络:,

    StrictHostKeyChecking=no
    ForwardAgent=yes

  • 考虑使用 mosh 作为 ssh 的替代方案,它使用 UDP,避免连接中断并增加旅途中的便利性(需要服务器端设置)。

  • 要以八进制形式获取文件的权限,这对系统配置很有用,但在

    ls

      stat -c '%A %a %n' /etc/timezone
  • 要从另一个命令的输出中以交互方式选择值,请使用 percolfzf

  • 要根据另一个命令(如)的输出与文件进行交互,请使用 (PathPicker)。

    git
    fpp

  • 对于当前目录(和子目录)中所有文件的简单 Web 服务器,网络上的任何人都可以使用,请使用:(用于端口 7777 和 Python 2)和(用于端口 7777 和 Python 3)。

    python -m SimpleHTTPServer 7777
    python -m http.server 7777

  • 要以其他用户身份运行命令,请使用 .默认以 root 身份运行;用于指定其他用户。用于以该用户身份登录(系统将要求你输入密码)。

    sudo
    -u
    -i

  • 要将 shell 切换到其他用户,请使用 或 .带有“-”的后者将获得一个环境,就好像另一个用户刚刚登录一样。省略用户名默认为 root。系统将要求你输入要切换到的用户的密码。

    su username
    su - username

  • 了解命令行的 128K 限制。当通配符匹配大量文件时,这种“参数列表太长”错误很常见。(当这种情况发生时,其他方法可能会有所帮助。

    find
    xargs

  • 对于基本的计算器(当然还有对 Python 的一般访问),请使用解释器。例如

    python

>>> 2+3
5

处理文件和数据

  • 在当前目录(或类似目录)中按名称查找文件。要按名称查找任何位置的文件,请使用(但请记住,可能没有为最近创建的文件编制索引)。

    find . -iname '*something*'
    locate something
    updatedb

  • 对于通过源文件或数据文件进行常规搜索,有几个选项比 更高级或更快,包括(按从旧到新的粗略顺序)ackag(“银搜索器”)和 rg (ripgrep)。

    grep -r

  • 要将 HTML 转换为文本:

    lynx -dump -stdin

  • 对于 Markdown、HTML 和各种文档转换,请尝试 pandoc。例如,若要将 Markdown 文档转换为 Word 格式:

    pandoc README.md --from markdown --to docx -o temp.docx

  • 如果你必须处理XML,是旧的,但很好。

    xmlstarlet

  • 对于 JSON,请使用 jq。有关交互式使用,另请参阅 jidjiq

  • 对于 YAML,请使用 shyaml

  • 对于 Excel 或 CSV 文件,csvkit 提供 、 、 、 等。

    in2csv
    csvcut
    csvjoin
    csvgrep

  • 对于 Amazon S3,s3cmd 很方便,而 s4cmd 更快。 亚马逊的AWS和改进的锯对于其他与AWS相关的任务至关重要。

  • 了解 和 ,包括 uniq 和选项 -- 请参阅下面的单行代码。另请参见。

    sort
    uniq
    -u
    -d
    comm

  • 了解 、 和操作文本文件。许多人使用但忘记了.

    cut
    paste
    join
    cut
    join

  • 知道如何计算换行符 ()、字符 ()、单词 () 和字节 ()。

    wc
    -l
    -m
    -w
    -c

  • 知道从 stdin 复制到文件以及 stdout,如 .

    tee
    ls -al | tee file.txt

  • 对于更复杂的计算,包括分组、反转字段和统计计算,请考虑 datamash

  • 要知道,区域设置会以微妙的方式影响许多命令行工具,包括排序顺序(排序规则)和性能。大多数 Linux 安装会将 或其他区域设置变量设置为本地设置,例如美国英语。但请注意,如果更改区域设置,排序将发生变化。并且知道 i18n 例程可以使排序或其他命令的运行速度慢很多倍。在某些情况下(例如下面的集合操作或唯一性操作),你可以安全地完全忽略慢速 i18n 例程,并使用传统的基于字节的排序顺序,使用 .

    LANG
    export LC_ALL=C

  • 你可以通过在特定命令的调用前面加上环境变量设置来设置其环境,如 中所示。

    TZ=Pacific/Fiji date

  • 了解基本和简单的数据整理。有关示例,请参阅单行代码

    awk
    sed

  • 若要替换一个或多个文件中所有出现的字符串,请执行以下操作:

      perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
  • 要重命名多个文件和/或在文件中搜索和替换,请尝试 repren。(在某些情况下,该命令还允许多次重命名,但要小心,因为它的功能在所有 Linux 发行版上都不相同。
    rename
      # Full rename of filenames, directories, and contents foo -> bar:
      repren --full --preserve-case --from foo --to bar .
      # Recover backup files whatever.bak -> whatever:
      repren --renames --from '(.*)\.bak' --to '\1' *.bak
      # Same as above, using rename, if available:
      rename 's/\.bak$//' *.bak
  • 正如手册页所说,它确实是一个快速且非常通用的文件复制工具。它以在计算机之间同步而闻名,但在本地同样有用。当安全限制允许时,使用而不是允许在不从头开始的情况下恢复传输。它也是删除大量文件的最快方法之一:
    rsync
    rsync
    scp
mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
  • 若要在处理文件时监视进度,请使用 pvpycppmonitorprogress、或块级复制。

    rsync --progress
    dd status=progress

  • 用于随机播放或选择文件中的随机行。

    shuf

  • 知道的选择。对于数字,请使用 ,或用于处理人类可读的数字(例如 from )。了解密钥的工作原理(和)。特别要注意的是,你需要编写仅按第一个字段排序; 表示按整行排序。稳定排序 () 可能很有用。例如,要先按字段 2 排序,然后再按字段 1 排序,可以使用 .

    sort
    -n
    -h
    du -h
    -t
    -k
    -k1,1
    -k1
    sort -s
    sort -k1,1 | sort -s -k2,2

  • 如果你需要在 Bash 的命令行中编写制表符(例如,要对 -t 参数进行排序),请按 ctrl-v [Tab] 或编写(后者更好,因为你可以复制/粘贴它)。

    $'\t'

  • 修补源代码的标准工具是 和 。有关差异的汇总统计信息和并排差异,另请参阅。Note 适用于整个目录。用于更改摘要。用于比较和编辑文件。

    diff
    patch
    diffstat
    sdiff
    diff -r
    diff -r tree1 tree2 | diffstat
    vimdiff

  • 对于二进制文件,请使用 ,或用于简单的十六进制转储和 ,或用于二进制编辑。

    hd
    hexdump
    xxd
    bvi
    hexedit
    biew

  • 此外,对于二进制文件,(加号等)可让你查找文本位。

    strings
    grep

  • 对于二进制差异(增量压缩),请使用 .

    xdelta3

  • 要转换文本编码,请尝试 .或用于更高级的使用;它支持一些高级的Unicode内容。例如:

    iconv
    uconv

      # Displays hex codes or actual names of characters (useful for debugging):
      uconv -f utf-8 -t utf-8 -x '::Any-Hex;' < input.txt
      uconv -f utf-8 -t utf-8 -x '::Any-Name;' < input.txt
      # Lowercase and removes all accents (by expanding and dropping them):
      uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC;' < input.txt > output.txt
  • 若要将文件拆分为多个部分,请参阅(按大小拆分)和(按模式拆分)。

    split
    csplit

  • 日期和时间:要以有用的 ISO 8601 格式获取当前日期和时间,请使用(其他选项问题)。要操作日期和时间表达式,请使用 dateutils 中的 、 等。

    date -u +"%Y-%m-%dT%H:%M:%SZ"
    dateadd
    datediff
    strptime

  • 使用 、 、 和 对压缩文件进行操作。

    zless
    zmore
    zcat
    zgrep

  • 文件属性可通过以下方式设置,并提供文件权限的较低级别替代方法。例如,为了防止意外删除文件,不可变标志:

    chattr
    sudo chattr +i /critical/directory/or/file

  • 使用 和 保存和恢复文件权限。例如:

    getfacl
    setfacl

   getfacl -R /some/path > permissions.txt
   setfacl --restore=permissions.txt
  • 要快速创建空文件,请使用(创建稀疏文件)、(ext4、xfs、btrfs 和 ocfs2 文件系统)、(几乎任何文件系统,都包含在 xfsprogs 软件包中)、(用于类 Unix 系统,如 Solaris、Mac OS)。
    truncate
    fallocate
    xfs_mkfile
    mkfile

系统调试

  • 用于 Web 调试,并且很方便,或它们的等价物,或更现代的 httpie

    curl
    curl -I
    wget

  • 要了解当前的 CPU/磁盘状态,经典工具是(或更好)、和 。用于基本 CPU 和详细的每个分区磁盘统计信息和性能见解。

    top
    htop
    iostat
    iotop
    iostat -mxz 15

  • 有关网络连接的详细信息,请使用 和 。

    netstat
    ss

  • 要快速了解系统上发生的情况,则特别有用。要获得最广泛的详细信息概述,请使用 glances

    dstat

  • 要了解内存状态,请运行并了解 和 的输出。特别要注意的是,“cached”值是 Linux 内核作为文件缓存保存的内存,因此实际上计入 “free” 值。

    free
    vmstat

  • Java 系统调试是另一回事,但是在 Oracle 和其他一些 JVM 上,一个简单的技巧是,你可以运行完整的堆栈跟踪和堆摘要(包括分代垃圾回收详细信息,这些信息量很大)将被转储到 stderr/logs 中。JDK 的 、 、 很有用。SJK 工具更先进。

    kill -3 <pid>
    jps
    jstat
    jstack
    jmap

  • 使用 mtr 作为更好的跟踪路由,以识别网络问题。

  • 对于查看磁盘已满的原因,ncdu 比通常的命令(如 .

    du -sh *

  • 要查找哪个套接字或进程正在使用带宽,请尝试 iftopnethogs

  • 该工具(随 Apache 一起提供)有助于快速检查 Web 服务器性能。对于更复杂的负载测试,请尝试 。

    ab
    siege

  • 对于更严重的网络调试,请使用 wiresharktsharkngrep

  • 了解 和 .如果程序失败、挂起或崩溃,而你不知道原因,或者你想要大致了解性能,这些可能会很有帮助。请注意分析选项 () 以及附加到正在运行的进程 () 的功能。使用跟踪子选项 () 可避免错过重要呼叫。

    strace
    ltrace
    -c
    -p
    -f

  • 了解检查共享库等,但切勿在不受信任的文件上运行它

    ldd

  • 了解如何连接到正在运行的进程并获取其堆栈跟踪。

    gdb

  • 用。有时,在调试实时问题时,它非常有用。示例:、、、、(其中是进程 ID 或 pid)。

    /proc
    /proc/cpuinfo
    /proc/meminfo
    /proc/cmdline
    /proc/xxx/cwd
    /proc/xxx/exe
    /proc/xxx/fd/
    /proc/xxx/smaps
    xxx

  • 在调试过去出现问题的原因时,sar 可能非常有帮助。它显示有关 CPU、内存、网络等的历史统计数据。

  • 有关更深入的系统和性能分析,请查看 (SystemTap)、perfsysdig

    stap

  • 检查你使用的操作系统或(一般 Unix/内核信息)或(Linux 发行版信息)。

    uname
    uname -a
    lsb_release -a

  • 每当某些事情表现得非常有趣时(可能是硬件或驱动程序问题),就使用。

    dmesg

  • 如果删除了某个文件,并且它没有释放 报告的预期磁盘空间,请检查该文件是否正在被进程使用:

    du
    lsof | grep deleted | grep "filename-of-my-big-file"

单行本

拼凑命令的几个示例:

  • 有时你可以通过 / 设置文本文件的交集、并集和差异,这非常有用。假设 和 是已唯一的文本文件。这速度很快,适用于任意大小的文件,最高可达数千兆字节。(排序不受内存限制,但如果位于较小的根分区上,则可能需要使用该选项。另请参阅上面关于和 的注释 和 选项(为清楚起见,在下面省略)。
    sort
    uniq
    a
    b
    -T
    /tmp
    LC_ALL
    sort
    -u
      sort a b | uniq > c   # c is a union b
      sort a b | uniq -d > c   # c is a intersect b
      sort a b b | uniq -u > c   # c is set difference a - b
  • 漂亮地打印两个 JSON 文件,规范化其语法,然后对结果进行着色和分页:
      diff <(jq --sort-keys . < file1.json) <(jq --sort-keys . < file2.json) | colordiff | less -R
  • 用于快速检查目录中所有文件的内容(因此每行都与文件名配对),或者(因此每个文件都有一个标题)。这对于填充了配置设置的目录很有用,例如 、 、 中的配置设置。

    grep . *
    head -100 *
    /sys
    /proc
    /etc

  • 对文本文件第三列中的所有数字求和(这可能比等效的 Python 快 3 倍,代码少 3 倍):

      awk '{ x += $3 } END { print x }' myfile
  • 要查看文件树上的大小/日期,这就像递归,但比以下方法更容易阅读:
    ls -l
    ls -lR
      find . -type f -ls
  • 假设你有一个文本文件(如 Web 服务器日志)和某些行上显示的特定值(例如 URL 中存在的参数)。如果你想要计算每个请求的数量:
    acct_id
    acct_id
      egrep -o 'acct_id=[0-9]+' access.log | cut -d= -f2 | sort | uniq -c | sort -rn
  • 要持续监控更改,请使用 ,例如,在对 wifi 设置进行故障排除时,使用 检查对目录中文件的更改或网络设置。

    watch
    watch -d -n 2 'ls -rtlh | tail'
    watch -d -n 2 ifconfig

  • 运行此函数以从此文档中获取随机提示(解析 Markdown 并提取项目):

      function taocl() {
        curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md |
          sed '/cowsay[.]png/d' |
          pandoc -f markdown -t html |
          xmlstarlet fo --html --dropdtd |
          xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" |
          xmlstarlet unesc | fmt -80 | iconv -t US
      }

晦涩但有用

  • expr
    :执行算术运算或布尔运算或计算正则表达式

  • m4
    :简单的宏处理器

  • yes
    :大量打印字符串

  • cal
    : 漂亮的日历

  • env
    :运行命令(在脚本中很有用)

  • printenv
    :打印出环境变量(在调试和脚本中很有用)

  • look
    :查找以字符串开头的英语单词(或文件中的行)

  • cut
    和 :数据操作
    paste
    join

  • fmt
    :设置文本段落的格式

  • pr
    :将文本格式化为页面/列

  • fold
    :换行文本

  • column
    :将文本字段格式化为对齐的固定宽度的列或表格

  • expand
    和 :在制表符和空格之间转换
    unexpand

  • nl
    :添加行号

  • seq
    :打印数字

  • bc
    :计算器

  • factor
    :因子整数

  • gpg:对文件进行加密和签名

  • toe
    :terminfo 条目表

  • nc
    :网络调试和数据传输

  • socat
    :套接字中继和 tcp 端口转发器(类似于
    netcat
    )

  • slurm:网络流量可视化

  • dd
    :在文件或设备之间移动数据

  • file
    :标识文件的类型

  • tree
    :将目录和子目录显示为嵌套树;喜欢但递归
    ls

  • stat
    : 文件信息

  • time
    :执行命令并计时

  • timeout
    :在指定的时间内执行命令,并在指定时间完成后停止进程。

  • lockfile
    :创建只能通过以下方式删除的信号量文件
    rm -f

  • logrotate
    :轮换、压缩和邮件日志。

  • watch
    :重复运行命令,显示结果和/或突出显示更改

  • when-changed:每当看到文件更改时,都会运行你指定的任何命令。另见和。

    inotifywait
    entr

  • tac
    :反向打印文件

  • comm
    :逐行比较排序的文件

  • strings
    :从二进制文件中提取文本

  • tr
    :字符翻译或操作

  • iconv
    或:文本编码的转换
    uconv

  • split
    和 :拆分文件
    csplit

  • sponge
    :在写入之前读取所有输入,对于读取然后写入同一文件很有用,例如,
    grep -v something some-file | sponge some-file

  • units
    :单位换算和计算;将每两周弗隆转换为每眨眼的缇数(另见
    /usr/share/units/definitions.units
    )

  • apg
    :生成随机密码

  • xz
    :高比例文件压缩

  • ldd
    :动态库信息

  • nm
    :来自目标文件的符号

  • ab
    或者 wrk:对 web 服务器进行基准测试

  • strace
    :系统调用调试

  • mtr:更好的网络调试 traceroute

  • cssh
    :可视并发 shell

  • rsync
    :通过 SSH 或本地文件系统同步文件和文件夹

  • wiresharktshark:数据包捕获和网络调试

  • ngrep:网络层的 grep

  • host
    以及:DNS查找
    dig

  • lsof
    :进程文件描述符和套接字信息

  • dstat
    :有用的系统统计信息

  • glances:高级、多子系统概述

  • iostat
    :磁盘使用情况统计信息

  • mpstat
    :CPU 使用率统计

  • vmstat
    :内存使用情况统计

  • htop
    :top 的改进版本

  • last
    :登录历史记录

  • w
    :谁登录了

  • id
    :用户/组标识信息

  • sar: 历史系统统计

  • iftopnethogs:按套接字或进程划分的网络利用率

  • ss
    : socket 统计信息

  • dmesg
    :启动和系统错误消息

  • sysctl
    :在运行时查看和配置 Linux 内核参数

  • hdparm
    :SATA/ATA 磁盘操作/性能

  • lsblk
    :列出块设备:磁盘和磁盘分区的树视图

  • lshw
    、、、、:硬件信息,包括CPU、BIOS、RAID、显卡、设备等。
    lscpu
    lspci
    lsusb
    dmidecode

  • lsmod
    和 :列出并显示内核模块的详细信息。
    modinfo

  • fortune
    、 和 : 嗯,好吧,这取决于你是否认为蒸汽机车和 Zippy 报价“有用”
    ddate
    sl

仅限 macOS

这些项目仅在 macOS 上相关。

  • 使用 (Homebrew) 和/或 (MacPorts) 进行包管理。这些可用于在 macOS 上安装上述许多命令。

    brew
    port

  • 将任何命令的输出复制到桌面应用程序,并粘贴带有 的 的输入。

    pbcopy
    pbpaste

  • 要在 macOS 终端中启用 Option 键作为 alt 键(例如在上述命令中使用的 alt-b、alt-f 等),请打开首选项 ->配置文件 -> 键盘,然后选择“将 Option 用作元键”。

  • 要使用桌面应用程序打开文件,请使用 或 .

    open
    open -a /Applications/Whatever.app

  • 聚焦:使用 搜索文件并使用 列出元数据(如照片 EXIF 信息)。

    mdfind
    mdls

  • 请注意,macOS 基于 BSD Unix,许多命令(例如 、 、 、 )与 Linux 有许多细微的差异,这在很大程度上受到 System V 风格的 Unix 和 GNU 工具的影响。你通常可以通过注意到手册页的标题为“BSD General Commands Manual”来区分。在某些情况下,也可以安装 GNU 版本(例如 GNU awk 和 sed)。如果编写跨平台 Bash 脚本,请避免使用此类命令(例如,考虑 Python 或 )或仔细测试。

    ps
    ls
    tail
    awk
    sed
    gawk
    gsed
    perl

  • 要获取 macOS 版本信息,请使用 .

    sw_vers

仅限 Windows

这些项目仅在 Windows 上相关。

在 Windows 下获取 Unix 工具的方法

  • 通过安装 Cygwin,在 Microsoft Windows 下访问 Unix shell 的强大功能。本文档中描述的大多数内容都是开箱即用的。

  • 在 Windows 10 上,可以使用适用于 Linux 的 Windows 子系统 (WSL),它通过 Unix 命令行实用工具提供熟悉的 Bash 环境。

  • 如果你主要想在 Windows 上使用 GNU 开发者工具(如 GCC),请考虑 MinGW 及其 MSYS 包,它提供了 bash、gawk、make 和 grep 等实用程序。与 Cygwin 相比,MSYS 不具备所有功能。MinGW 对于创建 Unix 工具的本机 Windows 端口特别有用。

  • 在 Windows 下获得 Unix 外观的另一种选择是 Cash。请注意,在此环境中只有极少数 Unix 命令和命令行选项可用。

有用的 Windows 命令行工具

  • 通过学习和使用 ,可以从命令行执行大多数 Windows 系统管理任务并编写脚本。

    wmic

  • 你可能会发现有用的本机命令行 Windows 网络工具包括 、 、 和 。

    ping
    ipconfig
    tracert
    netstat

  • 通过调用该命令,可以执行许多有用的 Windows 任务

    Rundll32

Cygwin提示和技巧

  • 使用 Cygwin 的包管理器安装其他 Unix 程序。

  • 用作命令行窗口。

    mintty

  • 通过 访问 Windows 剪贴板。

    /dev/clipboard

  • 运行以通过其注册的应用程序打开任意文件。

    cygstart

  • 使用 访问 Windows 注册表。

    regtool

  • 请注意,Windows 驱动器路径位于 Cygwin 下,而 Cygwin 的路径显示在 Windows 下。使用 在 Cygwin 和 Windows 样式的文件路径之间转换。这在调用 Windows 程序的脚本中最有用。

    C:\
    /cygdrive/c
    /
    C:\cygwin
    cygpath

更多资源

免責聲明

除了非常小的任务外,编写代码是为了让其他人可以阅读它。权力与责任相伴而生。你可以在 Bash 中做一些事情并不一定意味着你应该这样做!;)

许可证

Creative Commons 许可

本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可