开源项目名称:The Art of Command Line Github地址:https://github.com/jlevy/the-art-of-command-line 这个项目与其他产品项目不同。只是一篇文章,却被翻译成了17种。语言星数高达5万,足以说明该项目的广泛认可度。那我们就来学习一下这篇文章吧:
前言
覆盖范围:
注意事项:
为了在一页上显示尽可能多的内容,一些具体信息可以在引用的页面中找到。我们相信您足够聪明,知道如何使用Google 或其他搜索引擎查找更详细的信息。本文中的一些命令要求您使用apt-get、yum、dnf、pacman、pip 或brew(以及其他合适的包管理器)来安装依赖程序。如果遇到问题,请尝试使用Explainshell来获取相关命令、参数、管道等的解释。
了解Bash 的基础知识。具体来说,在命令行中输入man bash 并至少浏览一次文本;它很容易理解并且不冗长。其他shell 可能工作得很好,但Bash 足够强大并且几乎总是可用(如果你只学习zsh、fish 或其他shell,在你自己的机器上会很方便,但过度依赖这些功能会给你带来不便,例如当你需要在服务器上工作)。熟悉至少一种基于文本的编辑器。一般来说,Vim (vi) 将是您的最佳选择。毕竟,Vim 是在终端中编辑文本时使用的最佳工具(即使在大多数情况下,Vim 比Emacs、大型IDE 或很酷的编辑器更强大)。便于使用)。了解如何使用man 命令来阅读文档。学习使用apropos 查找文档。要知道有些命令并不对应于可执行文件,而是Bash 中内置的。在这种情况下,您可以使用help和help-d命令来获取帮助信息。您可以使用type 命令来确定该命令是可执行文件、shell 内置命令还是别名。学习使用和重定向输出和输入,并学习使用|重定向管道。了解这将覆盖输出文件并添加到文件末尾。了解标准输出stdout 和标准错误stderr。学习使用通配符*(也许还有? 和[.])和引号以及引号中' 和' 之间的区别(稍后会提供一些具体示例)。熟悉Bash中的任务管理工具:ctrl-z、ctrl-c、jobs、fg、bg、kill等。学习使用ssh进行远程命令行登录。最好了解如何使用ssh-agent、ssh-add等命令实现基本的无密码认证登录。学习基本的文件管理工具: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。了解inode 是什么(与ls-i 和df-i 等命令相关)。学习基本的网络管理工具:ip或ifconfig、dig。学习并使用版本控制管理系统,例如git。熟悉正则表达式,学习使用grep/egrep。其中参数-i、-o、-v、-A、-B和-C非常常用,值得认真研究。学习使用apt-get、yum、dnf 或pacman(使用哪一种取决于您的Linux 发行版)来查找和安装软件包。并且确保你的环境中有pip来安装基于Python的命令行工具(接下来提到的一些程序将可以方便地使用pip来安装)。日常使用
在Bash 中,可以通过按Tab 键自动补全参数,并使用ctrl-r 搜索命令行历史记录(按下该键后,输入关键字进行搜索,重复按ctrl-r 会向后搜索匹配项。按Enter 键将执行当前匹配的命令,而按向右箭头键会将匹配项放入当前行而不直接执行,允许进行修改)。在Bash 中,您可以按ctrl-w 删除您输入的最后一个单词,按ctrl-u 删除该行中光标位置之前的内容,按alt-b 和alt-f 以单词为单位移动光标,按ctrl -a 将光标移动到行首,ctrl-e 可以将光标移动到行尾,ctrl-k 可以删除从光标到行尾的所有内容,ctrl-l 可以清除屏幕。输入man readline 查看Bash 中的默认快捷键。有很多东西,比如alt-。循环移动到前一个参数,alt-*可以扩展通配符。如果您愿意,可以运行set-o vi 以使用vi 样式的快捷方式,并运行set-o emacs 将其更改回来。为了方便编辑长命令,设置默认编辑器(例如exportEDITOR=vim)后,ctrl-x ctrl-e 将打开一个编辑器来编辑当前输入的命令。在vi风格中,快捷键是escape-v。输入history查看命令行历史记录,然后使用!n(n是命令号)再次执行。缩写有很多,最有用的可能是!$,它指的是最后输入的参数,而!可以参考最后输入的命令(参见手册页中的“HISTORY EXPANSION”)。但是,您也可以使用快捷键ctrl-r 和alt-。来实现这些功能。 cd命令可以切换工作路径,输入cd~即可进入主目录。要访问主目录中的文件,请使用前缀~(例如~/.bashrc)。在sh脚本中,环境变量$HOME用于引用主目录的路径。返回之前的工作路径:cd-。如果在输入命令时改变主意,请按alt-# 在行首添加#,将其视为注释并按Enter 执行(或按ctrl-a、#,依次输入)。如果这样做,您可以借助命令行历史记录轻松恢复刚刚中途输入的命令。使用xargs(或并行)。他们非常棒。请注意,您可以控制每行参数的数量(-L) 和最大并行数(-P)。如果您不确定它们是否会按照您的想法工作,请先使用xargs echo 进行检查。此外,使用-I{} 也很方便。例如:查找. -名称'*.py' | xargs grep some_function cat 主机| xargs grep some_function xargs -I{} ssh root@{} hostnamepstree -p 以优雅的方式显示进程树。使用pgrep 和pkill 按名称查找进程或发送信号(-f 参数通常很有用)。了解可以发送到进程的信号类型。例如,使用kill-STOP[pid] 来停止进程。使用man7signal 查看详细列表。使用nohup 或disown 来保持后台进程运行。使用netstat-lntp 或ss-plat (默认检查TCP 端口;添加参数-u 以检查UDP 端口)或lsof-iTCP-sTCP:LISTEN-P-n (这也适用于OS X)检查哪些进程正在侦听端口。 lsof 查看打开的套接字和文件。使用uptime 或w 查看系统已经运行了多长时间。使用别名为常用命令创建快捷方式。例如:aliasll='ls -latr' 创建一个新的命令别名ll。您可以在~/.bashrc 中保存别名、shell 选项和常用函数。有关详细信息,请参阅这篇文章。这样做将使您的设置在所有shell 会话中可用。
将环境变量设置和登录时要执行的命令保存在~/.bash_profile中。对于从图形界面启动的shell 和通过cron 启动的shell,需要单独的配置文件。要在多台计算机之间同步配置文件(例如.bashrc 和.bash_profile),您可以使用Git。当变量和文件名包含空格时要特别小心。 Bash 变量应该用引号括起来,例如“$FOO”。尝试使用-0或-print0选项以NULL分隔文件名,例如locate-0pattern|xargs-0ls-al或find/-print0-type d|xargs-0ls-al。如果for 循环中迭代的文件名包含空字符(空格、制表符等),只需使用IFS=\n' 将内部字段分隔符设置为换行符。 set -euo pipelinefail trap 'echo 'error: Script failed: see failed command above'' ERR 在Bash 脚本中,子shell(使用方括号(.))是组织参数的便捷方法。一个常见的例子是临时移动工作目录,代码如下: # do Something in current dir (cd /some/other/dir other-command) # continue in original dir 在Bash 中,变量可以通过多种方式扩展。 ${name:error message} 用于检查变量是否存在。此外,当Bash 脚本仅需要一个参数时,您可以使用类似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} (将扩展到所有可能的组合并创建目录树)。使用(某些命令)可以将输出视为文件。例如,将本地文件/etc/hosts 与远程文件进行比较: diff /etc/hosts (ssh somehost cat /etc/hosts){ # write code here } 了解Bash 中的“此处文档”,例如catEOF.在Bash 中,重定向标准输出和标准错误:some-commandlogfile21 或some-commandlogfile。一般来说,最好在命令后添加/dev/null ,以确保该命令不会在与当前所在终端绑定的标准输入上留下未关闭的文件句柄。使用man ascii 查看包含十六进制和十进制值的ASCII 表。 man unicode、man utf-8 和man latin1 可以帮助您了解一般编码信息。使用screen 或tmux 来使用多个屏幕,这在使用ssh(保存会话信息)时特别有用。而byobu可以为他们提供更多的信息和易于使用的管理工具。另一个轻量级会话持久性解决方案是dtach。在ssh 中,了解如何使用-L 或-D(偶尔使用-R)打开隧道非常有用,例如当您需要从远程服务器访问网页时。
对ssh 设置进行一些小的优化可能会很有用。例如,这个~/.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 percol 或fzf 以交互方式从另一个命令的输出中选择一个值。使用fpp (PathPicker) 根据另一个命令(例如git)的输出与文件进行交互。要将Web 服务器上当前目录中的所有文件(和子目录)公开给网络上的所有用户,请使用: python-mSimpleHTTPServer7777 (使用端口7777 和Python 2)或python-m http.server7777 (使用端口7777 和Python 3) )。要以其他用户身份执行命令,请使用sudo。默认以root用户执行;使用-u 指定另一个用户。使用-i 以该用户身份登录(您需要输入您自己的密码)。要将shell 切换到其他用户,请使用su username 或sudo-username。加入- 将使切换后的环境与该用户登录后的环境相同。省略用户名默认为root。无论您切换到哪个用户,都需要输入该用户的密码。了解命令行上的128K 限制。当使用通配符匹配大量文件名时,经常会遇到“参数列表太长”的错误消息。 (在这种情况下,使用find 或xargs 通常可以解决问题。)当您需要基本计算器时,可以使用python 解释器(当您想使用python 时也是如此)。例如:2+35文件及数据处理
要按名称查找当前目录中的文件,请使用类似于以下的命令:find.-iname '*something*'。要在所有路径中按文件名查找文件,请使用locate Something(但请注意updatedb可能不会索引最近创建的文件,因此您可能无法找到这些未索引的文件)。使用ag在源代码或数据文件中搜索(grep -r也可以做同样的事情,但ag更高级)。将HTML 转换为文本:lynx-dump-stdin。要在Markdown、HTML 和所有文档格式之间进行转换,请尝试pandoc。当你必须处理棘手的XML 时,xmlstarlet 就是一个自古流传下来的神器。使用jq处理JSON。使用shyaml 处理YAML。为了处理Excel 或CSV 文件,csvkit 提供了方便易用的工具,例如in2csv、csvcut、csvjoin 和csvgrep。当您必须处理Amazon S3 相关工作时,s3cmd 是一个非常方便的工具,而s4cmd 效率更高。亚马逊官方提供的aws和saws是其他AWS相关工作的基础,值得学习。在下面的单行脚本部分中了解如何使用sort 和uniq,包括uniq 的-u 参数和-d 参数。您还可以了解通讯。了解如何使用剪切、粘贴和连接来更改文件。许多人使用cut,却忘记join。了解如何使用wc 来计算换行符(-l)、字符(-m)、单词(-w) 和字节(-c)。要执行一些复杂的计算,例如分组、逆序和其他一些统计分析,请考虑使用datamash。请注意,语言设置(中文或英文等)对许多命令行工具有一些微妙的影响,例如排序顺序和性能。大多数Linux 安装都会设置LANG 或其他相关变量以匹配本地设置。请注意,当您更改语言设置时,排序结果可能会发生变化。了解国际化可能会使排序或其他命令的运行速度慢很多倍。在某些情况下(例如集合算术),您可以安全地使用exportLC_ALL=C来忽略国际化并按字节判断顺序。您可以单独指定某个命令的环境,只需在调用时将环境变量设置放在该命令的前面即可。例如,TZ=Pacific/Fijidate 可获取斐济的时间。了解如何使用awk 和sed 进行简单的数据处理。有关示例,请参阅单行代码。替换出现在一个或多个文件中的字符串: perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt 使用repren 批量重命名文件,或在搜索和替换内容中在多个文件中。 (有时rename命令也可以用于批量重命名,但请注意,在不同的Linux发行版中,其功能并不完全相同。) # 重命名所有文件、目录和内容foo - bar: repren --full --preserve -case --从foo --到bar 。 # 恢复所有备份文件whatever.bak -whatever: renames --from '(.*)\.bak' --to '\1' *.bak # 使用rename 实现上述功能(如果有) : rename ' s/\.bak$//' *.bakmkdirempty rsync -r --deleteempty/some-dir rmdirsome-dir 使用shuf 以行为单位打乱文件内容或从文件中随机选择多行。了解排序的参数。显示数字时,使用-n 或-h 可以显示更易读的数字(例如du -h 的输出)。了解关键字在排序时如何工作(-t 和-k)。例如,请注意,您需要-k1,1 仅按第一个字段排序,而-k1 表示按整行排序。稳定排序(sort-s)在某些情况下很有用。
例如,要将第二个字段作为主键,第一个字段作为辅助键进行排序,可以使用sort-k1,1|sort-s-k2,2。标准的源代码比较和合并工具是diff 和patch。使用diffstat 查看变更概览数据。请注意diff -r 适用于整个文件夹。使用diff -r tree1 tree2|diffstat 查看变化的统计信息。 vimdiff 用于比较和编辑文件。对于二进制文件,使用hd、hexdump 或xxd 以十六进制显示它们,使用bvi、hexedit 或biew 进行二进制编辑。同样对于二进制文件,字符串(包括grep 等工具)可以帮助查找二进制文件中的特定位。使用xdelta3 制作二进制差异文件(Delta 压缩)。使用iconv 更改文本编码。如果您需要更高级的功能,可以使用uconv,它支持一些高级Unicode 功能。例如,此命令会删除所有重音符号: uconv -f utf-8 -t utf-8 -x ':Any-Lower;任何-NFD; [:非间距标记:] ;任意-NFC; ' input.txt output.txt 您可以使用split (按大小分割)和csplit (按模式分割)来分割文件。操作日期和时间表达式可以使用dateutils中的dateadd、datediff、strptime等工具。使用zless、zmore、zcat 和zgrep 对压缩文件进行操作。文件属性可以通过chattr设置,它比文件权限更底层。例如,要保护文件不被意外删除,可以使用不可修改的标记: sudo chattr+i /ritic/directory/or/file 使用getfacl 和setfacl 保存和恢复文件权限。例如: getfacl -R /some/path requests.txt setfacl --restore=permissions.txt 要高效创建空文件,请使用truncate (创建稀疏文件)、fallocate (对于ext4、xfs、btrf 和ocfs2 文件系统), xfs_mkfile(适用于几乎所有文件系统,包含在xfsprogs 软件包中)、mkfile(适用于类Unix 操作系统,例如Solaris 和Mac OS)。
系统调试
curl 和curl-I 可以很容易地用于Web 调试,它们的好兄弟wget 也可以,或者您可以尝试更流行的httpie。要获取CPU和硬盘的使用状态,通常使用top(htop更好)、iostat和iotop。而iostat-mxz15可以让你了解CPU和各个硬盘分区的基本信息和性能。使用netstat和ss查看网络连接详细信息。当您想大致了解系统的当前状态时,dstat 非常有用。但是,要深入了解您的系统,请使用概览,它将在终端窗口中为您提供一些系统级数据。要了解内存状态,请运行并了解free 和vmstat 的输出。值得注意的是“cached”的值,它指的是Linux内核用作文件缓存的内存大小,与空闲内存无关。调试Java 系统是完全不同的事情。可用于在Oracle JVM 或其他JVM 上进行调试的一个技巧是,您可以运行kill-3pid,完整的堆栈跟踪和堆概述(包括GC 详细信息)将保存到标准错误或日志文件中。 JDK中的jps、jstat、jstack、jmap非常有用。 SJK 工具更先进。使用mtr 跟踪路由并识别网络问题。使用ncdu来检查磁盘使用情况,比du-sh*等普通命令更节省时间。要查找正在使用带宽的套接字连接或进程,请使用iftop 或nethogs。 ab工具(Apache中包含)可以简单粗暴地检查Web服务器的性能。对于更复杂的负载测试,请使用siege。 wireshark、tshark 和ngrep 可用于复杂的网络调试。了解strace 和ltrace。当您的程序失败、挂起甚至崩溃,并且您不知道原因或想要全面了解性能时,这两个工具非常有用。请注意配置文件参数(-c) 和附加到正在运行的进程的参数(-p)。了解如何使用ldd 检查共享库。但切勿在您不信任的文件上运行。了解如何使用gdb 连接到正在运行的进程并获取其堆栈跟踪。学习使用/proc。在调试持续存在的问题时,它有时会出奇地有效。例如:/proc/cpuinfo、/proc/meminfo、/proc/cmdline、/proc/xxx/cwd、/proc/xxx/exe、/proc/xxx/fd/、/proc/xxx/smaps(这里的xxx表示进程ID 或PID)。 sar 在调试以前的一些问题时非常有用。它显示了CPU、内存、网络等的历史数据。要进行更深入的系统分析和性能分析,请查看stap(SystemTap)、perf和sysdig。要检查当前系统,请使用uname、uname-a(Unix/内核信息)或lsb_release-a(
Linux 发行版信息)。无论什么东西工作得很欢乐(可能是硬件或驱动问题)时可以试试 dmesg。如果你删除了一个文件,但通过 du 发现没有释放预期的磁盘空间,请检查文件是否被进程占用: lsof|grep deleted|grep"filename-of-my-big-file"单行脚本 一些命令组合的例子: sort a b | uniq > c # c 是 a 并 b sort a b | uniq -d > c # c 是 a 交 b sort a b b | uniq -u > c # c 是 a - b使用 grep.*(每行都会附上文件名)或者 head-100*(每个文件有一个标题)来阅读检查目录下所有文件的内容。这在检查一个充满配置文件的目录(如 /sys、 /proc、 /etc)时特别好用。如果你想在文件树上查看大小/日期,这可能看起来像递归版的 ls-l 但比 ls-lR 更易于理解:find . -type f -lsegrep -o 'acct_id=[0-9]+' access.log | cut -d= -f2 | sort | uniq -c | sort -rn要持续监测文件改动,可以使用 watch,例如检查某个文件夹中文件的改变,可以用 watch-d-n2'ls -rtlh | tail';或者在排查 WiFi 设置故障时要监测网络设置的更改,可以用 watch-d-n2ifconfig。运行这个函数从这篇文档中随机获取一条技巧(解析 Markdown 文件并抽取项目):function taocl() { curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README-zh.md| pandoc -f markdown -t html | iconv -f 'utf-8' -t 'unicode' | xmlstarlet fo --html --dropdtd | xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" | xmlstarlet unesc | fmt -80 }冷门但有用 expr:计算表达式或正则匹配m4:简单的宏处理器yes:多次打印字符串cal:漂亮的日历look:查找以特定字符串开头的单词或行cut, paste 和 join:数据修改fmt:格式化文本段落pr:将文本格式化成页/列形式fold:包裹文本中的几行column:将文本格式化成多个对齐、定宽的列或表格expand 和 unexpand:制表符与空格之间转换nl:添加行号seq:打印数字bc:计算器factor:分解因数gpg:加密并签名文件toe:terminfo 入口列表nc:网络调试及数据传输socat:套接字代理,与 netcat 类似slurm:网络流量可视化dd:文件或设备间传输数据file:确定文件类型tree:以树的形式显示路径和文件,类似于递归的 lsstat:文件信息time:执行命令,并计算执行时间timeout:在指定时长范围内执行命令,并在规定时间结束后停止进程lockfile:使文件只能通过 rm-f 移除logrotate: 切换、压缩以及发送日志文件watch:重复运行同一个命令,展示结果并/或高亮有更改的部分when-changed:当检测到文件更改时执行指定命令。参阅 inotifywait 和 entr。tac:反向输出文件shuf:文件中随机选取几行comm:一行一行的比较排序过的文件strings:从二进制文件中抽取文本tr:转换字母iconv 或 uconv:文本编码转换split 和 csplit:分割文件sponge:在写入前读取所有输入,在读取文件后再向同一文件写入时比较有用,例如 grep-v something some-file|sponge some-fileunits:将一种计量单位转换为另一种等效的计量单位(参阅 /usr/share/units/definitions.units)apg:随机生成密码xz:高比例的文件压缩ldd:动态库信息nm:提取 obj 文件中的符号ab 或 wrk:web 服务器性能分析strace:调试系统调用mtr:更好的网络调试跟踪工具cssh:可视化的并发 shellrsync:通过 ssh 或本地文件系统同步文件和文件夹wireshark 和 tshark:抓包和网络调试工具ngrep:网络层的 grephost 和 dig:DNS 查找lsof:列出当前系统打开文件的工具以及查看端口信息dstat:系统状态查看glances:高层次的多子系统总览iostat:硬盘使用状态mpstat: CPU 使用状态vmstat: 内存使用状态htop:top 的加强版last:登入记录w:查看处于登录状态的用户id:用户/组 ID 信息sar:系统历史数据iftop 或 nethogs:套接字及进程的网络利用情况ss:套接字数据dmesg:引导及系统错误信息sysctl: 在内核运行时动态地查看和修改内核的运行参数hdparm:SATA/ATA 磁盘更改及性能分析lsblk:列出块设备信息:以树形展示你的磁盘以及磁盘分区信息lshw, lscpu, lspci, lsusb 和 dmidecode:查看硬件信息,包括 CPU、BIOS、RAID、显卡、USB设备等lsmod 和 modinfo:列出内核模块,并显示其细节fortune, ddate 和 sl:额,这主要取决于你是否认为蒸汽火车和莫名其妙的名人名言是否“有用”仅限 OS X 系统 以下是仅限于 OS X 系统的技巧。 用 brew (Homebrew)或者 port (MacPorts)进行包管理。这些可以用来在 OS X 系统上安装以上的大多数命令。若要在 OS X 终端中将 Option 键视为 alt 键(例如在上面介绍的 alt-b、alt-f 等命令中用到),打开 偏好设置 -> 描述文件 -> 键盘 并勾选“使用 Option 键作为 Meta 键”。用 open 或者 open-a/Applications/Whatever.app 使用桌面应用打开文件。Spotlight:用 mdfind 搜索文件,用 mdls 列出元数据(例如照片的 EXIF 信息)。注意 OS X 系统是基于 BSD UNIX 的,许多命令(例如 ps, ls, tail, awk, sed)都和 Linux 中有微妙的不同( Linux 很大程度上受到了 System V-style Unix 和 GNU 工具影响)。你可以通过标题为 "BSD General Commands Manual" 的 man 页面发现这些不同。在有些情况下 GNU 版本的命令也可能被安装(例如 gawk 和 gsed 对应 GNU 中的 awk 和 sed )。如果要写跨平台的 Bash 脚本,避免使用这些命令(例如,考虑 Python 或者 perl )或者经过仔细的测试。用 sw_vers 获取 OS X 的版本信息。仅限 Windows 系统标签:
用户评论
哇,这个《命令行的艺术》竟然以50,000颗星登上了Github趋势榜榜首!我之前一直对命令行有点敬而远之,现在看来得好好研究研究了。
有5位网友表示赞同!
没想到命令行也能这么火!我之前一直觉得命令行就是编程的累赘,现在看来我得重新审视一下了。
有14位网友表示赞同!
50,000颗星,这个数字太震撼了!《命令行的艺术》到底有什么魅力能让这么多开发者为之疯狂?
有13位网友表示赞同!
命令行登上榜首,这是不是意味着编程的未来又回到命令行了?我有点期待了。
有19位网友表示赞同!
哇,这个《命令行的艺术》太赞了!之前看了一些介绍,感觉自己对命令行有了新的认识。
有17位网友表示赞同!
命令行能登上榜首,说明编程界的变化真是日新月异啊!得赶紧跟上潮流了。
有17位网友表示赞同!
我之前对命令行一点兴趣都没有,但这个标题让我产生了好奇心,一定要去看看这本书。
有11位网友表示赞同!
命令行登上榜首,看来我得重新考虑我的编程技能库了。这个趋势不可忽视。
有13位网友表示赞同!
哇,50,000颗星,这个数字太夸张了!我得看看这本书,看看它到底有什么魔力。
有12位网友表示赞同!
命令行竟然有这么多人喜欢,我还以为只有程序员才会用呢。这让我对这个领域产生了好奇。
有10位网友表示赞同!
《命令行的艺术》登顶Github趋势榜,这是不是意味着我错过了什么?我得赶紧补上这一课。
有9位网友表示赞同!
命令行能火到这个程度,真是没想到!我之前觉得命令行太复杂了,现在得重新审视一下自己的看法。
有7位网友表示赞同!
50,000颗星,这个数字让我对《命令行的艺术》充满了期待。希望这本书能让我对命令行有全新的认识。
有5位网友表示赞同!
命令行登上榜首,这让我想起了那些年我们一起敲代码的日子。那时候的编程生活真是简单而纯粹。
有18位网友表示赞同!
这本书能登上榜首,说明它确实有独到之处。我得赶紧入手一本,看看能不能提升自己的技能。
有18位网友表示赞同!
命令行一直是编程的基石,现在它又重新引起了关注。我得重新学习一下,以免被时代淘汰。
有18位网友表示赞同!
50,000颗星,这个数字太让人惊讶了!我之前对命令行一无所知,现在得赶紧恶补一下相关知识了。
有7位网友表示赞同!
命令行登上榜首,这是不是预示着编程界的新变革?我得看看这本书,看看能不能找到新的灵感。
有18位网友表示赞同!
《命令行的艺术》能登上榜首,说明它确实有很高的价值。我得认真研究一下,看看能不能从中汲取营养。
有18位网友表示赞同!