<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ 命令行 - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ freeCodeCamp 是一个免费学习编程的开发者社区，涵盖 Python、HTML、CSS、React、Vue、BootStrap、JSON 教程等，还有活跃的技术论坛和丰富的社区活动，在你学习编程和找工作时为你提供建议和帮助。 ]]>
        </description>
        <link>https://www.freecodecamp.org/chinese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ 命令行 - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 17 May 2026 08:32:18 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/tag/command-line/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ 目标是 CLI 大师——CLI 入门 ]]>
                </title>
                <description>
                    <![CDATA[ CLI 是 Command-Line Interface 的简称，也就是 命令行界面 ，通俗来讲就是用输入命令的方式与计算机交互。可能大部分人都看到命令行很头疼，感觉这些东西复杂又难记，不过其实还好啦，大部分选项参数设计的都蛮合理的，只要稍微理解它，你也可以成为  CLI 大师。 参数和选项（arguments & options） 一条命令通常由三个部分组成：命令、选项和参数。命令很好理解，比如：whoami、curl 或是 node  等等这些都是命令。在使用命令时可能需要告诉它各种执行细节，这就是选项和参数的作用，它们根据命令不同具有不同的可选性，某些命令可能不需要参数，某些命令可能没有选项（虽然不常见，但这是允许的）。 选项 选项通常用于修改命令的行为或提供额外的信息。选项使用一个或两个短线（- ）开头，许多选项需要一个额外的值跟着它们。单短线的短选项格式，可以使用一个空格在选项和值之间隔开或是不隔开，不过更推荐使用空格隔开；如果是双短线的长选项格式，则必须使用一个空格在选项和值之间隔开（有时也用  =，具体使用请查阅使用命令的相关文档）。此外不需要任何额外值的短选项可以彼 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/getting-started-with-the-cli/</link>
                <guid isPermaLink="false">668f46c7dd1680043183e13e</guid>
                
                    <category>
                        <![CDATA[ 命令行 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Mingxun Liu ]]>
                </dc:creator>
                <pubDate>Thu, 11 Jul 2024 06:54:03 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2024/07/nathan-da-silva-k-rKfqSm4L4-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><code>CLI</code> 是 <code>Command-Line Interface</code> 的简称，也就是 <code>命令行界面</code>，通俗来讲就是用输入命令的方式与计算机交互。可能大部分人都看到命令行很头疼，感觉这些东西复杂又难记，不过其实还好啦，大部分选项参数设计的都蛮合理的，只要稍微理解它，你也可以成为 <code>CLI</code> 大师。</p>
<h2 id="argumentsoptions">参数和选项（arguments &amp; options）</h2>
<p>一条命令通常由三个部分组成：命令、选项和参数。命令很好理解，比如：<code>whoami</code>、<code>curl</code> 或是 <code>node</code> 等等这些都是命令。在使用命令时可能需要告诉它各种执行细节，这就是选项和参数的作用，它们根据命令不同具有不同的可选性，某些命令可能不需要参数，某些命令可能没有选项（虽然不常见，但这是允许的）。</p>
<h3 id="">选项</h3>
<p>选项通常用于修改命令的行为或提供额外的信息。选项使用一个或两个短线（<code>-</code>）开头，许多选项需要一个额外的值跟着它们。单短线的短选项格式，可以使用一个空格在选项和值之间隔开或是不隔开，不过更推荐使用空格隔开；如果是双短线的长选项格式，则必须使用一个空格在选项和值之间隔开（有时也用 <code>=</code>，具体使用请查阅使用命令的相关文档）。此外不需要任何额外值的短选项可以彼此紧挨着使用。</p>
<h3 id="">参数</h3>
<p>一条命令可以有多个参数，用于标识信息的来源或目的地，对位置比较敏感，比如：<code>mv source.txt destination.txt</code>。参数一般是需要操作的内容，可能是一个文件路径、一段文本或是标准输入流。</p>
<p>Tips：在类 Unix 操作系统中，有些命令可以使用一个短线代替文件名，这将会使其处理来自标准输入的数据或将数据发送到标准输出。</p>
<h3 id="">使用语法说明</h3>
<p>当你第一次接触某个命令，想快速获取它的用法时，通常可以使用 <code>--help</code> 或 <code>-h</code> 此类选项查看一些简短的用法说明。下面这些语法说明会帮助你快速理解选项和参数的可选性：</p>
<ul>
<li>尖括号（<code>&lt;key&gt;</code>）代表<strong>必需</strong>参数，例如：<code>ping &lt;destination&gt;</code></li>
<li>方括号（<code>[key]</code>）代表<strong>可选</strong>参数，例如：<code>mkdir [OPTION] &lt;dirname&gt;</code></li>
<li>省略号（<code>...</code>）代表<strong>可重复</strong>参数，例如：<code>cp &lt;source1&gt; [source2...] &lt;dest&gt;</code></li>
<li>竖线（<code>|</code>）代表<strong>可选择</strong>参数，例如：<code>ip [OPTION] OBJECT { SUBCOMMAND | help }</code></li>
</ul>
<p>上述这些符号只是辅助理解如何使用命令的，在终端中实际使用这些命令时不需要再次按照参数的可选性增加这些符号，尖括号所包裹的参数在不容易混淆的情况下可能不会额外标记。</p>
<h2 id="redirectpipe">重定向和管道（redirect &amp; pipe）</h2>
<p>标准输入输出流（Standard Input/Output Streams，简称标准 I/O 流）是程序与外界交互的基础。标准 I/O 流主要包括标准输入流（<code>stdin</code>）、标准输出流（<code>stdout</code>）和标准错误流（<code>stderr</code>），分别可以用文件描述符 <code>0</code>、<code>1</code> 和 <code>2</code> 来指代。在 Unix 命令行中，我们经常使用重定向和管道来管理这些输入输出流，以便更高效地处理数据和信息。</p>
<h3 id="">重定向</h3>
<p>重定向的语法非常简单，使用 <code>&lt;</code> 代表重定向输入，使用 <code>&gt;</code> 代表重定向输出。通过重定向输入可以将文件内容作为标准输入流传递给程序，重定向输出则是将程序的标准输出流写入到文件，如果执行一个命令同时需要重定向输入和输出的话，看起来会是这样：<code>command &lt; input &gt; output</code>。重定向输入实际上等价于 <code>0&lt; input</code>，同样的重定向输出实际上等价于 <code>1&gt; output</code>。使用 <code>&gt;</code> 将会将标准输出流重定向到一个文件，如果文件存在则会覆盖原内容，也可以使用 <code>&gt;&gt;</code> 将标准输出流重定向并追加到指定文件。</p>
<p>某些情况下，我们可能需要把标准错误、标准输出一并记录并处理，那这时就需要重定向这些标准流。例如，我需要将标准错误重定向至标准输出，就需要这样：<code>command 2&gt;&amp;1</code>，如果是将标准输出重定向到标准错误，则是这样：<code>command 1&gt;&amp;2</code>。</p>
<h3 id="">管道</h3>
<p>在处理数据时，管道也是非常强大和常用的工具，使用 <code>|</code> 将左边命令的标准输出连接到右边命令的标准输入，可以将多个命令组合在一起。多条指令使用管道依次传递看起来会使这样：<code>command1 | command2 | command3</code>。管道允许实时处理数据流，命令可以即时地处理输入流的部分内容，而不必等到整个输入流完全生成。默认情况下，标准错误将不会被通过管道传递，它们将会合并并直接输出到终端上，你可以使用重定向标准错误到标准输出来改变这一行为。</p>
<h2 id="exitcode">返回值（exit code）</h2>
<p>与常见的 <code>True</code> <code>False</code> 布尔值返回结果不一样，在命令行中成功都应该返回 <code>0</code>，而其他的返回代码都可能代表着错误或失败，通常来说每个命令都会定义自己的错误码，如果你执行的命令出现了错误可以使用 <code>echo $?</code> 获取到错误码，这在写自动化脚本检测失败时会很有用。</p>
<p>结合 <code>&amp;&amp;</code> 和 <code>||</code> 运算符就可以根据命令的执行结果决定后续的操作，例如在 <code>command1 &amp;&amp; command2</code> 命令中，如果 <code>command1</code> 执行成功（exit code 等于 0）则执行 <code>command2</code>；反之在 <code>command1 || command2</code> 中，如果 <code>command1</code> 执行失败（exit code 不等于 0）则执行 <code>command2</code>。</p>
<h2 id="config">配置文件（config）</h2>
<p>通常这些命令的全局配置文件都在 <code>/etc</code> 或是 <code>/usr/local/etc</code> 目录中，用户自定义的配置文件通常在 <code>/home/&lt;username&gt;/.&lt;something&gt;rc</code> 此类的文件中。至于 rc 后缀的起源众说纷纭，我们约定成俗，见到 rc 一般当作配置文件都没什么问题。当然，每条命令也可以有自己的配置文件格式，例如：<code>curl</code> 的配置文件通常是按行写各种选项，而 <code>wget</code> 的配置文件则像是一个个的键值对。</p>
<h2 id="environmentvariable">环境变量（environment variable）</h2>
<p>环境变量是一种在操作系统中用来存储信息的机制，它们包含了系统运行时所需的各种信息，如路径、默认参数、语言设置等。每个环境变量都有一个名称和一个对应的值。通常来说定义环境变量应当全大写，设置环境变量可以采用多种方法，可以根据需要在命令行中临时设置或者在系统中永久生效。</p>
<p>某些命令行程序也会读取项目中会的 <code>.env</code> 或是其他环境变量文件，也会有像是 <code>NODE_ENV=development vite build</code> 此类直接在命令前定义的环境变量的情况，这种情况环境变量不会被记录仅在当前命令中有效。</p>
<p>我们还可以在终端中直接 <code>export</code> 一个环境变量，这样定义的环境变量将仅在当前会话中可用，重启终端或退出登录等操作都会使其失效。比如这样：</p>
<pre><code class="language-bash">export NODE_ENV=development
vite build
</code></pre>
<p>如果你想持久化的定义一个环境变量可以将它在 <code>.zshrc</code> 或是 <code>.bashrc</code> 等终端配置文件中 <code>export</code>，在启动该终端时自动添加这些环境变量。例如：</p>
<pre><code class="language-bash">export PATH="/usr/local/go/bin:$PATH"
</code></pre>
<h2 id="">小测</h2>
<details>
  <summary>指出 <code>ls -lah --time=ctime --color auto .</code> 命令中各个成分</summary>
    在 <code>ls -lah --time=ctime --color auto .</code> 中，<code>-lah</code> 是一组短选项，<code>--time=ctime</code> 是一个长选项并指定了一个值，<code>--color auto</code> 也是一个长选项它指定了一个值并使用空格分割，<code>.</code> 是参数指代当前目录，并且在这个例子中参数和选项都是可以省略的。
</details>
<details>
  <summary>重定向标准输出和标准错误到一个文件</summary>
    <ul>
        <li>正确的做法：<code>myprogram &gt; all_output.txt 2&gt;&amp;1</code>，这个命令表示先将标准输出（文件描述符1）重定向到 <code>all_output.txt</code>，然后将标准错误（文件描述符2）重定向到标准输出（文件描述符1），确保两个流都指向同一个文件。</li>
        <li>错误的做法：<code>myprogram 2&gt;&amp;1 &gt; all_output.txt</code>，这个命令的意思是将标准错误（文件描述符2）重定向到标准输出（文件描述符1），然后再将标准输出重定向到<code>all_output.txt</code>。由于标准输出在这时已经被重定向，所以标准错误仍然会输出到终端而不是文件中。</li>
    </ul>
</details>
<details>
  <summary>说出 <code>seq 1 5 | tr 1-9 a-z | sort -r</code> 的输出</summary>
<table style="undefined;table-layout: fixed; width: 219px"><colgroup>
<col style="width: 73px">
<col style="width: 73px">
<col style="width: 73px">
</colgroup>
<thead>
  <tr>
    <td>1<br>2<br>3<br>4<br>5</td>
    <td>a<br>b<br>c<br>d<br>e</td>
    <td>e<br>d<br>c<br>b<br>a</td>
  </tr></thead>
</table>
</details>
<h2 id="">结语</h2>
<p>相信你读完这篇文章对命令行再也没有那么恐惧了，大多数参数与选项设计得都很合理且便于记忆，稍加使用一段时间你将会发现命令实在是太酷了！</p>
<h2 id="">参考文档</h2>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Command-line_interface">https://en.wikipedia.org/wiki/Command-line_interface</a></li>
<li><a href="https://en.wikipedia.org/wiki/Redirection_(computing)">https://en.wikipedia.org/wiki/Redirection_(computing)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Pipeline_(Unix)">https://en.wikipedia.org/wiki/Pipeline_(Unix)</a></li>
<li><a href="https://everything.curl.dev/cmdline/configfile.html">https://everything.curl.dev/cmdline/configfile.html</a></li>
<li><a href="https://www.gnu.org/software/wget/manual/wget.html#Sample-Wgetrc">https://www.gnu.org/software/wget/manual/wget.html#Sample-Wgetrc</a></li>
<li><a href="https://cn.vitejs.dev/guide/env-and-mode.html#env-variables">https://cn.vitejs.dev/guide/env-and-mode.html#env-variables</a></li>
</ul>
<!--kg-card-end: markdown--><p>Photo by <a href="https://unsplash.com/@silvawebdesigns?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Nathan da Silva</a> on <a href="https://unsplash.com/photos/macbook-pro-beside-white-ceramic-mug-on-brown-wooden-table-k-rKfqSm4L4?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash">Unsplash</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 命令行命令一览——CLI 教程 ]]>
                </title>
                <description>
                    <![CDATA[ Windows 命令行是 Windows PC 上最强大的实用程序之一。有了它，你可以直接与操作系统交互，并做很多图形用户界面（GUI）中不能实现的事情。 在本文中，我将向你展示可以在 Windows 命令行上使用的 40 个命令，这些命令可以增强你作为 Windows 用户的信心。 注意：在使用我将向你展示的命令时，你必须小心。这是因为某些命令可能会对你的 Windows PC 产生持久的负面或正面影响，直到你重置电脑。 此外，其中一些命令要求你以管理员身份打开命令提示符。 Windows 命令行命令 powershell start cmd -v runAs – 以管理员身份运行命令提示符 输入此命令以管理员身份打开另一个命令提示符窗口： driverquery – 列出所有已安装的驱动程序 访问所有驱动程序很重要，因为它们通常会导致问题。 这就是这个命令的作用——它甚至会显示你在设备管理器中找不到的驱动程序。 chdir or cd – 将当前工作目录更改为指定目录 systeminfo – 显示你的 PC 的详细信息 如果你想查看有关你的系统的更多详细信息，你不会 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/command-line-commands-cli-tutorial/</link>
                <guid isPermaLink="false">62fb540e60480505ded7a4d0</guid>
                
                    <category>
                        <![CDATA[ 命令行 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Tue, 16 Aug 2022 07:10:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/08/cli.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/command-line-commands-cli-tutorial/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Command Line Commands – CLI Tutorial</a>
      </p><p>Windows 命令行是 Windows PC 上最强大的实用程序之一。有了它，你可以直接与操作系统交互，并做很多图形用户界面（GUI）中不能实现的事情。</p><p>在本文中，我将向你展示可以在 Windows 命令行上使用的 40 个命令，这些命令可以增强你作为 Windows 用户的信心。</p><p><strong>注意：</strong>在使用我将向你展示的命令时，你必须小心。这是因为某些命令可能会对你的 Windows PC 产生持久的负面或正面影响，直到你重置电脑。</p><p>此外，其中一些命令要求你以管理员身份打开命令提示符。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss5-1.png" class="kg-image" alt="ss5-1" width="600" height="400" loading="lazy"></figure><h2 id="windows-">Windows 命令行命令</h2><h3 id="powershell-start-cmd-v-runas-"><code>powershell start cmd -v runAs</code> – 以管理员身份运行命令提示符</h3><p>输入此命令以管理员身份打开另一个命令提示符窗口：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss1-1.png" class="kg-image" alt="ss1-1" width="600" height="400" loading="lazy"></figure><h3 id="driverquery-"><strong><code>driverquery</code> – </strong>列出所有已安装的驱动程序</h3><p>访问所有驱动程序很重要，因为它们通常会导致问题。</p><p>这就是这个命令的作用——它甚至会显示你在设备管理器中找不到的驱动程序。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss2-1.png" class="kg-image" alt="ss2-1" width="600" height="400" loading="lazy"></figure><h3 id="chdir-or-cd-"><strong><code>chdir</code> or <code>cd</code> – </strong>将当前工作目录更改为指定目录</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss3-1.png" class="kg-image" alt="ss3-1" width="600" height="400" loading="lazy"></figure><h3 id="systeminfo-pc-"><code><strong>systeminfo</strong></code><strong> – </strong>显示你的 PC 的详细信息</h3><p>如果你想查看有关你的系统的更多详细信息，你不会在 GUI 中看到，可以用这个命令。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss4-1.png" class="kg-image" alt="ss4-1" width="600" height="400" loading="lazy"></figure><h3 id="set-pc-"><code><strong>set</strong></code><strong> – </strong>显示你的 PC 的环境变量</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss5-2.png" class="kg-image" alt="ss5-2" width="600" height="400" loading="lazy"></figure><h3 id="prompt-"><strong><code>prompt</code> – </strong>更改输入命令前显示的默认文本</h3><p>默认情况下，命令提示符会显示你的用户帐户的 C 盘路径。</p><p>你可以使用 <code>prompt</code> 命令通过语法 <code>prompt_name $G</code> 更改该默认文本：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss6-1.png" class="kg-image" alt="ss6-1" width="600" height="400" loading="lazy"></figure><p><strong><strong>注意</strong>：</strong>如果你不将 <code>$G</code> 附加到命令中，你将不会在文本前面获得大于符号。</p><h3 id="clip-"><strong><code>clip</code> – </strong>将项目复制到剪贴板</h3><p>例如，<code>dir | clip</code> 将当前工作目录的所有内容复制到剪贴板。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss7.png" class="kg-image" alt="ss7" width="600" height="400" loading="lazy"></figure><p>你可以输入 <code>clip /?</code> 并按 <code>ENTER</code> 以查看如何使用它。</p><h3 id="assoc-"><strong><code>assoc</code> – </strong>列出程序及其关联的扩展</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss8.png" class="kg-image" alt="ss8" width="600" height="400" loading="lazy"></figure><h3 id="title-title-window-title-name-"><strong><code>title</code> – </strong>使用格式 <strong><code>title window-title-name</code></strong> 更改命令提示符窗口标题</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss9.png" class="kg-image" alt="ss9" width="600" height="400" loading="lazy"></figure><h3 id="fc-"><strong><code>fc</code> – </strong>比较两个相似的文件</h3><p>如果你是程序员或写作者，并且想快速查看两个文件之间的不同之处，你可以输入此命令，然后输入两个文件的完整路径。例如 <code>fc “file-1-path” “file-2-path”</code>。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss10.png" class="kg-image" alt="ss10" width="600" height="400" loading="lazy"></figure><h3 id="cipher-"><strong><code>cipher</code> – </strong>擦除可用空间并加密数据</h3><p>在 PC 上，你和其他用户仍然可以访问已删除的文件。因此，从技术上讲，它们不会在后台被删除。</p><p>你可以使用 <code>cipher</code> 命令擦除驱动器并加密此类文件。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss11.png" class="kg-image" alt="ss11" width="600" height="400" loading="lazy"></figure><h3 id="netstat-an-ip-"><strong><code>netstat -an</code> – </strong>显示打开的端口、它们的 IP 地址和状态</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss12.png" class="kg-image" alt="ss12" width="600" height="400" loading="lazy"></figure><h3 id="ping-ip-"><code><strong>ping</strong></code><strong> – </strong>显示网站 IP 地址，让你知道传输数据和获取响应需要多长时间</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss13.png" class="kg-image" alt="ss13" width="600" height="400" loading="lazy"></figure><h3 id="color-"><strong><code>color</code> – </strong>更改命令提示符的文本颜色</h3><p>输入 <code>color attr</code> 以查看可以更改为的颜色：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss14.png" class="kg-image" alt="ss14" width="600" height="400" loading="lazy"></figure><p>输入 <code>color 2</code> 将终端的颜色更改为绿色：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss15.png" class="kg-image" alt="ss15" width="600" height="400" loading="lazy"></figure><h3 id="for-f-skip-9-tokens-1-2-delims-i-in-netsh-wlan-show-profiles-do-echo-j-findstr-i-v-echo-netsh-wlan-show-profiles-j-key-clear-wi-fi-"><strong><code>for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j | findstr -i -v echo | netsh wlan show profiles %j key=clear</code> – </strong>显示所有 Wi-Fi 密码</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss16.png" class="kg-image" alt="ss16" width="600" height="400" loading="lazy"></figure><h3 id="ipconfig-pc-ip-"><strong><code>ipconfig</code> – </strong>显示有关 PC IP 地址和连接的信息</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss17.png" class="kg-image" alt="ss17" width="600" height="400" loading="lazy"></figure><p>此命令还具有扩展名，例如 <code>ipconfig /release</code>、<code>ipconfig /renew</code> 和 <code>ipconfig /flushdns</code>，你可以使用它们来解决网络连接问题。</p><h3 id="sfc-"><strong><code>sfc</code> – </strong>系统文件检查器</h3><p>此命令扫描你的计算机以查找损坏的文件并进行修复。可用于运行扫描的命令扩展名为 <code>/scannow</code>。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss18.png" class="kg-image" alt="ss18" width="600" height="400" loading="lazy"></figure><h3 id="powercfg-"><strong><code>powercfg</code> – </strong>控制可配置的电源设置</h3><p>你可以使用此命令及其多个扩展名来显示有关 PC 电源状态的信息。</p><p>你可以输入 <code>powercfg help</code> 来显示这些扩展。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss19.png" class="kg-image" alt="ss19" width="600" height="400" loading="lazy"></figure><p>例如，你可以使用 <code>powercfg /energy</code> 生成电池健康报告。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss20.png" class="kg-image" alt="ss20" width="600" height="400" loading="lazy"></figure><p><code>powercfg /energy</code> 命令将生成一个包含报告的 HTML 文件。你可以在 <code>C:\Windows\system32\energy-report.html</code> 中找到 HTML 文件。</p><h3 id="dir-"><strong><code>dir</code> – </strong>列出目录中的项目</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss21.png" class="kg-image" alt="ss21" width="600" height="400" loading="lazy"></figure><h3 id="del-"><strong><code>del</code> – </strong>删除文件</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss22.png" class="kg-image" alt="ss22" width="600" height="400" loading="lazy"></figure><h3 id="attrib-h-s-r-folder_name-"><strong><code>attrib +h +s +r folder_name</code> – </strong>隐藏文件夹</h3><p>你可以通过在命令行中直接输入 <code>attrib +h +s +r folder_name</code> 然后按 <code>ENTER</code> 来隐藏文件夹。</p><p>要再次显示该文件夹，请执行命令 <code>-attrib -h -s -r folder_name</code>。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss23.png" class="kg-image" alt="ss23" width="600" height="400" loading="lazy"></figure><h3 id="start-website-address-"><strong><code>start website-address</code> – </strong>从命令行登录网站</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss24.png" class="kg-image" alt="ss24" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss25.png" class="kg-image" alt="ss25" width="600" height="400" loading="lazy"></figure><h3 id="tree-"><strong><code>tree</code> – </strong>显示当前目录或指定驱动器的树</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss26.png" class="kg-image" alt="ss26" width="600" height="400" loading="lazy"></figure><h3 id="ver-"><strong><code>ver</code> – </strong>显示操作系统的版本</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss27.png" class="kg-image" alt="ss27" width="600" height="400" loading="lazy"></figure><h3 id="tasklist-"><strong><code>tasklist</code> – </strong>显示打开的程序</h3><p>你可以使用以下命令对任务管理器执行相同的操作：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss28.png" class="kg-image" alt="ss28" width="600" height="400" loading="lazy"></figure><p>下一个命令向你展示如何关闭打开的任务。</p><h3 id="taskkill-"><strong><code>taskkill</code> – </strong>终止正在运行的任务</h3><p>要终止任务，请运行 <code>taskkill /IM "task.exe" /F</code>。例如，<code>taskkill /IM "chrome.exe" /F</code>：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss29.png" class="kg-image" alt="ss29" width="600" height="400" loading="lazy"></figure><h3 id="date-"><strong><code>date</code> – </strong>显示和更改当前日期</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss30.png" class="kg-image" alt="ss30" width="600" height="400" loading="lazy"></figure><h3 id="time-"><strong><code>time</code> – </strong>显示和更改当前时间</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss31.png" class="kg-image" alt="ss31" width="600" height="400" loading="lazy"></figure><h3 id="vol-"><strong><code>vol</code> – </strong>显示当前驱动器的序列号和标签信息</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss32.png" class="kg-image" alt="ss32" width="600" height="400" loading="lazy"></figure><h3 id="dism-"><code><strong>dism</strong></code><strong> – </strong>运行部署镜像服务管理工具</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss33.png" class="kg-image" alt="ss33" width="600" height="400" loading="lazy"></figure><h3 id="ctrl-c-"><strong><code>CTRL + C</code> – </strong>停止执行命令</h3><h3 id="-help-"><strong><code>-help</code> – </strong>提供其他命令的指南</h3><p>例如，<code>powercfg -help</code> 显示如何使用 <code>powercfg</code> 命令。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss34.png" class="kg-image" alt="ss34" width="600" height="400" loading="lazy"></figure><h3 id="echo-"><strong><code>echo</code> – </strong>显示自定义消息或来自脚本或文件的消息</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss35.png" class="kg-image" alt="ss35" width="600" height="400" loading="lazy"></figure><p>你还可以使用 <code>echo</code> 命令通过 <code>echo file-content &gt; filename.extension</code> 创建文件。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss36.png" class="kg-image" alt="ss36" width="600" height="400" loading="lazy"></figure><h3 id="mkdir-"><strong><code>mkdir</code> – </strong>创建文件夹</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss37.png" class="kg-image" alt="ss37" width="600" height="400" loading="lazy"></figure><h3 id="rmdir-"><strong><code>rmdir</code> – </strong>删除文件夹</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss38.png" class="kg-image" alt="ss38" width="600" height="400" loading="lazy"></figure><p><strong>注意：</strong>该文件夹必须为空，此命令才能工作。</p><h3 id="more-"><strong><code>more</code> – </strong>显示更多信息或文件内容</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss39.png" class="kg-image" alt="ss39" width="600" height="400" loading="lazy"></figure><h3 id="move-"><strong><code>move</code> – </strong>将文件或文件夹移动到指定文件夹</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss40.png" class="kg-image" alt="ss40" width="600" height="400" loading="lazy"></figure><h3 id="ren-ren-filename-extension-new-name-extension-"><code><strong>ren</strong></code><strong> – 使用语法 </strong><code><strong>ren filename.extension new-name.extension</strong></code><strong> 重命名文件</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss41-1.png" class="kg-image" alt="ss41-1" width="600" height="400" loading="lazy"></figure><h3 id="cls-"><strong><code>cls</code> – </strong>清除命令行</h3><p>如果你输入多个命令并且命令行被阻塞，你可以使用 <code>cls</code> 清除所有条目及其输出。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/cls.gif" class="kg-image" alt="cls" width="600" height="400" loading="lazy"></figure><h3 id="exit-"><code><strong>exit</strong></code><strong> – 关闭命令行</strong></h3><h3 id="shutdown-"><strong><code>shutdown</code> – </strong>关闭、重新启动、休眠计算机</h3><p>你可以从命令行关闭、重新启动和休眠你的 PC。</p><p>在命令行中输入 <code>shutdown</code>，以便查看可用于执行操作的扩展。例如，<code>shutdown /r</code> 将重新启动你的计算机。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss42.png" class="kg-image" alt="ss42" width="600" height="400" loading="lazy"></figure><h2 id="-"><strong>总结</strong></h2><p>本文向你展示了一些很多人不知道的命令，你可以使用这些命令来访问 Windows PC 上的隐藏功能。</p><p>你在使用这些命令时应该小心，因为它们会对你的操作系统产生持久的影响。</p><p>如果你发现这些命令有帮助，请与你的朋友和家人分享这篇文章。</p><p>如果你知道其他我没有列出的有用命令，请<a href="https://twitter.com/Ksound22">在 Twitter 上告诉我</a>。我将添加它并提及你作为来源。</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 面向初学者的命令行教程——如何像专业人士一样使用终端 ]]>
                </title>
                <description>
                    <![CDATA[ 原文：Command Line for Beginners – How to Use the Terminal Like a Pro [https://www.freecodecamp.org/news/command-line-for-beginners/]，作者：Germán Cocca [https://www.freecodecamp.org/news/author/gercocca/] 大家好！在这篇文章中，我们将好好看看命令行（也被称为 CLI、控制台、终端或 shell）。 命令行是我们作为开发者和一般的计算机用户所拥有的最有用和最有效的工具之一。但是，当你开始使用它时，可能会觉得它有点复杂。 在这篇文章中，我将尽力简单解释构成命令行界面的各个部分，以及它如何工作的基本原理，这样你就可以开始使用它来完成你的日常任务。 开始吧！=D 目录  * 控制台、终端、命令行（CLI）和 shell 之间的区别 * 控制台     * 终端     * shell     * 命令行（CLI）   ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/command-line-for-beginners/</link>
                <guid isPermaLink="false">6257878799ec7406219e68c9</guid>
                
                    <category>
                        <![CDATA[ 命令行 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ luojiyin ]]>
                </dc:creator>
                <pubDate>Thu, 14 Apr 2022 02:20:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/04/pexels-pixabay-207580.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>原文：<a href="https://www.freecodecamp.org/news/command-line-for-beginners/">Command Line for Beginners – How to Use the Terminal Like a Pro</a>，作者：<a href="https://www.freecodecamp.org/news/author/gercocca/">Germán Cocca</a></p><!--kg-card-begin: markdown--><p>大家好！在这篇文章中，我们将好好看看命令行（也被称为 CLI、控制台、终端或 shell）。</p>
<p>命令行是我们作为开发者和一般的计算机用户所拥有的最有用和最有效的工具之一。但是，当你开始使用它时，可能会觉得它有点复杂。</p>
<p>在这篇文章中，我将尽力简单解释构成命令行界面的各个部分，以及它如何工作的基本原理，这样你就可以开始使用它来完成你的日常任务。</p>
<p>开始吧！=D</p>
<h2 id="">目录</h2>
<ul>
<li><a href="#difference-between-console-command-line-cli-terminal-and-shell">控制台、终端、命令行（CLI）和 shell 之间的区别</a>
<ul>
<li><a href="#console">控制台</a></li>
<li><a href="#terminal">终端</a></li>
<li><a href="#shell">shell</a></li>
<li><a href="#command-line-or-cli-command-line-interface">命令行（CLI）</a></li>
</ul>
</li>
<li><a href="#why-should-i-even-care-about-using-the-terminal">为什么我要关心终端</a></li>
<li><a href="#different-kinds-of-shells">不同的 shell</a>
<ul>
<li><a href="#a-bit-of-history-posix">一点历史——Posix</a></li>
<li><a href="#how-do-i-know-what-shell-im-running">怎么知道我在运行哪个 shell</a></li>
<li><a href="#what-shell-is-better">哪个 shell 更好</a>
<ul>
<li><a href="#a-comment-about-customization">关于自定义</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#most-commonand-useful-commands-to-use">最常用且最有用的命令</a>
<ul>
<li><a href="#git-commands">Git 命令</a></li>
</ul>
</li>
<li><a href="#our-first-script">我们的第一个脚本</a></li>
<li><a href="#conclusion">总结</a></li>
</ul>
<h2 id="difference-between-console-command-line-cli-terminal-and-shell">控制台、终端、命令行（CLI）和 shell 之间的区别</h2>
<p>我认为一个好的开始是准确了解什么是命令行。</p>
<p>在提到这一点时，你可能听说过终端、控制台、命令行、CLI 和 shell 这些术语。人们经常交替使用这些词，但事实是它们实际上是不同的东西。</p>
<p>区分它们并不一定是很重要的知识，但它将有助于澄清事情。因此，让我们简单地解释一下每一个。</p>
<h3 id="console">控制台</h3>
<p>控制台（console）是允许你与计算机互动的<strong>物理设备</strong>。</p>
<p>通俗地说，它就是你的电脑屏幕、键盘和鼠标。作为一个用户，你<strong>通过</strong>控制台与计算机进行互动。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/03/image_13b2c80d-a2d6-4429-8ca6-f053340897cc.png" alt="image_13b2c80d-a2d6-4429-8ca6-f053340897cc" width="600" height="400" loading="lazy"></p>
<h3 id="terminal">终端</h3>
<p>终端是一个文本输入和输出环境。它是作为一个<strong>包装器（wrapper）</strong> 的<strong>程序</strong>，允许我们输入计算机处理的命令。</p>
<p>用简单来说，它是一个“窗口”，你在其中输入计算机将处理的实际命令。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/03/terminal.png" alt="terminal" width="600" height="400" loading="lazy"></p>
<p>请记住，终端是一个程序，就像其他任何程序一样。和其他程序一样，你可以随意安装和卸载它。也可以在你的电脑中安装许多终端，随时运行你想运行的终端。</p>
<p>所有的操作系统都安装了一个默认的终端，但有很多选择，每个都有自己的功能和特点。</p>
<h3 id="shell">shell</h3>
<p>shell 是一个<strong>程序</strong>，作为命令行解释器。它<strong>处理命令</strong>并<strong>输出结果</strong>。它解释和处理用户输入的命令。</p>
<p>与终端（terminal）一样，shell 是所有操作系统中默认的程序，但也可以由用户自己安装和卸载。</p>
<p>不同的 shell 也有不同的语法和特点。也可以在你的电脑上安装许多 shell，并在你想的时候运行每个 shell。</p>
<p>在大多数 Linux 和 Mac 操作系统中，默认的 shell 是 Bash。而在 Windows 中则是 Powershell。其他一些常见的 shell 的例子是 Zsh 和 Fish。</p>
<p>shells 也可以作为<strong>编程语言</strong>来工作，在这个意义上，我们可以用它们建立<strong>脚本（scripts）</strong>，使我们的计算机执行某种任务。脚本只不过是一系列指令（命令），我们可以将其保存在文件中，然后在我们想执行的时候执行。</p>
<p>我们将在本文的后面看一下脚本的内容。现在只要记住，shell 是你的计算机用来<strong>理解</strong>和执行你的命令的程序，你也可以用它来编写任务。</p>
<p>还要记住，终端是 shell 运行的程序。但这两个程序是独立的。这意味着，我可以让任何 shell 在任何终端上运行。在这个意义上，两个程序之间没有依赖性。</p>
<h3 id="command-line-or-cli-command-line-interface">命令行（CLI）</h3>
<p>CLI 是一个界面，我们在其中输入命令供计算机处理。用简单来说，它是一个空间，你在其中输入计算机将处理的命令。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/03/cli.png" alt="cli" width="600" height="400" loading="lazy"></p>
<p>这实际上与终端（terminal）是一样的，在我看来，这些术语可以互换使用。</p>
<p>这里要提到的一件有趣的事情是，大多数操作系统都有两种不同类型的界面：</p>
<ul>
<li><strong>CLI</strong>，它将命令作为输入，以使计算机执行任务。</li>
<li>另一个是 <strong>GUI</strong>（图形用户界面），用户可以看到屏幕上的东西并点击它们，计算机将通过执行相应的任务对这些事件作出反应。</li>
</ul>
<h2 id="why-should-i-even-care-about-using-the-terminal">为什么我要关心终端</h2>
<p>我们刚刚提到，大多数操作系统都有一个图形用户界面。因此，如果我们可以在屏幕上看到东西，并点击来做我们想做的事情，你可能会想，为什么你要学习这个复杂的终端（terminal）/cli/shell 呢？</p>
<p>第一个原因是，对于许多任务来说，它只是<strong>更有效率</strong>。我们稍后会看到一些例子，但是有很多任务在 GUI 中需要在不同的窗口中进行多次点击。但在 CLI 上，这些任务可以用一个命令来执行。</p>
<p>从这个意义上说，熟悉命令行将帮助你节省时间，能够更快地执行你的任务。</p>
<p>第二个原因是，通过使用命令，你可以轻松地<strong>自动化任务</strong>。如前所述，我们可以用我们的 shell 建立脚本，然后在我们想要的时候执行这些脚本。在处理那些我们不想重复做的重复性任务时，这非常有用。</p>
<p>仅举一些例子，我们可以建立一个脚本，为我们创建一个新的在线 repo，或者为我们在云服务商上创建一个特定的基础设施，或者执行一个更简单的任务，如每小时改变我们的屏幕墙纸。</p>
<p>脚本是一种节省重复性任务时间的好方法。</p>
<p>第三个原因是，有时 CLI 将是我们能够与计算机互动的唯一方式。例如，当你需要与云平台服务器互动时。在大多数情况下，你不会有一个 GUI，只有一个 CLI 来运行命令。</p>
<p>因此，熟练掌握 CLI 将使你能够在所有情况下与计算机互动。</p>
<p>最后一个原因是它看起来很酷、很有趣。你不会看到电影中的黑客在他们的电脑上点击，对吗？</p>
<h2 id="different-kinds-of-shells">不同的 shell</h2>
<p>在深入研究你可以在终端运行的实际命令之前，我认为认识不同类型的 shell 以及如何识别你目前正在运行的 shell 很重要。</p>
<p>不同的 shell 有不同的语法和功能，所以要知道到底要输入什么命令，你首先要知道你在运行什么 shell。</p>
<h3 id="a-bit-of-history-posix">一点历史——Posix</h3>
<p>对于 shells，有一个通用的标准，叫作 <strong><a href="https://en.wikipedia.org/wiki/POSIX">Posix</a></strong>。</p>
<p>Posix 之于 shell 与 ECMAScript 之于 JavaScript 非常相似。它是一个标准，规定了所有 shell 应该遵守的某些特性和功能。</p>
<p>这个标准是在 20 世纪 80 年代建立的，目前大多数 shell 都是根据这个标准开发的。这就是为什么大多数 shell 共享类似的语法和类似的特征。</p>
<h3 id="how-do-i-know-what-shell-im-running">怎么知道我在运行哪个 shell</h3>
<p>要知道你当前运行的是什么 shell，只需打开你的终端并输入<code>echo $0</code>。这将打印出当前运行的程序名称，在这种情况下，它就是实际的 shell。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/04/screenshot-1.png" alt="screenshot-1" width="600" height="400" loading="lazy"></p>
<h3 id="what-shell-is-better">哪个 shell 更好</h3>
<p>大多数 shell 之间没有很大的区别。由于它们大多符合相同的标准，你会发现它们中的大多数工作都是类似的。</p>
<p>不过，你可能想知道一些细微的差别：</p>
<ul>
<li>如前所述，<strong>Bash</strong> 是使用最广泛的，在 Mac 和 Linux 上默认安装。</li>
<li><em>Zsh</em>* 与 Bash 非常相似，但它是在 Bash 之后创建的，并且比它有一些不错的改进。如果你想更详细地了解它的区别，<a href="https://linuxhint.com/differences_between_bash_zsh/#:~:text=It%20has%20many%20features%20like,by%20default%20with%20Linux%20distribution.">这里有一篇很酷的文章</a>是关于 zsh 的。</li>
<li><strong>Fish</strong> 是另一个常用的 shell，它有一些不错的内置功能和配置，如自动完成和语法高亮。关于 Fish 的问题是，它不是 Posix 兼容，而 Bash 和 Zsh 是。这意味着你能在 Bash 和 Zsh 上运行的一些命令不能在 Fish 上运行，反之亦然。这使得 Fish 脚本与 Bash 和 Zsh 相比对大多数计算机的兼容性较差。</li>
<li>还有一些其他的 shell，比如 <strong>Ash</strong> 或 <strong>Dash</strong>（命名只是让一切变得更加混乱，我知道......），它们是 Posix shell 的精简版本。这意味着它们只提供 Posix 所需要的功能，而没有其他的。而 Bash 和 Zsh <strong>增加</strong>了比 Posix 要求更多的功能。</li>
</ul>
<p>事实上，shells 增加了更多的功能，使它们更容易、更友好地进行交互，但执行脚本和命令的速度较慢。</p>
<p>因此，一种常见的做法是使用 Bash 或 Zsh 这样的 <strong>增强型</strong> shell 进行一般的交互，而使用 Ash 或 Dash 这样的<strong>剥离型</strong> shell 来执行脚本。</p>
<p>当我们在后面讨论脚本时，我们将看到如何定义什么 shell 来执行一个给定的脚本。</p>
<p>如果你对这些 shell 之间更详细的比较感兴趣，<a href="https://www.youtube.com/watch?v=dRdGq8khTJc">这里有一个视频，解释得非常清楚</a>。</p>
<p>如果必须推荐一个 shell，我会推荐 bash，因为它是最标准和最常用的一个。这意味着你能够将你的知识转化为大多数环境。</p>
<p>但是，事实上，大多数 shell 之间并没有很大的区别。所以在任何情况下，你都可以尝试几种，看看你最喜欢哪一种。:)</p>
<h4 id="a-comment-about-customization">关于自定义</h4>
<p>我刚刚提到，Fish 有内置的配置，比如自动完成和语法高亮。这在 Fish 中是内置的，但在 Bash 或 Zsh 中你也可以配置这些功能。</p>
<p>关键是 shells 是可定制的。你可以编辑程序如何工作，你有哪些命令，你的提示符显示什么信息，等等。</p>
<p>我们不会在这里看到详细的定制选项，但要知道，当你在你的计算机上安装 shell 时，你的系统上将会创建某些文件，以后你可以编辑这些文件来定制你的程序。</p>
<p>此外，网上有许多插件，允许你以更容易的方式定制你的外壳。你只需安装它们并获得该插件提供的功能。一些例子是 <a href="https://ohmyz.sh/">OhMyZsh</a> 和 <a href="https://starship.rs/">Starship</a>。</p>
<p>这些定制选项对终端也是如此。</p>
<p>因此，你不仅有许多 shell 和终端（terminal）选项可供选择--你还为每个 shell 和终端有许多配置选项。</p>
<p>如果你刚开始使用，所有这些信息可能会让你感到有点不知所措。但只要知道有许多选项可用，而且每个选项也可以被定制。</p>
<h2 id="most-commonand-useful-commands-to-use">最常用且最有用的命令</h2>
<p>现在我们对 CLI 的工作方式有了一个基础，让我们深入了解一下最有用的命令，你可以开始在你的日常工作中使用。</p>
<p>请记住，这些例子将基于我目前的配置（Linux 操作系统上的 Bash）。但无论如何，大多数命令应该适用于大多数配置。</p>
<ul>
<li><strong>Echo</strong> 在终端打印出我们传递给它的任何参数。</li>
</ul>
<pre><code class="language-shell">echo Hello freeCodeCamp! // Output: Hello freeCodeCamp!
</code></pre>
<ul>
<li><strong>pwd</strong> 代表打印工作目录，它打印出我们目前在计算机中的<strong>位置</strong>或目录。</li>
</ul>
<pre><code class="language-shell">pwd // Output: /home/German
</code></pre>
<ul>
<li><strong>ls</strong> 向你展示你当前所在的目录的内容。它将向你展示你当前目录中的文件和其他目录。</li>
</ul>
<p>例如，这里我在最近工作的一个 React 项目目录上：</p>
<pre><code class="language-shell">ls // Output:
node_modules  package.json  package-lock.json  public  README.md  src
</code></pre>
<p>如果你将此命令传递给标志或参数 <code>-a</code>，它还将向您显示隐藏的文件或目录，像 <code>.git</code> or <code>.gitignore</code> 文件。</p>
<pre><code class="language-shell">ls -a // Output:
.   .env  .gitignore    package.json       public     src
..  .git  node_modules  package-lock.json  README.md
</code></pre>
<ul>
<li><strong>cd</strong> 是 Change directory 的缩写，它将把你从你的当前目录带到另一个目录。</li>
</ul>
<p>在我的 <code>home</code> 目录下，我可以输入<code>cd Desktop</code>，它将把我带到桌面目录。</p>
<p>如果我想上升一个目录，也就是说，去包含当前目录的目录，我可以输入<code>cd ..</code>。</p>
<p>如果你只输入<code>cd</code>，它将直接带你到你的 <code>home</code> 目录。</p>
<ul>
<li><strong>mkdir</strong> 代表制作目录，它将为你创建一个新的目录。你必须把目录名称参数传给命令。</li>
</ul>
<p>如果我想创建一个名为 "Test "的新目录，我将输入<code>mkdir test</code>。</p>
<ul>
<li>
<p><strong>rmdir</strong> 代表删除目录，它就是这样做的。它和 <code>mkdir</code> 一样需要目录名参数：<code>rmdir test</code>。</p>
</li>
<li>
<p><strong>touch</strong> 允许你在当前目录下创建一个空文件。作为参数，它需要文件名，如<code>touch test.txt</code>。</p>
</li>
<li>
<p><strong>rm</strong>允许你删除文件，与 <code>rmdir</code> 允许你删除目录的方式相同。 <code>rm test.txt</code></p>
</li>
<li>
<p><strong>cp</strong> 允许你复制文件或目录。这个命令需要两个参数：第一个是你想复制的文件或目录，第二个是你复制的目的地（你想把文件/目录复制到哪里）。</p>
</li>
</ul>
<p>如果我想在同一目录下复制我的 txt 文件，我可以输入以下内容：</p>
<pre><code class="language-shell">cp test.txt testCopy.txt
</code></pre>
<p>看，目录没有改变，因为在<strong>目的地</strong>中我输入了新的文件名。</p>
<p>如果我想把文件复制到一个不同的目录，但保持相同的文件名，我可以输入这个：</p>
<pre><code class="language-shell">cp test.txt ./testFolder/
</code></pre>
<p>而如果我想复制到一个不同的文件夹，改变字段名，当然可以这样输入：</p>
<pre><code class="language-shell">cp test.txt ./testFolder/testCopy.txt
</code></pre>
<ul>
<li><strong>mv</strong> 是移动的简称，它让我们把一个文件或目录从一个地方移动到另一个地方。也就是说，在一个新的目录中创建它，并在前一个目录中删除它（就像你通过剪切和粘贴所做的一样）。</li>
</ul>
<p>同样，这个命令需要两个参数，即我们想要移动的文件或目录和目的地。</p>
<pre><code class="language-shell">mv test.txt ./testFolder/
</code></pre>
<p>如果我们愿意，也可以在同一命令中改变文件的名称：</p>
<pre><code class="language-shell">mv test.txt ./testFolder/testCopy.txt
</code></pre>
<ul>
<li><strong>head</strong>允许你直接从终端查看文件或管道数据的开始部分。</li>
</ul>
<pre><code class="language-shell">head test.txt // Output:
this is the beginning of my test file
</code></pre>
<ul>
<li><strong>tail</strong> 的工作原理是一样的，但它会向你显示文件的结尾部分内容。</li>
</ul>
<pre><code class="language-shell">tail test.txt // Output:

this is the end of my test file
</code></pre>
<ul>
<li><strong>--help/</strong> 标志可用于大多数命令，它将返回如何使用该命令的信息。</li>
</ul>
<pre><code class="language-shell">cd --help // output:
cd: cd [-L|[-P [-e]] [-@]] [dir]
Change the shell working directory.
</code></pre>
<p>将当前目录改为 DIR。默认的 DIR 是 HOME shell 变量的值。</p>
<p>变量 CDPATH 定义了包含 DIR 的目录的搜索路径。CDPATH 中的备选目录名由冒号<code>:</code>分隔。</p>
<p>如果 DIR 以<code>...</code>开头，则空目录名与当前目录相同。</p>
<ul>
<li>以类似的方式，<strong>man</strong> 命令将返回任何特定命令的信息。</li>
</ul>
<pre><code class="language-shell">    man cp // output:

    CP(1)                            User Commands                           CP(1)

    NAME
           cp - copy files and directories

    SYNOPSIS
           cp [OPTION]... [-T] SOURCE DEST
           cp [OPTION]... SOURCE... DIRECTORY
           cp [OPTION]... -t DIRECTORY SOURCE...

    DESCRIPTION
           Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

           Mandatory  arguments  to  long  options are mandatory for short options
           too.

           -a, --archive
                  same as -dR --preserve=all

           --attributes-only
                  don't copy the file data, just the attributes
    ...
</code></pre>
<p>你甚至可以输入 "man bash"，这将返回一个关于这个 shell 的所有知识的详细手册。;)</p>
<ul>
<li><strong>code</strong> 将打开你的默认代码编辑器。如果你单独输入这个命令，它只是打开你最近打开的文件/目录的编辑器。</li>
</ul>
<p>你也可以通过传递参数来打开一个指定的文件：<code>code test.txt</code>。</p>
<p>或者通过传递新的文件名来打开一个新的文件： <code>code thisIsAJsFile.js</code>.</p>
<ul>
<li><strong>edit</strong> 将在你的默认命令行文本编辑器上打开文本文件（如果你是在 Mac 或 Linux 上，可能是 Nano 或 Vim）。</li>
</ul>
<p>如果你打开了你的文件，然后无法退出你的编辑器，首先看一下这个：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/03/vimExit.png" alt="vimExit" width="600" height="400" loading="lazy"></p>
<p>然后输入 <code>:q!</code> 并回车。（译者注：q 是 quit 的缩写）</p>
<p>这个备忘录很有趣，因为每个人一开始都在为使用 CLI 文本编辑器而挣扎，因为大多数操作（比如退出编辑器）都是通过键盘快捷键完成的。使用这些编辑器是另外一个话题，如果你有兴趣了解更多，就去找教程吧。;)</p>
<ul>
<li>
<p><strong>ctrl+c</strong> 允许你退出终端正在运行的当前进程。例如，如果你正在用<code>npx create-react-app</code>创建一个 react 应用，并想在某个时候取消构建，只要按下组合键 <strong>ctrl+c</strong>，它就会停止。</p>
</li>
<li>
<p>从终端复制文本可以用 <strong>ctrl+shift+c</strong> 来完成，粘贴可以用 <strong>ctrl+shift+v</strong> 来完成。</p>
</li>
<li>
<p><strong>clear</strong> 将清除你的终端上的所有内容。</p>
</li>
<li>
<p><strong>exit</strong> 将关闭你的终端，（这不是一个命令，但它也很酷）<strong>ctrl+alt+t</strong> 将为你打开一个新终端。</p>
</li>
<li>
<p>通过按<strong>上、下方向键</strong>你可以浏览你之前输入的命令。</p>
</li>
<li>
<p>按下 <strong>tab</strong>，你将得到基于你到目前为止所写的命令的自动补全。按下<strong>两次tab</strong>，你会得到基于你到目前为止所写命令的建议。</p>
</li>
</ul>
<p>例如，如果我输入 <strong>edit test</strong> 并按下两次 tab，我就会得到 <code>testFolder/ test.txt</code>。如果我写<code>edit test.</code>并按下 <strong>tab</strong>，我的文本会自动补全为<code>edit test.txt</code>。</p>
<h3 id="git-commands">Git 命令</h3>
<p>除了在文件系统中工作和安装/卸载东西，作为一个开发者在终端最常使用可能是 Git 和线上仓库的交互。</p>
<p>从终端做这些事情比到处点击更有效率，所以让我们看看最有用的 git 命令吧。</p>
<p><strong>git init</strong>将为你创建一个新的本地版本库。</p>
<pre><code class="language-shell">git init // output:
Initialized empty Git repository in /home/German/Desktop/testFolder/.git/
</code></pre>
<p><strong>git add</strong> 将一个或多个文件添加到暂存区。你可以详细说明要添加到暂存区的特定文件，或者通过输入 git add .` 来添加所有更改的文件。</p>
<p><strong>git commit</strong> 将你的修改提交给版本库。提交必须总是必须伴随着<code>-m</code>标志和提交信息。</p>
<pre><code class="language-shell">git commit -m 'This is a test commit' // output:
[master (root-commit) 6101dfe] This is a test commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test.js
</code></pre>
<p><strong>git status</strong> 告诉你，你目前在哪个分支上，以及你是否有修改要提交。</p>
<pre><code class="language-shell">git status  // output:
On branch master
nothing to commit, working tree clean
</code></pre>
<p><strong>git clone</strong> 允许你克隆（复制）一个仓库到你当前所在的目录。请记住，你既可以克隆远程仓库（GitHub、GitLab 等），也可以克隆本地仓库（那些存储在你电脑中的仓库）。</p>
<pre><code class="language-shell">git clone https://github.com/coccagerman/MazeGenerator.git // output:
Cloning into 'MazeGenerator'...
remote: Enumerating objects: 15, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 15 (delta 1), reused 11 (delta 0), pack-reused 0
Unpacking objects: 100% (15/15), done.
</code></pre>
<p><strong>git remote add origin</strong> 是用来详细说明你的项目要使用的远程仓库的 URL。如果你想在某个时候改变它，你可以通过使用<code>git remote set-url origin</code>命令来实现。</p>
<pre><code class="language-shell">git remote add origin https://github.com/coccagerman/testRepo.git
</code></pre>
<blockquote>
<p>请记住，你需要先创建你的远程版本，以便获得其 URL。稍后我们将看到你如何通过一个小脚本从命令行中做到这一点。;)</p>
</blockquote>
<p><strong>git remote -v</strong> 可以让你列出当前正在使用的远程仓库。</p>
<pre><code class="language-shell">git remote -v // output:
origin https://github.com/coccagerman/testRepo.git (fetch)
origin https://github.com/coccagerman/testRepo.git (push)
</code></pre>
<p><strong>git push</strong> 将你已提交的修改上传到你的远程 repo。</p>
<pre><code class="language-shell">git push // output:
Counting objects: 2, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 266 bytes | 266.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0)
</code></pre>
<p><strong>git branch</strong> 列出了你的 repo 上的所有可用分支，并告诉你目前在哪个分支上。如果你想创建一个新的分支，你只需把新的分支名称作为参数加入，比如<code>git branch &lt;branch name&gt;</code>。</p>
<pre><code class="language-shell">git branch // output:
* main
</code></pre>
<p><strong>git checkout</strong> 将你从一个分支移到另一个分支。它把你的目标分支作为 paremeter。</p>
<pre><code class="language-shell">git checkout newBranch // output:
Switched to branch 'newBranch'
</code></pre>
<p><strong>git pull</strong> 从你的远程仓库拉取（下载）代码，并将其与你的本地仓库相结合（combines）。这在团队工作中特别有用，当许多开发人员在同一个代码库中工作时。在这种情况下，每个开发者都会定期从远程版本库拉取代码，以便在一个包括所有其他开发者所做修改的代码库中工作。</p>
<p>如果你的远程版本中有新的代码，该命令将返回在拉取中被修改的实际文件。如果没有，我们会得到 <em><code>Already up to date（已经更新)</code></em>。</p>
<pre><code class="language-shell">git pull // output:
Already up to date.
</code></pre>
<p><strong>git diff</strong> 允许你查看你当前所在的分支和另一个分支之间的差异。</p>
<pre><code class="language-shell">git diff newBranch // output:
diff --git a/newFileInNewBranch.js b/newFileInNewBranch.js
deleted file mode 100644
index e69de29..0000000
</code></pre>
<p>顺便说一下，当比较不同分支或版本之间的差异时，通常会使用 <a href="https://meldmerge.org/">Meld</a> 这样的可视化工具。并不是说你不能在终端中直接看到它，但这个工具对于更清晰的可视化是非常有用的。</p>
<p><strong>git merge</strong> 将你当前所在的分支与另一个分支合并（合并）。请记住，所做的修改将只并入你当前所在的分支，而不是另一个分支。</p>
<pre><code class="language-shell">git merge newBranch // output:
Updating f15cf51..3a3d62f
Fast-forward
 newFileInNewBranch.js | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 newFileInNewBranch.js
</code></pre>
<p><strong>git log</strong> 列出了你在 repo 中以前做过的所有提交。</p>
<pre><code class="language-shell">git log // output:
commit 3a3d62fe7cea7c09403c048e971a5172459d0948 (HEAD -&gt; main, tag: TestTag, origin/main, newBranch)
Author: German Cocca &lt;german.cocca@avature.net&gt;
Date:   Fri Apr 1 18:48:20 2022 -0300

    Added new file

commit f15cf515dd3ec398210108dce092debf26ff9e12
Author: German Cocca &lt;german.cocca@avature.net&gt;
    ...
</code></pre>
<p><strong>--help/</strong> 标志会显示关于某个命令的信息，与 bash 的工作方式完全相同。</p>
<pre><code class="language-shell">git diff --help // output:
GIT-DIFF(1)                       Git Manual                       GIT-DIFF(1)

NAME
       git-diff - Show changes between commits, commit and working tree, etc

SYNOPSIS
       git diff [options] [&lt;commit&gt;] [--] [&lt;path&gt;...]
       git diff [options] --cached [&lt;commit&gt;] [--] [&lt;path&gt;...]
       ...
</code></pre>
<h2 id="our-first-script">我们的第一个脚本</h2>
<p>现在我们准备进入命令行中真正有趣和很棒的部分，即脚本！</p>
<p>正如我之前提到的，一个脚本只不过是一系列我们可以在任何时候执行的命令或指令。为了解释我们如何编写一个脚本，我们将使用一个简单的例子，让我们通过运行一个命令来创建一个 github repo。 ;)</p>
<ul>
<li>
<p>首先要做的是创建一个<code>.sh</code>文件。你可以把它放在任何地方。我把我的文件称为 <code>newGhRepo.sh</code>。</p>
</li>
<li>
<p>然后在你选择的文本/代码编辑器中打开它。</p>
</li>
<li>
<p>在我们的第一行，我们将写下以下内容 <code>#! /bin/sh</code>。</p>
</li>
</ul>
<p>这被称为 <strong>shebang</strong>，它的作用是声明什么 shell 来运行这个脚本。</p>
<p>还记得我们以前提到过，我们可以用一个给定的 shell 来进行一般的交互，而用另一个给定的 shell 来执行一个脚本吗？那么，shebang 就是决定由哪个 shell 来运行脚本的指令。</p>
<p>如前所述，我们使用一个精简的 shell（也称为 sh shells）来运行脚本，因为它们更有效率（尽管说实话，这种差别可能是难以察觉的，这只是一种个人偏好）。在我的电脑中，我把 dash 作为我的 sh shell。</p>
<p>如果我们想让这个脚本用 bash 运行，那么 shebang 应该是<code>#! /bin/bash</code>。</p>
<p>我们的下一行将是<code>repoName=$1</code>。</p>
<p>这里我们声明了一个名为 <strong>repoName</strong> 的变量，并将其分配给脚本收到的第一个参数的值。</p>
<p>一个<strong>参数</strong>是一组在脚本/命令后面输入的字符。就像 <code>cd</code> 命令一样，我们需要指定一个目录参数，以便改变目录（即：<code>cd testFolder</code>）。</p>
<p>我们可以通过使用 <code>$</code> 符号和预期参数的顺序来识别脚本中的参数。</p>
<p>如果我期望有一个以上的参数，我可以这样写：</p>
<pre><code class="language-shell">paramOne=$1
paramTwo=$2
paramThree=$3
...
</code></pre>
<p>所以，我们希望将代码库的名称作为我们脚本的参数。但如果用户忘记输入会怎样？我们需要想一下，所以接下来我们要编写一个<strong>条件</strong>，不断要求用户输入版本库名称，直到收到该参数。<br>
我们可以这样做：</p>
<pre><code class="language-shell">while [ -z "$repoName" ]
do
   echo 'Provide a repository name'
   read -r -p $'Repository name:' repoName
done
</code></pre>
<p>我们可以这样做：</p>
<ol>
<li>当 repoName 变量未被分配时（<code>while [ -z "$repoName" ]</code>）</li>
<li>将此信息打印到控制台（<code>echo '提供一个版本库名称'</code>）</li>
<li>然后读取用户提供的任何输入，并将输入分配给 <code>repoName</code> 变量（<code>read -r -p $'Repository name:' repoName</code>）</li>
</ol>
<p>现在我们有了我们的 repo 名称，我们可以像这样创建我们的本地 Git repo：</p>
<pre><code class="language-shell">echo "# $repoName" &gt;&gt; README.md
git init
git add .
git commit -m "First commit"
</code></pre>
<p>这就是创建一个 readme 文件，并在第一行写上 repo 名称（<code>echo "# $repoName" &gt;&gt; README.md</code>），然后初始化 git repo 并做第一次提交。</p>
<p>然后，是时候把我们的 repo 上传到 GitHub 了。要做到这一点，我们将利用 <a href="https://docs.github.com/en/rest/reference/repos">GitHub API</a>的优势，使用以下命令：</p>
<p><code>curl -u coccagerman https://api.github.com/user/repos -d '{"name": "'"$repoName"'", "private":false}'</code></p>
<p><strong>curl</strong> 是一个从服务器传输数据的命令，使用许多支持的协议的其中一种。</p>
<p>接下来我们使用<code>-u</code>标志来声明我们为之创建的用户（<code>-u coccagerman</code>）。</p>
<p>接下来是 GitHub API 提供的 endpoint(<code>https://api.github.com/user/repos</code>)</p>
<p>最后，我们使用<code>-d</code>标志来传递参数给这个命令。在这种情况下，我们要指出版本库的名称（为此我们使用<code>repoName</code>变量），并将<code>private</code>选项设置为<code>false</code>，因为我们希望我们的版本库是公开的。</p>
<p>在 API 中还有很多其他的配置选项，所以<a href="https://docs.github.com/en/rest/reference/repos#create-a-repository-for-the-authenticated-user">查看文档</a>了解更多信息。</p>
<p>运行此命令后，GitHub 会提示我们输入 <strong>私人令牌（private token）</strong> 进行认证。</p>
<p>如果你还没有私人令牌，你可以在 GitHub 的 <strong>Settings &gt; Developer settings &gt; Personal access tokens</strong></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/04/screenshot.png" alt="screenshot" width="600" height="400" loading="lazy"></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/04/screenshot_1.png" alt="screenshot_1" width="600" height="400" loading="lazy"></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/04/screenshot_2.png" alt="screenshot_2" width="600" height="400" loading="lazy"></p>
<p>酷，我们现在几乎已经完成了！现在我们需要的是我们新创建的 GitHub repo 的 <strong>remote URL</strong>。</p>
<p>为了得到它，我们将再次使用 curl 和 GitHub API，像这样：</p>
<pre><code class="language-shell">GIT_URL=$(curl -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/coccagerman/"$repoName" | jq -r '.clone_url')
</code></pre>
<p>这里我们声明了一个叫做<code>GIT_URL</code>的变量，并将其分配给下面命令返回的任何内容。</p>
<p><code>-H</code>标志设置了我们请求的头。</p>
<p>然后我们传递 GitHub 的 API endpoint，其中应包含我们的用户名（user name）和 repo名称（<code>https://api.github.com/repos/coccagerman/"$repoName"</code>）。</p>
<p>然后，我们就 <strong>piping</strong> 了我们请求的返回值。管道化（piping）只是意味着将一个进程的返回值作为另一个进程的输入值。我们可以用<code>|</code>符号来做，比如<code>&lt;process1&gt; | &lt;process2&gt;</code>。</p>
<p>最后我们运行 <code>jq</code> 命令，这是一个处理 JSON 输入的工具。在这里，我们告诉它获得 <code>.clone_url</code> 的值，根据 GitHub API 提供的数据格式，这是我们的远程 Git URL 的位置。</p>
<p>最后一步，我们将主分支重命名为 main，添加我们刚刚获得的远程源码，然后将我们的代码推送到 GitHub 上! =D</p>
<pre><code class="language-shell">git branch -M main
git remote add origin $GIT_URL
git push -u origin main
</code></pre>
<p>我们的完整脚本应该看起来像这样：</p>
<pre><code class="language-shell">#! /bin/sh
repoName=$1

while [ -z "$repoName" ]
do
    echo 'Provide a repository name'
    read -r -p $'Repository name:' repoName
done

echo "# $repoName" &gt;&gt; README.md
git init
git add .
git commit -m "First commit"

curl -u &lt;yourUserName&gt; https://api.github.com/user/repos -d '{"name": "'"$repoName"'", "private":false}'

GIT_URL=$(curl -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/&lt;yourUserName&gt;/"$repoName" | jq -r '.clone_url')

git branch -M main
git remote add origin $GIT_URL
git push -u origin main
</code></pre>
<ul>
<li>现在是测试我们的脚本的时候了！要<strong>执行</strong>它，我们可以做两件事。</li>
</ul>
<p>一种方法是输入 shell 名称，并将文件作为参数传入，比如。<code>dash ../ger/code/projects/scripts/newGhRepo.sh</code>。</p>
<p>另一种是通过运行<code>chmod u+x ../ger/code/projects/scripts/newGhRepo.sh</code>，使文件有可执行权限。</p>
<p>然后你可以通过运行<code>../ger/code/projects/scripts/newGhRepo.sh</code>直接执行该文件。</p>
<p>就是这样了！我们有了脚本，并且它开始运行。每当我们需要一个新的 repo 时，我们就可以从我们所在的任何目录中执行这个脚本。</p>
<p>但这有一点很烦人。我们需要记住脚本目录的确切路径。如果能用一条命令来执行脚本，不管我们在哪个目录下都是一样的，那不是很酷吗？</p>
<p>在这里，<strong>bash aliases（别名）</strong> 来解决我们的问题。</p>
<p>别名是 bash 提供的一种方法，用于为我们想要运行的确切命令命名。</p>
<p>要创建一个新的别名，我们需要编辑我们系统中的 bash 配置文件。这些文件通常位于主目录中。别名可以在不同的文件中定义（主要是<code>.bashrc</code>或<code>.bash_aliases</code>）。</p>
<p>我的系统上有一个<code>.bash_aliases</code>文件，所以我们来编辑它：</p>
<ul>
<li>
<p>在我们的 CLI 中，我们输入<code>cd ~</code>来查看主目录。</p>
</li>
<li>
<p>然后我们可以输入<code>ls -a</code>列出所有文件（包括隐藏的），并检查我们的系统中是否有<code>.bashrc</code>或<code>.bash_aliases</code>文件。</p>
</li>
<li>
<p>我们用我们选择的文本/代码编辑器打开该文件。</p>
</li>
<li>
<p>然后我们这样写我们的新别名：<br>
<code>alias newghrepo="dash /home/German/Desktop/ger/code/projects/scripts/newGhRepo.sh"</code></p>
</li>
</ul>
<p>在这里，我声明了别名的名称，以及我将要输入的运行脚本的实际命令（<code>newghrepo</code>）。</p>
<p>在引号之间，定义这个别名要做什么（<code>"dash /home/German/Desktop/ger/code/projects/scripts/newGhRepo.sh"</code>)。</p>
<p>请看，我传递的是脚本的<a href="https://www.computerhope.com/issues/ch001708.htm">绝对路径</a>，这样，无论我的当前目录是什么，这个命令都是一样的。</p>
<p>如果你不知道你的脚本的绝对路径是什么，在你的终端上进入脚本目录，然后输入 <code>readlink -f newGhRepo.sh</code>。这应该可以为你返回完整的路径;)</p>
<p>编辑完成后，我们保存文件，重新启动终端，然后就可以了！现在我们可以通过输入 <code>newghrepo</code> 来运行我们的脚本，无论我们目前在哪个目录下。这比打开浏览器和点击创建我们的 repo 要快得多！=D</p>
<p>我希望这能让你体会到脚本所能带来的优化效果。当然，在你第一次编写、测试和设置脚本的时候，它需要多做一些工作。但在那之后，你就再也不用手动执行这项任务了。;)</p>
<h2 id="conclusion">总结</h2>
<p>当你开始工作时，终端可能感觉是一个令人生畏和复杂的地方。但是，花时间和精力去学习它的内在和延展，肯定是值得的。它能够极大地提高效率。</p>
<blockquote>
<p>如果你有兴趣学习更多关于终端和 Bash 的知识，Zach Gollwitzer 在 YouTube 上有 <a href="https://www.youtube.com/playlist?list=PLYQSCk-qyTW0d88jNocdi_YIFMA5Fnpug">一个很棒的速成系列课程</a>。<br>
他在其他主题上也有很好的教程，如 Node 和 Javascript，所以我推荐你关注他;)</p>
</blockquote>
<p>像往常一样，我希望你喜欢这篇文章，并学到一些新东西。如果你愿意，你也可以在 <a href="https://www.linkedin.com/in/germancocca/">linkedin</a> 或 <a href="https://twitter.com/CoccaGerman">Twitter</a> 上关注我。</p>
<p>感谢你阅读本文，下一篇见！=D</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/04/8ef61e333efccb5900cd117a4d64e8d3.gif" alt="8ef61e333efccb5900cd117a4d64e8d3" width="600" height="400" loading="lazy"></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Git 常用命令总结 ]]>
                </title>
                <description>
                    <![CDATA[ 最近公司的代码管理工具要从 SVN 转到 Git 上，因此虽然之前用过 Git，但是都是一些简单的推送提交，因此还是有必要进行一些系统的学习，这里做一下笔记，以备后询，且不定期更新。 关于 SVN 和 Git 的比较已经有很多文章说过了，就不再赘述。本文的重点是如何使用常用的 Git 命令进行操作，冷门的就不说了，且比较零散，系统的学习推介廖雪峰的 Git 教程 [https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000] 。 > 声明：下面用户名都为SHERlocked93，请自行修改成自己的用户名 1. 概览  * 工作区 Workspace  * 暂存区 Stage / Index  * 本地仓库 Repository  * 远程仓库 Remote 2. 修改 2.1 暂存修改 操作一览 如果在工作的时候出现了临时需要解决的问题，而你又不希望提交，那么有个stash功能 git stash 在暂存后工作区会回退到最近的一个 commit 的状态，以便开建新分支 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/collection-of-useful-git-commands/</link>
                <guid isPermaLink="false">5d9dddcefbfdee429dc5ff91</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 命令行 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 开发技能 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ SHERlocked93 ]]>
                </dc:creator>
                <pubDate>Fri, 06 Nov 2020 04:43:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/04/photo-1556075798-4825dfaaf498.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>最近公司的代码管理工具要从 SVN 转到 Git 上，因此虽然之前用过 Git，但是都是一些简单的推送提交，因此还是有必要进行一些系统的学习，这里做一下笔记，以备后询，且不定期更新。</p><p>关于 SVN 和 Git 的比较已经有很多文章说过了，就不再赘述。本文的重点是如何使用<strong><strong>常用</strong></strong>的 Git 命令进行操作，冷门的就不说了，且比较零散，系统的学习推介廖雪峰的 <a href="https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000" rel="nofollow noreferrer">Git 教程</a>。</p><blockquote>声明：下面用户名都为<code>SHERlocked93</code>，请自行修改成自己的用户名</blockquote><h2 id="1-">1. 概览</h2><figure class="kg-card kg-image-card"><img src="https://i.loli.net/2018/09/29/5baf2af732fe1.png" class="kg-image" alt="5baf2af732fe1" width="1172" height="340" loading="lazy"></figure><ul><li>工作区 Workspace</li><li>暂存区 Stage / Index</li><li>本地仓库 Repository</li><li>远程仓库 Remote</li></ul><h2 id="2-">2. 修改</h2><h3 id="2-1-">2.1 暂存修改</h3><p>操作一览</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2019/10/image-2.png" class="kg-image" alt="image-2" width="829" height="237" loading="lazy"></figure><p>如果在工作的时候出现了临时需要解决的问题，而你又不希望提交，那么有个<code>stash</code>功能</p><pre><code>git stash</code></pre><p>在暂存后工作区会回退到最近的一个 commit 的状态，以便开建新分支；比如我们修复 bug 时，我们会通过创建新的 bug 分支进行修复，然后合并，最后删除；</p><p>当手头工作没有完成时，先把工作现场<code>git stash</code>一下，然后去修复 bug，修复后，再<code>git stash pop</code>，回到工作现场。</p><h3 id="2-2-">2.2 撤销修改</h3><h4 id="-">还未提交到暂存区</h4><p>当修改还没有被<code>add</code>的时候，可以使用</p><pre><code>git checkout -- filename.txt</code></pre><p>来丢弃工作区某文件的修改，当然也可以把后面的文件改成<code>*</code>来撤销所有文件的修改。这是用仓库的文件覆盖工作区的文件。</p><p>注意这里用的是<code>--</code>，如果没有这个<code>--</code>的话就变成切换分支了。</p><h4 id="--1">还未提交到仓库</h4><p>如果你的修改已经被<code>add</code>到了暂存区，但是还没有被<code>commit</code>，那么可以使用</p><pre><code>git reset HEAD filename.txt
git checkout -- filename.txt</code></pre><p>首先用<code>reset</code>来把修改撤回到工作区，再使用上面的<code>checkout</code>命令撤回工作区的修改。这里的<code>reset</code>相当于<code>add</code>的反操作。</p><h4 id="--2">已经提交到仓库</h4><p>则可以版本回退</p><pre><code>git reset --hard 15zdx2s</code></pre><p>这里的<code>--hard</code>表示强制回退，丢弃本地的修改。这个回退比较野蛮，该版本号之后的提交都将不可见。</p><h4 id="--3">撤销之前某一个提交</h4><p><code>git revert</code>撤销一个提交的同时会创建一个新的提交，这是一个安全的方法，因为它不会重写提交历史。但实现上和reset是完全不同的。它撤销这个提交引入的更改，然后在最后加上一个撤销了更改的新提交，而不是从项目历史中移除这个提交。</p><pre><code>git revert 46af7z6</code></pre><p>相较于<code>reset</code> ，<code>revert</code>不会改变项目历史，对那些已经发布到共享仓库的提交来说这是一个安全的操作。其次<code>git revert</code> 可以将提交历史中的任何一个提交撤销、而<code>reset</code>会把历史上某个提交及之后所有的提交都移除掉，这太野蛮了。</p><p>相比 <code>reset</code>，它不会改变现在的提交历史。因此，<code>revert</code> 可以用在公共分支上，<code>reset</code> 应该用在私有分支上。</p><h4 id="-commit">合并 commit</h4><p>如果已经<code>commit</code>了怎么办，如果要撤回目前的<code>commit</code>，可以把它合并到上一个<code>commit</code>中</p><pre><code>git rebase -i HEAD~~</code></pre><p>在出现的两个提交信息的<code>pick</code>改为<code>fixup</code></p><h2 id="3-">3. 分支操作</h2><h3 id="3-1-">3.1 创建/查看/合并分支</h3><p>操作一览</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2019/10/image-3.png" class="kg-image" alt="image-3" width="830" height="349" loading="lazy"></figure><p>创建分支</p><pre><code># 创建新分支
git branch bug-fix
# 查看分支，-a查看本地和远程的分支，-r查看远程分支，-l或没有只查看本地
git branch -a
# 切换到刚刚创建的分支
git checkout bug-fix</code></pre><p>上面两个步骤可以合并为</p><pre><code># 创建并切换到分支
git checkout -b bug-fix</code></pre><p>如果修改一下本地文件之后在这个分支继续培育一个版本之后，怎么去合并到主分支呢？</p><pre><code>git add *
git commit -m "some change"
# 切换到主分支
git checkout master
# 合并分支
git merge bug-fix
# 删除分支 (可选)
git branch -d bug-fix</code></pre><p>如果 master 分支和新的分支都各自培育了版本，那么自动合并通常会失败，发生冲突<code>conflict</code>，此时需要打开文件解决冲突之后<code>commit</code>一个版本以完成合并</p><pre><code>git add *
git commit -m "branch merge"</code></pre><p>这里提一下，<code>merge</code>的时候有几个主要模式，<code>--no-ff</code>、<code>fast-forward</code>，其中<code>fast-forward</code>是默认的</p><ol><li><code>fast-forward</code>：在 master 开始的新分支前进了几个版本之后如果需要 merge 回来，此时 master 并没有前进，那么这个模式就是把 HEAD 与 master 指针指向新分支上，完成合并。这种情况如果删除分支，则会丢失分支信息，因为在这个过程中并没有创建 commit。</li><li><code>--no-ff</code>：关闭默认的<code>fast-forward</code>模式，也就是在 merge 的时候生成一个新的 commit，这样在分支历史上就可以看出分支信息。</li></ol><h3 id="3-2-">3.2 远程仓库操作</h3><p>操作一览</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2019/10/image-4.png" class="kg-image" alt="image-4" width="832" height="386" loading="lazy"></figure><p>关于各个分支，哪些需要推送呢？</p><ol><li><code>master</code>分支是主分支，因此要时刻与远程同步；</li><li><code>dev</code>分支是开发分支，团队所有成员都需要在上面工作，所以也需要与远程同步；</li><li><code>bug</code>分支只用于在本地修复 bug，就没必要推到远程了，除非老板要看看你每周到底修复了几个 bug；</li><li><code>feature</code>分支是否推到远程，取决于你是否和你的小伙伴合作在上面开发。</li></ol><h4 id="-clone">直接<code>clone</code></h4><p>在 GitHub 上创建一个新的项目之后，比如叫<code>learn-git</code>，那么可以直接<code>clone</code>下来，注意创建的时候不要选择 <code>Initialize this repository with a README</code>，我们要的是一个空的仓库。</p><pre><code>git&nbsp;clone&nbsp;https://github.com/SHERlocked93/learn-git.git</code></pre><p>这样在本地就直接创建了一个空的文件夹<code>learn-git</code>，当然里面有<code>.git</code>文件夹。<br>也可以使用 SSH 地址来 clone，速度会快一些，也不用每次推送都输入口令，推介使用这种：</p><pre><code>git&nbsp;clone&nbsp;git@github.com:SHERlocked93/learn-git.git</code></pre><p>添加一个文件<code>filename.txt</code>之后</p><pre><code>git add filename.txt
git commit -m "add filename.txt"
git push -u origin master</code></pre><p>这样就把本地新建的文件 push 到了远程仓库</p><h4 id="--4">本地与远程建立关联</h4><p>如果已经有了本地工程文件夹，如何分享到 GitHub 远程仓库呢？当然此时我们已经在 GitHub 上创建了一个新的空白项目，还是叫<code>learn-git</code>，在本地文件夹中</p><pre><code>git init
# 关联远程库
git remote add origin git@github.com:SHERlocked93/learn-git.git
git push -u origin master</code></pre><p>就可以了，如果你的远程仓库已经有了提交，那么在<code>push</code>之前需要</p><pre><code># 允许不想干库合并
git pull origin master --allow-unrelated-histories
git push -u origin master</code></pre><p>先拉取远程分支，注意这里<code>--allow-unrelated-histories</code>允许两个不想干的分支强行合并，再<code>push</code>；这样在 GitHub 的网站上还能看到 commit 记录。</p><p>也可以强硬一点直接强行推送</p><pre><code># -f 强行推送
git push -u origin master -f</code></pre><p>这样本地仓库就直接把远程仓库覆盖了，且 GitHub 上也看不到历史<code>commit</code>了，如果不想被同事枪击的话，还是推介上一种做法。</p><h4 id="--5">同步远程仓库</h4><p>那么已经 clone 的仓库如果希望同步原仓库新的提交怎么办？</p><pre><code># 从远程分支拉取代码到本地
git pull upstream master
# push到自己的库里
git push  origin master</code></pre><h3 id="3-3-">3.3 多人协作</h3><p>多人协作的工作模式通常是这样：</p><ol><li>首先，可以试图用<code>git push origin &lt;branch-name&gt;</code>推送自己的修改</li><li>如果推送失败，则因为远程分支比你的本地更新，需要先用git pull试图合并</li><li>如果合并有冲突，则解决冲突，并在本地提交</li><li>没有冲突或者解决掉冲突后，再用<code>git push origin &lt;branch-name&gt;</code>推送就能成功</li></ol><p>从远程抓取分支，使用<code>git pull</code>，如果有冲突，要先处理冲突，<code>add-&gt;commit-&gt;push</code>。如果<code>git pull</code>提示 no tracking information，则说明本地分支和远程分支的链接关系没有创建，用命令<code>git branch --set-upstream-to &lt;branch-name&gt; origin/&lt;branch-name&gt;</code>。</p><h2 id="4-">4. 标签操作</h2><p>操作一览</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2019/10/image-5.png" class="kg-image" alt="image-5" width="830" height="386" loading="lazy"></figure><p>如果要删除远程分支，需要</p><pre><code># 首先删除本地tag，假如tag是v0.9
git tag -d v0.9
# 再从远程删除
git push origin :refs/tags/v0.9</code></pre><h2 id="5-">5. 提交格式</h2><p>type：</p><ul><li>feat: 新特性，添加功能</li><li>fix: 修改 bug</li><li>refactor: 代码重构</li><li>docs: 文档修改</li><li>style: 代码格式修改, 注意不是 css 修改</li><li>test: 测试用例修改</li><li>chore: 其他修改, 比如构建流程, 依赖管理</li></ul><p>附件：Git常用命令速查表</p><figure class="kg-card kg-image-card"><img src="https://i.loli.net/2018/09/30/5bb07b7d2753b.png" class="kg-image" alt="5bb07b7d2753b" width="1070" height="755" loading="lazy"></figure> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
