<?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[ Linux - 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[ Linux - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 23 May 2026 19:22:18 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/tag/linux/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Bash 脚本教程——Linux Shell 脚本和命令行入门教程 ]]>
                </title>
                <description>
                    <![CDATA[ 在 Linux 中，流程自动化在很大程度上依赖于 shell 脚本。这涉及到创建一个包含一系列命令的文件，这些命令可以一起执行。 在本文中，我们将从 bash 脚本编写的基础知识开始，包括变量、命令、输入/输出和调试。我们还会通过示例来学习每个知识点。 让我们开始吧。🚀 目录  1. 前提条件  2. 简介  * Bash 脚本的定义  * Bash 脚本的优点  * Bash Shell 和命令行界面的概述  3. 如何开始 Bash 脚本编写  * 如何从命令行运行 Bash 命令  * 如何创建和执行 Bash 脚本  4. Bash 脚本基础知识  * ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/bash-scripting-tutorial-linux-shell-script-and-command-line-for-beginners/</link>
                <guid isPermaLink="false">66b22ce179db950405c05254</guid>
                
                    <category>
                        <![CDATA[ Bash ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Thu, 19 Dec 2024 11:18:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2024/08/Copy-of-Cast-a-Function-in-SQL---Convert-Char-to-Int-SQL-Server-Example.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/bash-scripting-tutorial-linux-shell-script-and-command-line-for-beginners/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Bash Scripting Tutorial – Linux Shell Script and Command Line for Beginners</a>
      </p><!--kg-card-begin: markdown--><p>在 Linux 中，流程自动化在很大程度上依赖于 shell 脚本。这涉及到创建一个包含一系列命令的文件，这些命令可以一起执行。</p>
<p>在本文中，我们将从 bash 脚本编写的基础知识开始，包括变量、命令、输入/输出和调试。我们还会通过示例来学习每个知识点。</p>
<p>让我们开始吧。🚀</p>
<h2 id="">目录</h2>
<ol>
<li><a href="#pre-requisites">前提条件</a></li>
<li><a href="#introduction">简介</a></li>
</ol>
<ul>
<li><a href="#definition-of-bash-scripting">Bash 脚本的定义</a></li>
<li><a href="#advantages-of-bash-scripting">Bash 脚本的优点</a></li>
<li><a href="#overview-of-bash-shell-and-command-line-interface">Bash Shell 和命令行界面的概述</a></li>
</ul>
<ol start="3">
<li><a href="#how-to-get-started-with-bash-scripting">如何开始 Bash 脚本编写</a></li>
</ol>
<ul>
<li><a href="#how-to-run-bash-commands-from-the-command-line">如何从命令行运行 Bash 命令</a></li>
<li><a href="#how-to-create-and-execute-bash-scripts">如何创建和执行 Bash 脚本</a></li>
</ul>
<ol start="4">
<li><a href="#bash-scripting-basics">Bash 脚本基础知识</a></li>
</ol>
<ul>
<li><a href="#comments-in-bash-scripting">Bash 脚本中的注释</a></li>
<li><a href="#variables-and-data-types-in-bash">Bash 中的变量和数据类型</a></li>
<li><a href="#input-and-output-in-bash-scripts">Bash 脚本中的输入和输出</a></li>
<li><a href="#basic-bash-commands-echo-read-etc-">基本的 Bash 命令（echo、read 等）</a></li>
<li><a href="#conditional-statements-if-else-">条件语句（if/else）</a></li>
</ul>
<ol start="5">
<li><a href="#looping-and-branching-in-bash">Bash 中的循环和分支</a></li>
</ol>
<ul>
<li><a href="#while-loop">while 循环</a></li>
<li><a href="#for-loop">for 循环</a></li>
<li><a href="#case-statements">case 语句</a></li>
</ul>
<ol start="6">
<li><a href="#how-to-schedule-scripts-using-cron">如何使用 cron 调度脚本</a></li>
<li><a href="#how-to-debug-and-troubleshoot-bash-scripts">如何调试和排除 Bash 脚本的故障</a></li>
<li><a href="#conclusion">总结</a></li>
</ol>
<ul>
<li><a href="#resources-for-learning-more-about-bash-scripting">学习更多关于 Bash 脚本的资源</a></li>
</ul>
<h2 id="pre-requisites">前提条件</h2>
<p>为了跟随本教程的进度，你应具备以下条件：</p>
<ul>
<li>可以访问命令行的 Linux 运行版本。</li>
</ul>
<p>如果你没有安装 Linux 或者你是初学者，你可以通过 <a href="https://replit.com/~">Replit</a> 很容易访问 Linux 命令行。Replit 是一个基于浏览器的 IDE，你可以在几分钟内访问 bash shell。</p>
<p>你也可以通过 WSL（Windows Subsystem for Linux）在你的 Windows 系统上安装 Linux。<a href="https://www.freecodecamp.org/news/how-to-install-wsl2-windows-subsystem-for-linux-2-on-windows-10/">这里</a> 有一个相关教程。</p>
<h2 id="introduction">简介</h2>
<h3 id="definition-of-bash-scripting">Bash 脚本的定义</h3>
<p>Bash 脚本是一个包含一系列命令的文件，这些命令由 bash 程序逐行执行。它允许你通过命令行执行一系列操作，如导航到特定目录、创建文件夹和启动进程。</p>
<p>通过将这些命令保存在脚本中，你可以多次重复相同的操作，并通过运行脚本执行它们。</p>
<h3 id="advantages-of-bash-scripting">Bash 脚本的优点</h3>
<p>Bash 脚本是一种强大且灵活的工具，可以用于自动化系统管理任务、管理系统资源以及在 Unix/Linux 系统中执行其他例行任务。Shell 脚本的一些优点包括：</p>
<ul>
<li><strong>自动化</strong>：Shell 脚本允许你自动化重复性任务和过程，节省时间并减少手动执行时可能出现的错误。</li>
<li><strong>可移植性</strong>：Shell 脚本可以在各种平台和操作系统上运行，包括 Unix、Linux、macOS，甚至通过使用模拟器或虚拟机在 Windows 上运行。</li>
<li><strong>灵活性</strong>：Shell 脚本高度可定制，可以轻松修改以满足特定需求。它们还可以与其他编程语言或实用程序结合，创建更强大的脚本。</li>
<li><strong>易访问性</strong>：Shell 脚本易于编写，不需要任何特殊工具或软件。它们可以使用任何文本编辑器进行编辑，并且大多数操作系统都有内置的 shell 解释器。</li>
<li><strong>集成</strong>：Shell 脚本可以与其他工具和应用程序集成，如数据库、Web 服务器和云服务，从而实现更复杂的自动化和系统管理任务。</li>
<li><strong>调试</strong>：Shell 脚本易于调试，大多数 shell 都内置调试和错误报告工具，可以帮助快速识别和修复问题。</li>
</ul>
<h3 id="overview-of-bash-shell-and-command-line-interface">Bash Shell 和命令行界面的概述</h3>
<p>"Shell" 和 "bash" 这两个术语可以互换使用。但两者之间有细微的区别。</p>
<p>"Shell" 这个术语是指提供命令行界面以与操作系统交互的程序。Bash（Bourne-Again SHell）是最常用的 Unix/Linux shell 之一，并且是许多 Linux 发行版中的默认 shell。</p>
<p>Shell 或命令行界面看起来是这样的：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-135.png" alt="image-135" width="600" height="400" loading="lazy"></p>
<p>Shell 接收用户的命令并显示输出。</p>
<p>在上述输出中，<code>zaira@Zaira</code> 是 shell 提示符。当 shell 以交互方式使用时，在等待用户命令时会显示一个 <code>$</code>。</p>
<p>如果 shell 以 root（具有管理权的用户）身份运行，提示符会变为 <code>#</code>。超级用户 shell 提示符看起来是这样的：</p>
<pre><code class="language-bash">[root@host ~]#
</code></pre>
<p>Bash 是 shell 的一种，还有其他 shell 可供使用，如 Korn shell（ksh）、C shell（csh）和 Z shell（zsh）。每种 shell 都有自己的语法和功能，但它们都有一个共同的目的，那就是提供一个命令行界面来与操作系统交互。</p>
<pre><code class="language-bash">ps
</code></pre>
<p>这是我的输出结果：</p>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://www.freecodecamp.org/news/content/images/2023/03/image-134.png" alt="检查 shell 类型，我使用的是 bash shell" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>检查 shell 类型，我使用的是 bash shell</figcaption>
</figure>
<p>总结一下，“shell” 是指任何提供命令行界面的程序的一个广泛术语，“Bash” 是一种特定类型的 shell，在 Unix/Linux 系统中广泛使用。</p>
<p>注意：在本教程中，我们将使用 “bash" shell。</p>
<h2 id="how-to-get-started-with-bash-scripting">如何开始编写 Bash 脚本</h2>
<h3 id="how-to-run-bash-commands-from-the-command-line">从命令行运行 Bash 命令</h3>
<p>如前所述，shell 提示符看起来像这样：</p>
<pre><code class="language-bash">[username@host ~]$
</code></pre>
<p>你可以在 <code>$</code> 符号后输入任何命令，并在终端上看到输出。</p>
<p>通常，命令遵循以下语法：</p>
<pre><code>command [选项] 参数
</code></pre>
<p>让我们讨论一些基本的 bash 命令并查看它们的输出。确保跟着做哦 :)</p>
<ul>
<li><code>date</code>：显示当前日期</li>
</ul>
<pre><code class="language-bash">zaira@Zaira:~/shell-tutorial$ date
Tue Mar 14 13:08:57 PKT 2023
</code></pre>
<ul>
<li><code>pwd</code>：显示当前工作目录。</li>
</ul>
<pre><code class="language-bash">zaira@Zaira:~/shell-tutorial$ pwd
/home/zaira/shell-tutorial
</code></pre>
<ul>
<li><code>ls</code>：列出当前目录的内容。</li>
</ul>
<pre><code class="language-bash">zaira@Zaira:~/shell-tutorial$ ls
check_plaindrome.sh  count_odd.sh  env  log  temp
</code></pre>
<ul>
<li><code>echo</code>：打印一段文本或变量的值到终端。</li>
</ul>
<pre><code class="language-bash">zaira@Zaira:~/shell-tutorial$ echo "Hello bash"
Hello bash
</code></pre>
<p>你可以始终使用 <code>man</code> 命令查看命令手册。</p>
<p>例如，<code>ls</code> 的手册看起来像这样：</p>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://www.freecodecamp.org/news/content/images/2023/03/image-138.png" alt="你可以使用 `man` 命令详细查看命令的选项" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>你可以使用 `man` 命令详细查看命令的选项</figcaption>
</figure>
<h3 id="how-to-create-and-execute-bash-scripts">如何创建和执行 Bash 脚本</h3>
<h4 id="">脚本命名约定</h4>
<p>按照惯例，bash 脚本以 <code>.sh</code> 结尾。然而，即使没有 <code>sh</code> 扩展名，bash 脚本也可以正常运行。</p>
<h4 id="shebang">添加 Shebang</h4>
<p>Bash 脚本以 <code>shebang</code> 开头。Shebang 是 <code>bash #</code> 和 <code>bang !</code> 的组合，后跟 bash shell 路径。这是脚本的第一行。Shebang 告诉 shell 通过 bash shell 执行它。Shebang 指向 bash 解释器的绝对路径。</p>
<p>以下是 shebang 语句的示例。</p>
<pre><code class="language-bash">#!/bin/bash
</code></pre>
<p>你可以使用以下命令找到你的 bash shell 路径（可能与上述路径不同）：</p>
<pre><code class="language-bash">which bash
</code></pre>
<h4 id="bash">创建我们的第一个 bash 脚本</h4>
<p>我们的第一个脚本提示用户输入路径。然后，它将列出路径的内容。</p>
<p>使用 <code>vi</code> 命令创建一个名为 <code>run_all.sh</code> 的文件。您可以使用任何您喜欢的编辑器。</p>
<pre><code class="language-bash">vi run_all.sh
</code></pre>
<p>在文件中添加以下命令并保存：</p>
<pre><code class="language-bash">#!/bin/bash
echo "今天是 " `date`

echo -e "\n请输入目录路径"
read the_path

echo -e "\n 你的路径包含以下文件和文件夹："
ls $the_path
</code></pre>
<p>打印用户提供的目录内容的脚本</p>
<p>让我们逐行仔细看看脚本。我将再次显示相同的脚本，但这次带有行号。</p>
<pre><code class="language-bash">  1 #!/bin/bash
  2 echo "今天是 " `date`
  3
  4 echo -e "\n请输入目录路径"
  5 read the_path
  6
  7 echo -e "\n 你的路径包含以下文件和文件夹："
  8 ls $the_path
</code></pre>
<ul>
<li>第 1 行：Shebang (<code>#!/bin/bash</code>) 指向 bash shell 路径。</li>
<li>第 2 行：<code>echo</code> 命令在终端显示当前日期和时间。注意 <code>date</code> 在反引号中。</li>
<li>第 4 行：我们希望用户输入一个有效的路径。</li>
<li>第 5 行：<code>read</code> 命令读取输入并将其存储在变量 <code>the_path</code> 中。</li>
<li>第 8 行：<code>ls</code> 命令使用存储路径的变量并显示当前的文件和文件夹。</li>
</ul>
<h4 id="bash">执行 bash 脚本</h4>
<p>为了使脚本可执行，请使用以下命令为您的用户分配执行权限：</p>
<pre><code class="language-bash">chmod u+x run_all.sh
</code></pre>
<p>这里，</p>
<ul>
<li><code>chmod</code> 修改文件的所有权以供当前用户使用：<code>u</code>。</li>
<li><code>+x</code> 将执行权限添加到当前用户。这意味着作为所有者的用户现在可以运行该脚本。</li>
<li><code>run_all.sh</code> 是我们希望运行的文件。</li>
</ul>
<p>您可以使用下列任何方法运行脚本：</p>
<ul>
<li><code>sh run_all.sh</code></li>
<li><code>bash run_all.sh</code></li>
<li><code>./run_all.sh</code></li>
</ul>
<p>让我们看看它在运行中的样子 🚀</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/03/run-script-bash-2.gif" alt="run-script-bash-2" width="600" height="400" loading="lazy"></p>
<h2 id="bash-scripting-basics">Bash 脚本基础</h2>
<h3 id="comments-in-bash-scripting">Bash 脚本中的注释</h3>
<p>Bash 脚本中的注释以 <code>#</code> 开头。这意味着任何以 <code>#</code> 开头的行都是注释，将被解释器忽略。</p>
<p>注释对于文档编写非常有帮助，并且是帮助他人理解代码的一个好习惯。</p>
<p>以下是注释的示例：</p>
<pre><code class="language-bash"># 这是一个示例注释
# 这两行将被解释器忽略
</code></pre>
<h3 id="variables-and-data-types-in-bash">Bash 中的变量和数据类型</h3>
<p>变量让您存储数据。您可以在脚本中使用变量读取、访问和操作数据。</p>
<p>Bash 中没有数据类型。在 Bash 中，变量能够存储数值、单个字符或字符串。</p>
<p>在 Bash 中，您可以通过以下方式使用和设置变量值：</p>
<pre><code>
```bash
country=Pakistan
</code></pre>
<p>2. &nbsp;根据从程序或命令获取的输出，使用命令替换赋值。请注意，$ 是访问现有变量值所需的。</p>
<pre><code class="language-bash">same_country=$country
</code></pre>
<p>这会将 <code>country</code> 的值赋给新变量 <code>same_country</code></p>
<p>要访问变量值，请在变量名称后附加 <code>$</code>。</p>
<pre><code class="language-bash">zaira@Zaira:~$ country=Pakistan
zaira@Zaira:~$ echo $country
Pakistan
zaira@Zaira:~$ new_country=$country
zaira@Zaira:~$ echo $new_country
Pakistan
</code></pre>
<p>赋值和打印变量值</p>
<h3 id="">变量命名规范</h3>
<p>在 Bash 脚本中，以下是变量命名规范：</p>
<ol>
<li>变量名称应以字母或下划线 (<code>_</code>) 开头。</li>
<li>变量名称可以包含字母、数字和下划线 (<code>_</code>)。</li>
<li>变量名称区分大小写。</li>
<li>变量名称不应包含空格或特殊字符。</li>
<li>使用能反映变量用途的描述性名称。</li>
<li>避免使用保留关键字（如 <code>if</code>, <code>then</code>, <code>else</code>, <code>fi</code> 等）作为变量名称。</li>
</ol>
<p>以下是一些合法变量名称的示例：</p>
<pre><code class="language-bash">name
count
_var
myVar
MY_VAR
</code></pre>
<p>以下是一些非法变量名称的示例：</p>
<pre><code class="language-bash">2ndvar (变量名称以数字开头)
my var (变量名称包含空格)
my-var (变量名称包含连字符)
</code></pre>
<p>遵循这些命名规范有助于使 Bash 脚本更具可读性和易于维护。</p>
<h3 id="input-and-output-in-bash-scripts">Bash 脚本中的输入和输出</h3>
<h4 id="">收集输入</h4>
<p>在本节中，我们将讨论一些为脚本提供输入的方法。</p>
<ol>
<li>读取用户输入并将其存储在变量中</li>
</ol>
<p>我们可以使用 <code>read</code> 命令读取用户输入。</p>
<pre><code class="language-bash">#!/bin/bash 

echo "What's your name?" 

read entered_name 

echo -e "\nWelcome to bash tutorial" $entered_name
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/03/name-sh.gif" alt="name-sh" width="600" height="400" loading="lazy"></p>
<p>2. &nbsp;从文件读取</p>
<p>此代码从名为 <code>input.txt</code> 的文件中读取每一行并将其打印到终端。我们将在本文稍后学习 while 循环。</p>
<pre><code class="language-bash">while read line
do
  echo $line
done &lt; input.txt
</code></pre>
<p>3. &nbsp;命令行参数</p>
<p>在 bash 脚本或函数中，<code>$1</code> 表示传递的初始参数，<code>$2</code> 表示传递的第二个参数，以此类推。</p>
<p>此脚本将名字作为命令行参数并打印个性化问候语。</p>
<pre><code class="language-bash">echo "Hello, $1!"
</code></pre>
<p>我们将 <code>Zaira</code> 作为参数提供给脚本。</p>
<pre><code class="language-bash">#!/bin/bash
echo "Hello, $1!"
</code></pre>
<p>脚本代码：<code>greeting.sh</code></p>
<p><strong>输出：</strong></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/03/name-sh-1.gif" alt="name-sh-1" width="600" height="400" loading="lazy"></p>
<h4 id="">显示输出</h4>
<p>这里我们将讨论一些从脚本接收输出的方法。</p>
<ol>
<li>打印到终端：</li>
</ol>
<pre><code class="language-bash">echo "Hello, World!"
</code></pre>
<p>这会将文本 “Hello, World!” 打印到终端。</p>
<p>2. &nbsp;写入文件：</p>
<pre><code class="language-bash">echo "This is some text." &gt; output.txt
</code></pre>
<p>这会将文本 "This is some text." 写入名为 <code>output.txt</code> 的文件。请注意，<code>&gt;</code> 操作符会覆盖文件内容（如果文件已存在）。</p>
<p>3. &nbsp;追加到文件：</p>
<pre><code class="language-bash">echo "More text." &gt;&gt; output.txt
</code></pre>
<p>这会将文本 "More text." 追加到 <code>output.txt</code> 文件的末尾。</p>
<p>4. &nbsp;重定向输出：</p>
<pre><code class="language-bash">ls &gt; files.txt
</code></pre>
<p>这会列出当前目录中的文件并将输出写入名为 <code>files.txt</code> 的文件。您可以通过这种方式将任何命令的输出重定向到文件。</p>
<h3 id="basic-bash-commands-echo-read-etc-">基本 Bash 命令（echo、read 等）</h3>
<p>以下是一些最常用的 bash 命令列表：</p>
<ol>
<li><code>cd</code>: 切换到不同目录。</li>
<li><code>ls</code>: 列出当前目录的内容。</li>
<li><code>mkdir</code>: 创建新目录。</li>
<li><code>touch</code>: 创建新文件。</li>
<li><code>rm</code>: 删除文件或目录。</li>
<li><code>cp</code>: 复制文件或目录。</li>
<li><code>mv</code>: 移动或重命名文件或目录。</li>
<li><code>echo</code>: 将文本打印到终端。</li>
<li><code>cat</code>: 连接并打印文件内容。</li>
<li><code>grep</code>: 在文件中搜索模式。</li>
<li><code>chmod</code>: 更改文件或目录的权限。</li>
<li><code>sudo</code>: 以管理权限运行命令。</li>
<li><code>df</code>: 显示可用磁盘空间。</li>
<li><code>history</code>: 显示先前执行的命令列表。</li>
<li><code>ps</code>: 显示有关正在运行的进程的信息。</li>
</ol>
<h3 id="conditional-statements-if-else-">条件语句（if/else）</h3>
<p>产生布尔结果（真或假）的表达式称为条件。有多种方法来评估条件，包括 <code>if</code>、<code>if-else</code>、<code>if-elif-else</code> 和嵌套条件。</p>
<p><strong><strong>语法</strong></strong>：</p>
<pre><code class="language-bash">if [[ condition ]];
then
	statement
elif [[ condition ]]; then
	statement 
else
	do this by default
fi
</code></pre>
<p>Bash 条件语句的语法</p>
<p>我们可以使用逻辑运算符（如 AND <code>-a</code> 和 OR <code>-o</code>）进行更具意义的比较。</p>
<pre><code class="language-bash">if [ $a -gt 60 -a $b -lt 100 ]
</code></pre>
<p>此语句检查两个条件是否都为真：a 大于 60 且 b 小于 100。</p>
<p>让我们看一个使用 <code>if</code>、<code>if-else</code> 和 <code>if-elif-else</code> 语句的 Bash 脚本示例，以确定用户输入的数字是正数、负数还是零：</p>
<pre><code class="language-bash">#!/bin/bash

echo "Please enter a number: "
read num
</code></pre>
<p>确定数字是正数、负数还是零的脚本</p>
<p>该脚本首先提示用户输入一个数字。然后，它使用一个 <code>if</code> 语句检查该数字是否大于 0。如果是的话，脚本输出该数字是正数。如果该数字不大于 0，脚本进入下一个语句，即 <code>if-elif</code> 语句。在这里，脚本检查该数字是否小于 0。如果是的话，脚本输出该数字是负数。最后，如果该数字既不大于 0 也不小于 0，脚本使用 <code>else</code> 语句输出该数字是零。</p>
<p>来看一下它的运行情况 🚀</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/03/test-odd.gif" alt="test-odd" width="600" height="400" loading="lazy"></p>
<h2 id="looping-and-branching-in-bash">在 Bash 中的循环和分支</h2>
<h3 id="while-loop">While 循环</h3>
<p>While 循环检查一个条件，并且在条件为 <code>true</code> 时持续循环。我们需要提供一个计数器语句来增加计数器以控制循环的执行。</p>
<p>在下面的例子中，<code>(( i += 1 ))</code> 是增加 <code>i</code> 值的计数器语句。该循环将恰好运行 10 次。</p>
<pre><code class="language-bash">#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
   echo "$i"
  (( i += 1 ))
done
</code></pre>
<p>While 循环迭代 10 次。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-187.png" alt="image-187" width="600" height="400" loading="lazy"></p>
<h3 id="for-loop">For 循环</h3>
<p><code>for</code> 循环，就像 <code>while</code> 循环一样，允许你执行特定次数的语句。每个循环在语法和用法上有所不同。</p>
<p>在下面的例子中，该循环将迭代 5 次。</p>
<pre><code class="language-bash">#!/bin/bash

for i in {1..5}
do
    echo $i
done
</code></pre>
<p>For 循环迭代 5 次。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-186.png" alt="image-186" width="600" height="400" loading="lazy"></p>
<h3 id="case-statements">Case 语句</h3>
<p>在 Bash 中，case 语句用于将给定值与一系列模式进行比较，并根据第一个匹配的模式执行一段代码。Bash 中 case 语句的语法如下：</p>
<pre><code class="language-bash">case expression in
    pattern1)
        # code to execute if expression matches pattern1
        ;;
    pattern2)
        # code to execute if expression matches pattern2
        ;;
    pattern3)
        # code to execute if expression matches pattern3
        ;;
    *)
        # code to execute if none of the above patterns match expression
        ;;
esac
</code></pre>
<p>Case 语句语法</p>
<p>这里，“expression” 是我们想要比较的值，“pattern1”、“pattern2”、“pattern3”等是我们想要进行比较的模式。</p>
<p>双分号 “;;” 将要为每个模式执行的代码块分隔开来。星号 “*” 代表默认情况，当没有一个指定的模式匹配该表达式时执行。</p>
<p>让我们看一个例子。</p>
<pre><code class="language-bash">fruit="apple"

case $fruit in
    "apple")
        echo "This is a red fruit."
        ;;
    "banana")
        echo "This is a yellow fruit."
        ;;
    "orange")
        echo "This is an orange fruit."
        ;;
    *)
        echo "Unknown fruit."
        ;;
esac
</code></pre>
<p>Case 语句示例</p>
<p>在这个例子中，由于 “fruit” 的值是 “apple”，第一个模式匹配，并且执行 echo “This is a red fruit.” 的代码块。如果 “fruit” 的值是 “banana”，第二个模式将匹配并执行 echo “This is a yellow fruit.” 的代码块，依此类推。如果 “fruit” 的值不匹配任何指定的模式，则执行默认情况，输出 “Unknown fruit.”。</p>
<h2 id="how-to-schedule-scripts-using-cron">如何使用 cron 安排脚本</h2>
<p>Cron 是 Unix-like 操作系统中用于作业调度的强大工具。通过配置 cron，你可以设置自动作业在每日、每周、每月或特定时间运行。cron 提供的自动化能力在 Linux 系统管理中起到了至关重要的作用。</p>
<p>以下是调度 crons 的语法：</p>
<pre><code class="language-bash"># Cron job example
* * * * * sh /path/to/script.sh
</code></pre>
<p>这里，<code>*</code> 代表分别的分钟、小时、日、月、周几。</p>
<p>以下是一些安排 cron 作业的示例。</p>
<table>
<thead>
<tr>
<th>安排</th>
<th>描述</th>
<th>示例</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>0 0 * * *</code></td>
<td>每天午夜运行一个脚本</td>
<td><code>0 0 * * * /path/to/script.sh</code></td>
</tr>
<tr>
<td><code>*/5 * * * *</code></td>
<td>每 5 分钟运行一个脚本</td>
<td><code>*/5 * * * * /path/to/script.sh</code></td>
</tr>
<tr>
<td><code>0 6 * * 1-5</code></td>
<td>从星期一到星期五每天早上 6 点运行一个脚本</td>
<td><code>0 6 * * 1-5 /path/to/script.sh</code></td>
</tr>
<tr>
<td><code>0 0 1-7 * *</code></td>
<td>每个月的前 7 天运行一个脚本</td>
<td><code>0 0 1-7 * * /path/to/script.sh</code></td>
</tr>
<tr>
<td><code>0 12 1 * *</code></td>
<td>每个月的第一天中午 12 点运行一个脚本</td>
<td><code>0 12 1 * * /path/to/script.sh</code></td>
</tr>
</tbody>
</table>
<h4 id="crontab">使用 crontab</h4>
<p><code>crontab</code> 工具用于添加和编辑 cron 作业。</p>
<p><code>crontab -l</code> 列出特定用户已经安排好的脚本。</p>
<p>你可以通过 <code>crontab -e</code> 添加和编辑 cron。</p>
<p>你可以在我的<a href="https://www.freecodecamp.org/news/cron-jobs-in-linux/">另一篇文章</a>中阅读更多关于 cron 作业的内容。</p>
<h2 id="how-to-debug-and-troubleshoot-bash-scripts">如何调试和排除 Bash 脚本的故障</h2>
<p>调试和排除故障是任何 Bash 脚本编写者的重要技能。虽然 Bash 脚本可以非常强大，但它们也容易出现错误和意外行为。在本节中，我们将讨论一些调试和排除 Bash 脚本故障的技巧和技术。</p>
<p>调试 Bash 脚本最有用的技巧之一是在脚本的开头设置 <code>set -x</code> 选项。这个选项启用了调试模式，使得 Bash 会在终端中打印它执行的每个命令，并以 <code>+</code> 符号作为前缀。这对于识别脚本中出现错误的位置非常有帮助。</p>
<pre><code class="language-bash">#!/bin/bash

set -x

# 您的脚本放在这里
</code></pre>
<h3 id="">检查退出码</h3>
<p>当 Bash 遇到错误时，它会设置一个退出码来指示错误的性质。您可以使用 <code>$?</code> 变量检查最近命令的退出码。值为 <code>0</code> 表示成功，而任何其他值表示错误。</p>
<pre><code class="language-bash">#!/bin/bash

# 您的脚本放在这里

if [ $? -ne 0 ]; then
    echo "发生错误。"
fi
</code></pre>
<h3 id="echo">使用 <code>echo</code> 语句</h3>
<p>另一个调试 Bash 脚本的有用技巧是在代码中插入 <code>echo</code> 语句。这可以帮助您识别错误发生的位置以及变量传递的值是什么。</p>
<pre><code class="language-bash">#!/bin/bash

# 您的脚本放在这里

echo "变量 x 的值是: $x"

# 更多代码放在这里
</code></pre>
<h3 id="sete">使用 <code>set -e</code> 选项</h3>
<p>如果您希望在脚本中的任何命令失败时立即退出脚本，您可以使用 <code>set -e</code> 选项。这个选项会使 Bash 在脚本中的任何命令失败时退出并带有错误，这样可以更容易地识别和修复脚本中的错误。</p>
<pre><code class="language-bash">#!/bin/bash

set -e

# 您的脚本放在这里
</code></pre>
<h3 id="">通过验证日志来排查定时任务</h3>
<p>我们可以使用日志文件来排查定时任务。日志会记录所有的计划任务。您可以在日志中检查并验证特定任务是否按预期运行。</p>
<p>对于 Ubuntu/Debian，您可以在这里找到 <code>cron</code> 日志：</p>
<pre><code class="language-bash">/var/log/syslog
</code></pre>
<p>其他发行版的位置各不相同。</p>
<p>一个 cron 任务日志文件可能看起来像这样：</p>
<pre><code class="language-bash">2022-03-11 00:00:01 Task started
2022-03-11 00:00:02 Running script /path/to/script.sh
2022-03-11 00:00:03 Script completed successfully
2022-03-11 00:05:01 Task started
2022-03-11 00:05:02 Running script /path/to/script.sh
2022-03-11 00:05:03 Error: unable to connect to database
2022-03-11 00:05:03 Script exited with error code 1
2022-03-11 00:10:01 Task started
2022-03-11 00:10:02 Running script /path/to/script.sh
2022-03-11 00:10:03 Script completed successfully
</code></pre>
<p>Cron 日志</p>
<h2 id="conclusion">总结</h2>
<p>在本文中，我们首先介绍了如何访问终端，然后运行了一些基本的 bash 命令。我们还学习了什么是 bash shell。我们简要地了解了使用循环和条件语句实现分支代码。最后，我们讨论了使用 cron 来自动化脚本，并介绍了一些故障排除技巧。</p>
<h3 id="resources-for-learning-more-about-bash-scripting">学习更多关于 Bash 脚本的资源</h3>
<p>如果您想深入了解 bash 脚本的世界，我建议您看看 freeCodeCamp 上这门 6 小时的 Linux 课程。</p>
<figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/sWbUDq4S6Y8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="Introduction to Linux – Full Course for Beginners" name="fitvid0"></iframe>
          </div>
        </div>
      </figure>
<p>在本教程中，你学到了最喜欢的内容是什么？你还可以在这些<a href="https://zaira_.bio.link/">平台</a>上与我联系。</p>
<p>让我们在下篇教程中再见，祝你编码愉快 😁</p>
<p>封面图片来源：<a href="https://www.freepik.com/free-vector/hand-drawn-flat-design-devops-illustration_25726540.htm#query=programmer%20linux&amp;position=4&amp;from_view=search&amp;track=ais">Freepik</a></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何在 Linux 中删除文件或目录 ]]>
                </title>
                <description>
                    <![CDATA[ 在 Linux 中，删除文件或目录是每个用户都必须知道的基本操作。虽然删除文件或目录看似简单，但其实有多种不同的方法，每种方法都有其特定的使用情况。 本教程将逐步介绍如何在 Linux 中删除文件或目录。我们还将介绍你可以用来删除文件和文件夹及其内容的命令。 如何在 Linux 中删除文件 删除文件涉及从文件系统中删除对文件的引用。文件本身不会立即从存储设备中删除，但其空间会被标记为可重复使用。 在 Linux 中删除文件有几种方法。下面是一些最常见的方法： 使用图形用户界面文件管理器 大多数 Linux 发行版都自带图形用户界面文件管理器，允许你使用图形界面删除文件。只需导航到要删除的文件，右键单击该文件，然后选择“删除”或“移至回收站”即可。 使用rm命令 在 Linux 中，你还可以使用rm（remove）命令来删除文件和目录。要使用 rm 命令删除文件，请在终端中键入以下命令： rm filename 确保将 filename 替换为要删除的文件名。如果文件有写保护或你没有足够的权限删除它，系统会提示你确认删除。 使用 shred 命令 shred 命令是一 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-to-delete-a-file-or-directory-in-linux/</link>
                <guid isPermaLink="false">66136abe3fc36503d53aca5c</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Mon, 08 Apr 2024 04:12:27 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2024/04/Shittu-Olumide-How-to-Delete-a-File-or-Directory-in-Linux---Command-to-Remove-a-Folder-and-its-Contents.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/how-to-delete-a-file-or-directory-in-linux/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Delete a File or Directory in Linux – Command to Remove a Folder and its Contents</a>
      </p><p>在 Linux 中，删除文件或目录是每个用户都必须知道的基本操作。虽然删除文件或目录看似简单，但其实有多种不同的方法，每种方法都有其特定的使用情况。</p><p>本教程将逐步介绍如何在 Linux 中删除文件或目录。我们还将介绍你可以用来删除文件和文件夹及其内容的命令。</p><h2 id="-linux-"><strong>如何在 Linux 中删除文件</strong></h2><p>删除文件涉及从文件系统中删除对文件的引用。文件本身不会立即从存储设备中删除，但其空间会被标记为可重复使用。</p><p>在 Linux 中删除文件有几种方法。下面是一些最常见的方法：</p><h3 id="-"><strong>使用图形用户界面文件管理器</strong></h3><p>大多数 Linux 发行版都自带图形用户界面文件管理器，允许你使用图形界面删除文件。只需导航到要删除的文件，右键单击该文件，然后选择“删除”或“移至回收站”即可。</p><h3 id="-rm-"><strong>使用<code>rm</code>命令</strong></h3><p>在 Linux 中，你还可以使用<code>rm</code>（remove）命令来删除文件和目录。要使用 <code>rm</code> 命令删除文件，请在终端中键入以下命令：</p><pre><code class="language-bash">rm filename
</code></pre><p>确保将 <code>filename</code> 替换为要删除的文件名。如果文件有写保护或你没有足够的权限删除它，系统会提示你确认删除。</p><h3 id="-shred-"><strong>使用 <code>shred</code> 命令</strong><br></h3><p><code>shred</code><strong> </strong>命令是一种更安全的删除文件的方法，它在删除文件前会多次覆盖文件内容。这样，任何人都很难恢复被删除的文件。</p><p>要使用 <code>shred</code> 命令，请在终端中键入以下命令：</p><pre><code class="language-bash">shred -u filename
</code></pre><p>请确保将<code>filename</code>替换为要删除的文件名。<code>-u</code>选项会告诉 <code>shred</code> 在覆盖文件后将其删除。</p><h3 id="-trash-cli-"><strong>使用<code>trash-cli</code>命令</strong></h3><p><code>trash-cli</code>命令提供了一种更安全的删除文件方式，它可以将文件移到垃圾桶，而不是立即删除。要使用 <code>trash-cli</code> 命令，首先要安装它：</p><pre><code class="language-bash">sudo apt-get install trash-cli
</code></pre><p>安装完成后，可以使用以下命令删除文件：</p><pre><code class="language-bash">trash filename
</code></pre><h2 id="-linux--1"><strong>如何在 Linux 中删除目录</strong></h2><p>要在 Linux 中删除一个目录，可以使用<code>rmdir</code>或<code>rm</code>命令。使用<code>rmdir</code>命令可以删除一个空目录，而使用<code>rm</code>命令则可以删除一个目录及其所有内容。</p><h3 id="-rm--1"><strong>使用<code>rm</code>命令</strong></h3><p>下面是在 Linux 中使用<code>rm</code>命令删除目录的步骤：</p><ul><li><strong>打开终端</strong>：要在 Linux 中删除一个目录，你需要使用命令行。按键盘上的 “Ctrl+Alt+T” 或在系统的应用程序启动器中搜索“终端”，打开终端。</li><li><strong>导航到要删除的目录</strong>：使用<code>cd</code>命令导航到要删除的目录。例如，如果要删除的目录名为<code>my_directory</code>，且位于主文件夹中，则键入<code>cd ~/my_directory</code>，然后按回车键。</li><li><strong>检查目录内容</strong>：在删除目录之前，最好先检查一下目录内容，以确保删除的是正确的目录。使用<code>ls</code>命令列出目录内容。例如，键入<code>ls</code>并按下回车键，即可查看<code>my_directory</code>文件夹中的文件和文件夹。</li><li><strong>删除目录及其内容：</strong>要删除目录及其所有内容，请使用带有<code>-r</code>选项（代表递归）的<code>rm</code>命令。输入<code>rm -r my_directory</code>，然后按回车键。系统会提示你确认删除。键入<code>y</code>并按回车键确认。</li><li><strong>验证目录是否已删除</strong>：要验证目录是否已删除，可使用<code>ls</code>命令列出父目录的内容。例如，如果<code>my_directory</code>文件夹位于你的主文件夹中，请键入<code>ls ~/</code>，然后按回车键。<code>my_directory</code>文件夹应该不会再被列出。</li></ul><p>注意：使用<code>rm -r</code>命令时要非常小心，因为它会不可逆转地删除文件和目录。</p><h3 id="-rmdir-"><strong>使用<code>rmdir</code>命令</strong></h3><p>下面是在 Linux 中使用<code>rmdir</code>命令删除目录的步骤：</p><ul><li><strong>打开终端</strong>： 按键盘上的 “Ctrl+Alt+T” 或在系统的应用程序启动器中搜索“终端”，打开终端。</li><li><strong>导航到要删除的目录</strong>：使用<code>cd</code>命令导航到要删除的目录。例如，如果要删除的目录名为<code>my_directory</code>，且位于主文件夹中，则键入<code>cd ~/my_directory</code>，然后按回车键。</li><li><strong>删除目录</strong>：要删除目录，请使用<code>rmdir</code>命令，后跟目录名。键入<code>rmdir my_directory</code>，然后按回车键。如果目录不是空的，则会收到一条错误信息，目录也不会被删除。</li><li><strong>验证目录是否已删除</strong>：要验证目录是否已删除，可使用<code>ls</code>命令列出父目录的内容。例如，如果<code>my_directory</code>文件夹位于你的主文件夹中，请键入<code>ls ~/</code>，然后按回车键。<code>my_directory</code>文件夹应该不会再被列出。</li></ul><h2 id="--1"><strong>总结</strong></h2><p><code>rm</code>命令是删除文件最常用的命令，而带有<code>-r</code>或<code>-R</code>选项的<code>rmdir</code>和<code>rm</code>命令则用于删除目录。按照本指南逐步操作，你现在就可以在 Linux 中有效地删除文件或目录了。</p><p>其他提示：</p><ul><li>在使用带有<code>-r</code>或<code>-R</code>选项的 <code>rm</code> 命令时要小心，因为它会不可逆转地删除文件和目录。</li><li>删除前一定要仔细检查文件或目录的名称，以免误删文件或目录。</li><li>只有在必要时才使用 <code>shred</code><strong> </strong>命令，因为它删除文件的时间可能比其他方法更长。</li><li>删除文件或目录时要注意文件权限，因为有些文件或目录可能需要 root 访问权限才能删除。</li></ul><p>你可以在 <a href="https://www.twitter.com/Shittu_Olumide_">Twitter</a> 和 <a href="https://www.linkedin.com/in/olumide-shittu">LinkedIn</a> 上联系我。你还可以订阅我的 <a href="https://www.youtube.com/channel/UCNhFxpk6hGt5uMCKXq0Jl8A">YouTube</a> 频道。</p><p>编码愉快！</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 在 Ubuntu 中设置静态 IP——Linux IP 地址教程 ]]>
                </title>
                <description>
                    <![CDATA[ 在大多数网络配置中，路由器 DHCP 服务器默认动态分配 IP 地址。如果你想确保系统 IP 每次都保持不变，可以强制它使用静态 IP。 这就是我们将在本文中学习的内容。我们将探讨在 Ubuntu 中设置静态 IP 的两种方法。 静态 IP 地址适用于以下情况：  * 配置端口转发  * 将系统配置为服务器，如 FTP 服务器、Web 服务器或媒体服务器 前提条件： 要学习本教程，你需要具备以下条件：  * 安装 Ubuntu，最好有图形用户界面  * sudo权限，因为我们将修改系统配置文件 如何使用命令行设置静态 IP 在本节中，我们将详细介绍配置静态 IP 所需的所有步骤。 第 1 步：启动终端 可以使用快捷键Ctrl+ Shift+t 启动终端。 第 2 步：记录当前网络的信息 我们需要当前网络的详细信息，如当前分配的 IP、子网掩码和网络适配器名称，以便在配置中进行必要的更改。 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/setting-a-static-ip-in-ubuntu-linux-ip-address-tutorial/</link>
                <guid isPermaLink="false">661360b43fc36503d53ac974</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Wed, 03 Apr 2024 03:36:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2024/04/setting-static-ip-ubuntu.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/setting-a-static-ip-in-ubuntu-linux-ip-address-tutorial/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Setting a Static IP in Ubuntu – Linux IP Address Tutorial</a>
      </p><p>在大多数网络配置中，路由器 DHCP 服务器默认动态分配 IP 地址。如果你想确保系统 IP 每次都保持不变，可以强制它使用静态 IP。</p><p>这就是我们将在本文中学习的内容。我们将探讨在 Ubuntu 中设置静态 IP 的两种方法。</p><p>静态 IP 地址适用于以下情况：</p><ul><li>配置端口转发</li><li>将系统配置为服务器，如 FTP 服务器、Web 服务器或媒体服务器</li></ul><p><strong>前提条件：</strong></p><p>要学习本教程，你需要具备以下条件：</p><ul><li>安装 Ubuntu，最好有图形用户界面</li><li><code>sudo</code>权限，因为我们将修改系统配置文件</li></ul><h2 id="-ip"><strong>如何使用命令行设置静态 IP</strong></h2><p>在本节中，我们将详细介绍配置静态 IP 所需的所有步骤。</p><h3 id="-1-"><strong>第 1 步：启动终端</strong></h3><p>可以使用快捷键<code>Ctrl+ Shift+t</code> 启动终端。</p><h3 id="-2-"><strong>第 2 步：记录当前网络的信息</strong></h3><p>我们需要当前网络的详细信息，如当前分配的 IP、子网掩码和网络适配器名称，以便在配置中进行必要的更改。</p><p>使用下面的命令查找可用适配器的详细信息和各自的 IP 信息。</p><pre><code class="language-bash">ip a</code></pre><p>输出如下：</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-14.png" class="kg-image" alt="image-14" width="600" height="400" loading="lazy"></figure><p>对我的网络来说，当前的适配器是<code>eth0</code>。你的系统可能与此不同</p><ul><li><strong>注意当前网络适配器名称</strong></li></ul><p>由于我的当前适配器是<code>eth0</code>，因此下面的详细信息与之相关。</p><pre><code class="language-bash">6: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:df:c3:ad brd ff:ff:ff:ff:ff:ff
    inet 172.23.199.129/20 brd 172.23.207.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fedf:c3ad/64 scope link
       valid_lft forever preferred_lft forever</code></pre><p>值得注意的是，当前的 IP<code>172.23.199.129</code>是动态分配的。它为网络掩码预留了<code>20</code>位。广播地址为<code> 172.23.207.255</code>。</p><ul><li><strong>注意子网</strong></li></ul><p>我们可以使用下面的命令查找子网掩码的详细信息：</p><pre><code class="language-bash">ifconfig -a</code></pre><p>根据你的适配器选择输出，并仔细阅读。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2024/04/image.png" class="kg-image" alt="image" srcset="https://chinese.freecodecamp.org/news/content/images/size/w600/2024/04/image.png 600w, https://chinese.freecodecamp.org/news/content/images/2024/04/image.png 948w" sizes="(min-width: 720px) 720px" width="948" height="236" loading="lazy"><figcaption>IP 是 <code>172.23.199.129</code>，子网掩码是 <code>255.255.240.0</code></figcaption></figure><p>根据类和子网掩码，我的网络可用主机 IP 范围是：<code>172.23.192.1 - 172.23.207.254</code>。</p><p>子网划分是一个庞大的话题。有关子网划分和可用 IP 范围的更多信息，请查看<a href="https://www.freecodecamp.org/news/subnet-cheat-sheet-24-subnet-mask-30-26-27-29-and-other-ip-address-cidr-network-references/">本文</a>。</p><h3 id="-3-"><strong>第 3 步：更改配置</strong><br></h3><p><a href="https://netplan.io/">Netplan</a>是最新版 Ubuntu 的默认网络管理工具。Netplan 的配置文件使用 YAML 编写，扩展名为<code>.yaml</code>。</p><p>注意：要小心配置文件中的空格，因为它们是语法的一部分。如果缩进不对，文件将无法正常读取。</p><ul><li>转到位于<code>/etc/netplan</code> 的<code>netplan</code>目录。</li></ul><p><code>ls</code>进入<code>/etc/netplan</code>目录。</p><p>如果你没有看到任何文件，可以创建一个。文件名可以是任何名字，但按照惯例，应该以<code>01-</code>这样的数字开头，以<code>.yaml</code> 结尾。如果有多个配置文件，数字会设定优先级。</p><p>我将创建一个名为<code>01-network-manager-all.yaml</code> 的文件。</p><p>让我们把这些行添加到文件中。我们将逐步创建文件。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">network:
 version: 2</code></pre><figcaption>01-network-manager-all.yaml</figcaption></figure><p>Netplan 配置文件的顶层节点是一个<code>network:</code>映射，其中包含 version:<code>2</code>（表示使用网络定义版本 2）。</p><p>接下来，我们将添加一个渲染器来控制整个网络。默认情况下，渲染器为<code>systemd-networkd</code>，但我们将其设置为<code>NetworkManager</code>。</p><p>现在，我们的文件看起来是这样的：</p><pre><code class="language-bash">network:
 version: 2
 renderer: NetworkManager</code></pre><p>接下来，我们将添加<code>ethernets</code>，并参考之前在步骤#2 中查找的网络适配器名称。其他支持的设备类型包括 <code>modems:</code>、<code>wifis:</code> 或 <code>bridges:</code>。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">network:
 version: 2
 renderer: NetworkManager
 ethernets:
   eth0:</code></pre><figcaption>01-network-manager-all.yaml</figcaption></figure><p>由于我们设置的是静态 IP，不想为该网络适配器动态分配 IP，因此将<code>dhcp4</code>设置为 <code>no</code>。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">network:
 version: 2
 renderer: NetworkManager
 ethernets:
   eth0:
     dhcp4: no</code></pre><figcaption>01-network-manager-all.yaml</figcaption></figure><p>现在，我们将根据子网和可用 IP 范围指定第 2 步中提到的特定静态 IP。它是<code>172.23.207.254</code>。</p><p>接下来，我们要指定网关，即分配 IP 地址的路由器或网络设备。我的网关是<code>192.168.1.1</code>。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">network:
 version: 2
 renderer: NetworkManager
 ethernets:
   eth0:
     dhcp4: no
     addresses: [172.23.207.254/20]
     gateway4: 192.168.1.1</code></pre><figcaption>01-network-manager-all.yaml</figcaption></figure><p>接下来，我们将定义 <code>nameservers</code>。这是定义 DNS 服务器或第二个 DNS 服务器的地方。这里的第一个值是 <code>8.8.8.8</code>，它是 Google 的主 DNS 服务器，第二个值是<code>8.8.8.4</code>，它是 Google 的辅助 DNS 服务器。这些值可根据你的要求而有所不同。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">network:
 version: 2
 renderer: NetworkManager
 ethernets:
   eth0:
     dhcp4: no
     addresses: [172.23.207.254/20]
     gateway4: 192.168.1.1
     nameservers:
         addresses: [8.8.8.8,8.8.8.4]</code></pre><figcaption>01-network-manager-all.yaml</figcaption></figure><h3 id="-4-"><strong>第 4 步：应用并测试更改</strong></h3><p>在永久应用更改之前，我们可以先使用该命令测试更改：</p><pre><code class="language-bash">sudo netplan try
</code></pre><p>如果没有错误，它会询问你是否要应用这些设置。</p><p>最后，使用 <code>ip a</code> 命令测试更改，你会发现静态 IP 已被应用。</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-17.png" class="kg-image" alt="image-17" width="600" height="400" loading="lazy"><figcaption>应用静态 IP</figcaption></figure><h2 id="-ip-1"><strong>如何使用图形用户界面设置静态 IP</strong></h2><p>通过 Ubuntu 图形用户界面/桌面设置静态 IP 非常简单。步骤如下：</p><ul><li>搜索 <code>settings</code></li><li>点击 “Network” 或 “Wi-Fi” 选项卡，具体取决于你要修改的界面</li><li>要打开接口设置，点击接口名称旁边的齿轮图标</li><li>在 IPV4 标签中选择 “Manual“，然后输入静态 IP 地址、掩码和网关</li><li>单击 <code>Apply</code> 按钮</li></ul><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-16.png" class="kg-image" alt="image-16" width="600" height="400" loading="lazy"><figcaption>使用 Ubuntu 桌面手动设置静态 IP</figcaption></figure><ul><li>使用命令 <code>ip a</code> 来验证</li></ul><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-18.png" class="kg-image" alt="image-18" width="600" height="400" loading="lazy"><figcaption>通过图形用户界面更新静态 IP</figcaption></figure><h2 id="-"><strong>总结</strong></h2><p>本文介绍了在 Ubuntu 中设置静态 IP 的两种方法。希望这篇文章对你有所帮助。</p><p>你从本教程中学到的最喜欢的东西是什么？在 <a href="https://twitter.com/hira_zaira">Twitter</a> 上告诉我！</p><p>你可以在<a href="https://www.freecodecamp.org/news/author/zaira/">这里</a>阅读我的其他文章。</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何在 Linux 中复制目录——使用 cp 命令复制文件夹 ]]>
                </title>
                <description>
                    <![CDATA[ 在 Linux 中，你经常需要复制一个文件夹来执行特定任务，比如备份、共享、编辑等。你可以使用 cp 命令来执行这项频繁的任务。 cp 命令是一个简单而强大的命令，你可以用它在 Linux 中复制文件和目录。在本教程中，我们将讨论如何在 Linux 中使用 cp 命令复制文件夹。 在 Linux 中使用 cp 命令复制目录的步骤如下： 第 1 步：打开终端 要在 Linux 中复制文件夹，你需要打开终端。你可以按下 Ctrl+Alt+T 快捷键或在应用程序菜单中搜索终端应用程序来打开终端。 第 2 步：导航到 source 目录 复制文件夹前，你需要导航到 source 目录。你可以使用 cd 命令将当前工作目录更改为 source 目录。 例如，如果要复制的文件夹位于 home 目录，可以使用以下命令： cd /home/user/source_folder 第 3 步：复制文件夹 导航到 source 目录后，你就可以使用 cp ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-to-copy-a-directory-in-linux-use-the-cp-command-to-copy-a-folder/</link>
                <guid isPermaLink="false">660a2246b39dd20404fe975d</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Mon, 01 Apr 2024 04:12:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2024/04/Shittu-Olumide-How-to-Copy-a-Directory-in-Linux---Use-the-cp-Command-to-Copy-a-Folder.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/how-to-copy-a-directory-in-linux-use-the-cp-command-to-copy-a-folder/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Copy a Directory in Linux – Use the cp Command to Copy a Folder</a>
      </p><p>在 Linux 中，你经常需要复制一个文件夹来执行特定任务，比如备份、共享、编辑等。你可以使用 <code>cp</code> 命令来执行这项频繁的任务。</p><p><code>cp</code> 命令是一个简单而强大的命令，你可以用它在 Linux 中复制文件和目录。在本教程中，我们将讨论如何在 Linux 中使用 <code>cp</code> 命令复制文件夹。</p><p>在 Linux 中使用 <code>cp</code> 命令复制目录的步骤如下：</p><h2 id="-1-">第 1 步：打开终端</h2><p>要在 Linux 中复制文件夹，你需要打开终端。你可以按下 <code>Ctrl+Alt+T</code> 快捷键或在应用程序菜单中搜索终端应用程序来打开终端。</p><h2 id="-2-source-">第 2 步：导航到 source 目录</h2><p>复制文件夹前，你需要导航到 source 目录。你可以使用 <code>cd</code> 命令将当前工作目录更改为 source 目录。</p><p>例如，如果要复制的文件夹位于 home 目录，可以使用以下命令：</p><pre><code class="language-bash">cd /home/user/source_folder
</code></pre><h2 id="-3-">第 3 步：复制文件夹</h2><p>导航到 source 目录后，你就可以使用 <code>cp</code> 命令复制文件夹了。<code>cp</code> 命令的基本语法如下：</p><pre><code class="language-bash">cp [options] source destination
</code></pre><p>要复制文件夹，需要指定 <code>-r</code> 选项（代表递归），以复制整个目录树。还需要指定 source 路径和目标路径。</p><p>例如，要将名为 <code>source_folder</code> 的文件夹复制到名为 <code>destination_folder</code> 的目标目录，可以使用以下命令：</p><pre><code class="language-bash">cp -r source_folder /path/to/destination_folder/
</code></pre><p>注意，需要用目标目录的实际路径替换 <code>/path/to/destination_folder/</code>。</p><h2 id="-4-">第 4 步：验证复制的文件夹</h2><p>复制文件夹后，你可以在目标目录中验证复制的文件和目录。你可以使用 <code>ls</code> 命令列出目标目录的内容。</p><p>例如，可以使用以下命令列出 <code>destination_folder</code> 目录的内容：</p><pre><code class="language-bash">ls /path/to/destination_folder/
</code></pre><p>这将显示目标文件夹中的文件和目录列表。</p><h2 id="linux-cp-">Linux cp 命令的好处</h2><p>你可能想知道使用终端和 <code>cp</code> 命令复制文件夹有什么好处。</p><p>使用 Linux 终端复制文件夹有几个好处，包括：</p><ul><li>灵活性：在复制文件夹时，Linux 终端比图形用户界面更具灵活性和控制性。通过终端，你可以使用命令行选项自定义复制过程，并处理可能出现的任何错误。</li><li>速度快：与图形用户界面相比，使用终端复制包含大量文件的大型文件夹速度更快。这是因为终端使用的系统资源更少，执行操作的速度比图形界面更快。</li><li>效率：终端允许同时执行多项任务，可以同时运行多个命令。这可以节省时间，提高复制过程的效率。</li><li>自动化：在终端中复制文件夹可以使用脚本自动完成。这意味着，通过创建脚本来复制常用文件夹可以节省时间，而且只需一条命令即可运行脚本。</li><li>可靠性：终端是一种可靠的文件夹复制方式，因为它能提供复制过程的反馈，包括可能出现的错误或警告。这样你就可以采取纠正措施，确保复制过程顺利完成。</li></ul><h2 id="-"><strong>小结</strong></h2><p>在 Linux 中复制文件夹是一项使用 <code>cp</code> 命令就能完成的简单任务。按照本文概述的步骤，你可以在 Linux 中使用 <code>cp</code> 命令轻松复制文件夹。</p><p>记住使用 <code>-r</code> 选项复制整个目录树，并通过列出目标目录中的内容来验证复制的文件夹。</p><p>我们可以在 <a href="https://www.twitter.com/Shittu_Olumide_">Twitter</a> 和 <a href="https://www.linkedin.com/in/olumide-shittu">LinkedIn</a> 上联系。你还可以订阅我的 <a href="https://www.youtube.com/channel/UCNhFxpk6hGt5uMCKXq0Jl8A">YouTube</a> 频道。</p><p>Happy Coding!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 播客 Ep. 20 对话嵌入式软件开发者 Rudy：开源操作系统、公益和教育 ]]>
                </title>
                <description>
                    <![CDATA[ 今天我们邀请了嘉宾 Rudy，介绍他呢要用好几个斜杠：开发者/公益青年/开源贡献者/运动员/up 主，当然这只是我所知道的几个身份。 Rudy他在一个小镇长大，大学时拥有了第一台电脑，因为舍不得花五十块钱为电脑换系统，所以自己学习计算机知识，接触到开源软件，这就开启了他之后丰富有趣的经历。 在这期节目里，他分享了从运动员过渡为程序员、学习嵌入式软件开发、为开源操作系统 Linux 和 RT-Thread 做贡献的经历，以及在开源社区和公益领域贡献的经验如何让他在职业路上发展得更好。 他维护一个网站“人人都懂物联网 [https://getiot.tech/]”，希望创建一所没有边界的学校，帮助人们学习物联网相关技术，欢迎大家参与开源贡献。 希望你喜欢这期节目，并把它分享给更多朋友，带给更多人启发和动力。也欢迎你发邮件分享自己的故事，也许我们会邀请你作为 freeCodeCamp 播客的嘉宾。你可以在这篇文章 [https://www.freecodecamp.org/chinese/news/freecodecamp-podcast-in-chinese/] 中找到邮箱地址。  ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/interview-rudy-embedded-development-and-operating-systems/</link>
                <guid isPermaLink="false">656aba82f4acfe03f397b229</guid>
                
                    <category>
                        <![CDATA[ 播客 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 嵌入式系统 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 教育 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 操作系统 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Fri, 01 Dec 2023 01:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/12/Chinese--1--1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>今天我们邀请了嘉宾 Rudy，介绍他呢要用好几个斜杠：开发者/公益青年/开源贡献者/运动员/up 主，当然这只是我所知道的几个身份。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/12/luhuadong.jpg" class="kg-image" alt="luhuadong" srcset="https://chinese.freecodecamp.org/news/content/images/size/w600/2023/12/luhuadong.jpg 600w, https://chinese.freecodecamp.org/news/content/images/size/w1000/2023/12/luhuadong.jpg 1000w, https://chinese.freecodecamp.org/news/content/images/2023/12/luhuadong.jpg 1406w" sizes="(min-width: 720px) 720px" width="1406" height="1870" loading="lazy"><figcaption>Rudy</figcaption></figure><!--kg-card-begin: html--><iframe width="100%" height="180" frameborder="no" scrolling="no" seamless="" src="https://share.transistor.fm/e/6b889643" title="嵌入内容" loading="lazy"></iframe><!--kg-card-end: html--><p>他在一个小镇长大，大学时拥有了第一台电脑，因为舍不得花五十块钱为电脑换系统，所以自己学习计算机知识，接触到开源软件，这就开启了他之后丰富有趣的经历。</p><p>在这期节目里，他分享了从运动员过渡为程序员、学习嵌入式软件开发、为开源操作系统 Linux 和 RT-Thread 做贡献的经历，以及在开源社区和公益领域贡献的经验如何让他在职业路上发展得更好。</p><p>他维护一个网站“<a href="https://getiot.tech/">人人都懂物联网</a>”，希望创建一所没有边界的学校，帮助人们学习物联网相关技术，欢迎大家参与开源贡献。</p><p>希望你喜欢这期节目，并把它分享给更多朋友，带给更多人启发和动力。也欢迎你发邮件分享自己的故事，也许我们会邀请你作为 freeCodeCamp 播客的嘉宾。你可以在<a href="https://www.freecodecamp.org/chinese/news/freecodecamp-podcast-in-chinese/">这篇文章</a>中找到邮箱地址。</p><p>欢迎在 <a href="https://chinese.freecodecamp.org/">https://chinese.freecodecamp.org/</a> 查看更多免费的编程学习资源。</p><h2 id="-"><strong>主要话题</strong></h2><ul><li>03:34 高中时接触编程</li><li>05:50 本来打算成为职业运动员</li><li>11:29 嵌入式是什么意思</li><li>12:50 嵌入式开发就业前景和学习路线</li><li>16:30 学 JavaScript 可以做嵌入式开发吗</li><li>20:10 第一份工作是工业机器人相关的开发</li><li>28:46 自学 Web 开发帮公益组织做网站</li><li>38:01 留三年长发，捐赠给患癌儿童</li><li>44:27 在自我探索的期间尝试创业</li><li>52:50 最近在做激光雷达相关的开发</li><li>59:50 在开源社区的经验有助于职场晋升</li><li>1:03:12 嵌入式开发和 Web 开发</li><li>1:06:16 为 Linux 内核提交补丁</li><li>1:10:13 自学为电脑换系统时了解到 Linux</li><li>1:13:12 为 RT-Thread 做贡献</li><li>1:21:13 物联网操作系统是什么</li><li>1:26:41 创建物联网学习网站</li><li>1:32:40 编写《开源指北》</li><li>1:36:20 参与开源和公益的源动力</li><li>1:38:22 教育弥补差距</li><li>1:42:06 在跟世界交互的过程中认识自己</li><li>1:45:05 保持松弛感</li></ul><h2 id="--1"><strong><strong>提到的资源</strong></strong></h2><ul><li><a href="https://getiot.tech/">人人都懂物联网</a></li><li><a href="https://www.linux.org/">Linux</a></li><li><a href="https://www.rt-thread.org/">RT-Thread</a></li><li><a href="https://www.wikiwand.com/zh-sg/%E6%A9%9F%E5%99%A8%E4%BA%BA%E4%BD%9C%E6%A5%AD%E7%B3%BB%E7%B5%B1">ROS 操作系统</a></li><li><a href="https://oschina.gitee.io/opensource-guide/">开源指北</a></li><li><a href="https://chinese.freecodecamp.org/learn">freeCodeCamp 的课程</a></li><li><a href="https://www.cxy61.com/girl/decades-theme/index-image/index.html">程序媛计划</a></li><li><a href="http://www.jiazhanghui.org.cn">广州金丝带</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何在 Linux 终端高效搜索文件——高级指南 ]]>
                </title>
                <description>
                    <![CDATA[ 大家好！感谢大家对我的  [https://www.freecodecamp.org/chinese/news/how-to-search-files-in-the-linux-terminal/] find [https://www.freecodecamp.org/chinese/news/how-to-search-files-in-the-linux-terminal/]  命令基础知识 [https://www.freecodecamp.org/chinese/news/how-to-search-files-in-the-linux-terminal/] 教程的精彩反馈。很多人看了文章之后，让我写一个关于 find 命令的更高级版本。 就是这篇！现在，是时候把你的技能提高到新的水平了。在这篇文章中，让我们来探讨 find 命令的更高级版本。 如果你是第一次学习 find 命令，我在之前的教程中介绍了文件搜索的基础知识，并探讨了一些使用 Linux 快速搜索文件的强大命令。如果你没有读过，而且还不熟悉  find，我强烈建议你先看一下 [https://www.freec ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-to-search-files-effectively-in-linux/</link>
                <guid isPermaLink="false">641818845e1a4c068f38d1b2</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Thu, 02 Nov 2023 08:36:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/03/11.-Part-2--How-to-search-files-effectively-in-linux.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/how-to-search-files-effectively-in-linux/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Search Files Effectively in the Linux Terminal – Advanced Guide</a>
      </p><p>大家好！感谢大家对我的<a href="https://www.freecodecamp.org/chinese/news/how-to-search-files-in-the-linux-terminal/"> </a><code><a href="https://www.freecodecamp.org/chinese/news/how-to-search-files-in-the-linux-terminal/">find</a></code><a href="https://www.freecodecamp.org/chinese/news/how-to-search-files-in-the-linux-terminal/"> 命令基础知识</a>教程的精彩反馈。很多人看了文章之后，让我写一个关于 <code>find</code> 命令的更高级版本。</p><p>就是这篇！现在，是时候把你的技能提高到新的水平了。在这篇文章中，让我们来探讨 <code>find</code> 命令的更高级版本。</p><p>如果你是第一次学习 <code>find</code> 命令，我在之前的教程中介绍了文件搜索的基础知识，并探讨了一些使用 Linux 快速搜索文件的强大命令。如果你没有读过，而且还不熟悉 <code>find</code>，我强烈建议你<a href="https://www.freecodecamp.org/chinese/news/how-to-search-files-in-the-linux-terminal/">先看一下</a>，然后再回来这里。</p><h2 id="-">如何搜索某个用户拥有的文件</h2><p><code>find</code> 命令接受一个名为 <code>user</code> 的特殊参数，你可以用它来过滤一个用户拥有的文件。</p><p>语法是这样的：</p><pre><code class="language-bash">find [path] -user [username] [options]</code></pre><p>假设你想搜索我拥有的所有文件（我在这台笔记本上的用户名是 <code>aruna</code>）。你可以通过使用下面的命令来做到这一点：</p><pre><code class="language-bash">find ./5minslearn/ -user aruna</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-37.png" class="kg-image" alt="image-37" width="600" height="400" loading="lazy"><figcaption>搜索一个用户拥有的文件</figcaption></figure><p>上面的命令将列出 <code>5minslearn</code> 目录下用户 <code>aruna</code> 拥有的所有文件。</p><p>你可能注意到在语法的末尾加入了 <code>[options]</code>。这意味着你可以在后面添加任何参数，使你的搜索更有效一些。</p><p>例如，让我们试着只过滤我拥有的目录。要过滤这些目录，你必须添加 <code>-type</code> 选项。下面是它的命令：</p><pre><code class="language-bash">find ./5minslearn/ -type d -user aruna</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-38.png" class="kg-image" alt="image-38" width="600" height="400" loading="lazy"><figcaption>一个用户创建的文件目录</figcaption></figure><p>从上面的截图中，你可以看到这个命令列出了 <code>5minslearn</code> 目录下由我拥有的所有目录和子目录。</p><p>如何搜索有特定权限的文件</p><p>使用 <code>-perm</code> 参数，你可以搜索有特定权限的文件。</p><p>语法是这样的：</p><pre><code class="language-bash">find [path] -perm [permissions] [options]</code></pre><p>例如，我们假设你想搜索当前目录中所有具有只读权限的文件。只读文件的代码是 <code>400</code>。</p><p><strong>注意：</strong>如果你不知道这个代码（<code>400</code>）是如何产生的，而你又很想知道，请参考我的<a href="https://www.freecodecamp.org/news/file-permissions-in-linux-chmod-command-explained/">《Linux 文件权限》</a>文章中的“如何使用八进制模式删除权限”。</p><pre><code class="language-bash">find . -perm 400</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-39.png" class="kg-image" alt="image-39" width="600" height="400" loading="lazy"><figcaption>查找具有只读权限的文件</figcaption></figure><p>我很久以前创建了这个 <code>welcome.txt</code> 文件，它具有只读权限。你可以从上面的截图中看到，<code>find</code> 命令已经完全识别了它。</p><p>我想分享一下我在工作中遇到的一个奇怪的经历。</p><p>我当时正在做一个项目，其中包含大量的压缩文件（大约 200 多个）。在这些文件中，我必须找到所有没有只读权限的文件。我很确定，这个数量很小，我可以用一只手来数。</p><p>在 200 多个文件中寻找最多 5 个文件是一个耗时的过程。因此，我决定找一个替代方法。</p><p>我在谷歌上搜索了一下，结果让我很吃惊。</p><p>我了解到，只要在 <code>-perm</code> 命令前加上一个 <code>-not</code> 标志，就可以做到这一点。下面是这个命令，供你参考：</p><pre><code class="language-bash">find . -not -perm 400</code></pre><p>该命令将列出当前目录中所有不具有只读权限的文件。</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-40.png" class="kg-image" alt="image-40" width="600" height="400" loading="lazy"><figcaption>找到所有不具有只读权限的文件</figcaption></figure><p>另外一个好处是，你可以在 <code>find</code> 命令中的任何选项前加上这个 <code>-not</code> 标志，以查找与搜索查询相反的内容。</p><p>这里是另一个例子：</p><pre><code class="language-bash">find . -not -type f</code></pre><p>运行上述命令将列出当前目录中所有非文件的项目（目录、符号链接等）。</p><h2 id="--1">如何搜索属于某个特定组的文件</h2><p>正如我们在上一篇关于文件权限的教程中所看到的，可能会有多个人因工作而共享一台机器。他们被分组为开发者、QA 和其他人。</p><p>那么，如果你想找到开发人员组的人 <code>Developers</code> 可以查看的所有文件呢？这很困难，对吗？</p><p>不要担心，这里有一个使用 <code>find</code> 命令的简单替代方法。</p><p>使用 <code>find</code> 命令中的 <code>-group</code> 参数，你可以搜索属于某个组的所有文件。</p><p>语法是这样的：</p><pre><code>find [path] -group [groupname] [options]</code></pre><p>我的机器上有一个带有我名字的组。让我们试着找到我的组所拥有的所有文件。</p><pre><code class="language-bash">find . -group aruna</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-41.png" class="kg-image" alt="image-41" width="600" height="400" loading="lazy"><figcaption><code>find</code> 命令列出属于一个组的所有文件</figcaption></figure><p>你也可以把 <code>-group</code> 选项和其他 <code>find</code> 命令选项结合起来，以完善你的搜索。</p><p>例如，你可以将 <code>-group</code> 选项与 <code>-perm</code> 选项结合起来，搜索属于某个组并有特定权限的文件。</p><pre><code class="language-bash">find . -group aruna -perm 400</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-42.png" class="kg-image" alt="image-42" width="600" height="400" loading="lazy"><figcaption>查找属于一个组且具有只读权限的所有文件</figcaption></figure><p>上述命令将列出属于 <code>aruna</code> 组的所有只读文件。</p><p>同样，正如我前面提到的，你也可以把 <code>-group</code> 选项和 <code>-not</code> 选项结合起来，找到不属于某个特定组的文件。</p><p>让我们试着找到不属于 <code>sudo</code> 组的文件。</p><pre><code class="language-bash">find . -not -group sudo</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/03/image-7.png" class="kg-image" alt="image-7" srcset="https://chinese.freecodecamp.org/news/content/images/size/w600/2023/03/image-7.png 600w, https://chinese.freecodecamp.org/news/content/images/2023/03/image-7.png 668w" width="668" height="215" loading="lazy"><figcaption>查找不属于 <code>sudo</code>&nbsp;组的文件</figcaption></figure><h2 id="--2">如何搜索最近修改过的文件</h2><p><code>find</code> 命令中的 <code>-newer</code> 选项可以搜索在给定文件的最后一次修改之后修改的文件。</p><p>语法是这样的：</p><pre><code class="language-bash">find [path] -newer [reference_file]</code></pre><p>例如，如果你想搜索所有在 <code>notes.txt</code> 文件之后修改的文件，你可以使用以下命令：</p><pre><code>find . -newer notes.txt</code></pre><p>该命令将搜索当前目录中所有在 <code>notes.txt</code> 文件之后最近被修改的文件。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-44.png" class="kg-image" alt="image-44" width="600" height="400" loading="lazy"><figcaption>查找最近被修改的文件</figcaption></figure><h2 id="--3">如何搜索几分钟前被访问过的文件</h2><p>要搜索几分钟前访问过的文件，你可以使用 <code>-amin</code> 参数。这个参数将接受分钟数（<code>n</code>），并找到所有在 <code>n</code> 分钟前被访问的文件。</p><p>语法如下：</p><pre><code>find [path] -amin [n] [options]</code></pre><p>例如，让我们尝试找到在过去 30 分钟内被访问的文件：</p><pre><code>find . -amin -30</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-45.png" class="kg-image" alt="image-45" width="600" height="400" loading="lazy"><figcaption>查找在过去 30 分钟内被访问的文件</figcaption></figure><p>我希望你注意到数字前面的负（minus）符号。它表明该文件在过去被访问过。</p><h2 id="--4">如何搜索所有空文件</h2><p>你可以使用 <code>find</code> 命令中的 <code>-empty</code> 标志来搜索空的文件和目录。</p><p>语法是这样的：</p><pre><code>find [path] -empty [options]</code></pre><p>要搜索所有空文件和目录，你可以使用以下命令：</p><pre><code>find . -empty</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-46.png" class="kg-image" alt="image-46" width="600" height="400" loading="lazy"><figcaption>查找所有空文件和目录</figcaption></figure><p>要想只搜索空目录，你可以把 <code>-empty</code> 选项和 <code>-type</code> 选项结合起来：</p><pre><code>find . -type d -empty</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-47.png" class="kg-image" alt="image-47" width="600" height="400" loading="lazy"><figcaption>查找所有空目录</figcaption></figure><p>这个命令将列出当前目录中所有的空目录。</p><p>可以在 <code>-empty</code> 标志后面加上 <code>-delete</code> 标志来删除所有的空文件和文件夹。</p><h2 id="--5">如何搜索符合特定正则表达式的文件</h2><p><code>-regex</code> 参数允许你使用正则表达式（RegEx）来应用一个过滤器。</p><p>语法是这样的：</p><pre><code>find [path] -regex [expression] [options]</code></pre><p>例如，我们假设你想搜索名字以字母 <code>w</code> 开头的文件，你可以使用下面的命令来实现这一目的：</p><pre><code>find . -regex "./w.*"</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-48.png" class="kg-image" alt="image-48" width="600" height="400" loading="lazy"><figcaption>查找所有匹配特定正则表达式的文件</figcaption></figure><h2 id="--6">总结</h2><p>在这篇文章中，你已经学到了一些高级技巧，可以有效地搜索文件并对其进行各种操作。</p><p>我建议你通过尝试来学习 <code>find</code> 命令。自己想出一些方案，并尝试使用你所学到的技巧来查找文件。</p><p>在此为你抛出几个场景：</p><ul><li>查找并删除以 <code>.txt</code> 结尾的文件</li><li>查找不属于你的文件</li><li>查找与某一模式不匹配的文件</li><li>查找所有以 <code>log-</code> 开头、大小在 50MB 和 100MB 之间的文件</li><li>查找属于某个组且 10 分钟前被访问的所有文件</li></ul><p>希望你喜欢阅读这篇文章！</p><p>要阅读更多此类有趣的博客，请在我的<a href="https://5minslearn.gogosoon.com/?ref=fcc_advanced_find_command_part_2">网站</a>上订阅我的电子邮件通讯，并在社交媒体上关注我。</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何在 Windows 中使用 Linux——介绍 5 种方法 ]]>
                </title>
                <description>
                    <![CDATA[ 作为一名开发者，你可能需要同时运行 Linux 和 Windows。幸运的是，有多种可以两全其美的方法，你不需要为每个操作系统购买不同的电脑。 在这篇文章中，我们将探讨在 Windows 机器上使用 Linux 的几种方法。其中一些是基于浏览器或云端的，在使用前不需要任何安装。 以下是我们要讨论的方法：  * 双启动  * 用于 Linux 的 Windows 子系统（WSL）  * 虚拟机（VM）  * 基于浏览器的解决方案  * 基于云的解决方案 方案 1：双启动 Linux+Windows 通过双启动，你可以在计算机上安装 Linux 和 Windows，允许你在启动时选择使用哪个操作系统。 这需要对你的硬盘进行分区，将 Linux 安装在一个单独的分区上。采用这种方法，你一次只能使用一个操作系统。 如果这听起来像是你想要的方式，这里有一个关于在 Windows 10 上设置双启动的教程 [https://www.freecodecamp.org/news/how-to-dual-boot-windows-10-and-ubuntu-linux-dual-bootin ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/5-ways-to-use-linux-on-a-windows-machine/</link>
                <guid isPermaLink="false">649d15390f6905067957c25c</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Windows ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Thu, 29 Jun 2023 06:06:57 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/06/5-ways-to-use-Linux-on-a-Windows-machine.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/5-ways-to-use-linux-on-a-windows-machine/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Use Linux on a Windows Machine – 5 Different Approaches</a>
      </p><p>作为一名开发者，你可能需要同时运行 Linux 和 Windows。幸运的是，有多种可以两全其美的方法，你不需要为每个操作系统购买不同的电脑。</p><p>在这篇文章中，我们将探讨在 Windows 机器上使用 Linux 的几种方法。其中一些是基于浏览器或云端的，在使用前不需要任何安装。</p><p>以下是我们要讨论的方法：</p><ul><li>双启动</li><li>用于 Linux 的 Windows 子系统（WSL）</li><li>虚拟机（VM）</li><li>基于浏览器的解决方案</li><li>基于云的解决方案</li></ul><h2 id="-1-linux-windows">方案 1：双启动 Linux+Windows</h2><p>通过双启动，你可以在计算机上安装 Linux 和 Windows，允许你在启动时选择使用哪个操作系统。</p><p>这需要对你的硬盘进行分区，将 Linux 安装在一个单独的分区上。采用这种方法，你一次只能使用一个操作系统。</p><p>如果这听起来像是你想要的方式，这里有一个关于在 Windows 10 上设置双启动的<a href="https://www.freecodecamp.org/news/how-to-dual-boot-windows-10-and-ubuntu-linux-dual-booting-tutorial/">教程</a>。</p><h2 id="-2-linux-windows-wsl-">方案 2：用于 Linux 的 Windows 子系统（WSL）</h2><p>Windows Subsystem for Linux 提供了一个兼容层，让你在 Windows 上原生地运行 Linux 二进制可执行文件。</p><p>使用 WSL 有一些优势：</p><ul><li>WSL 的设置很简单，不费时间。</li><li>与你必须从主机上分配资源的虚拟机相比，它是轻量级的。</li><li>你不需要为 Linux 机器安装任何 ISO 或虚拟磁盘映像，这些文件往往很大。</li><li>你可以同时使用 Windows 和 Linux。</li></ul><p>如果这听起来像是适合你的选择，这里有一份关于如何安装和使用 WSL 的<a href="https://www.freecodecamp.org/news/how-to-install-wsl2-windows-subsystem-for-linux-2-on-windows-10/">详细指南</a>。</p><h2 id="-3-vm-">方案 3：使用虚拟机（VM）</h2><p>虚拟机（VM）是一个物理计算机系统的软件仿真。它允许你在一台物理机上同时运行多个操作系统和应用程序。下面是对虚拟机的详细解释：</p><p>你可以使用虚拟化软件，如 Oracle VirtualBox 或 VMware，在你的 Windows 环境中创建一个运行 Linux 的虚拟机。这允许你将 Linux 作为客体操作系统与 Windows 一起运行。</p><p>虚拟机软件提供了为每个虚拟机分配和管理硬件资源的选项，包括 CPU 内核、内存、磁盘空间和网络带宽。你可以根据客体操作系统和应用程序的要求来调整这些分配。</p><p>下面是一些可用于虚拟化的选项：</p><ul><li><a href="https://www.virtualbox.org/">Oracle virtual box</a></li><li><a href="https://multipass.run/">Multipass</a></li><li><a href="https://www.vmware.com/content/vmware/vmware-published-sites/us/products/workstation-player.html.html">VMware workstation player</a></li></ul><h2 id="-4-">方案 4：使用基于浏览器的解决方案</h2><p>基于浏览器的解决方案对于快速测试、学习或从没有安装 Linux 的设备访问 Linux 环境特别有用。</p><p>你可以使用在线代码编辑器或基于 Web 的终端来访问 Linux。注意，在这些情况下，你通常没有完全的管理权限。</p><h3 id="-">在线代码编辑器</h3><p>在线代码编辑器提供内置 Linux 终端的编辑器。虽然它们的主要目的是编码，但你也可以利用 Linux 终端来执行命令和执行任务。</p><p><a href="https://replit.com/">Replit</a> 就是一个在线代码编辑器的例子，你可以在写代码的同时访问 Linux shell。</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/06/replit.gif" class="kg-image" alt="replit" width="600" height="400" loading="lazy"><figcaption>Replit 提供代码编辑器和 Linux shell</figcaption></figure><h3 id="-linux-">基于网络的 Linux 终端</h3><p>在线 Linux 终端允许你直接从你的浏览器访问 Linux 命令行界面。这些终端为 Linux shell 提供了一个基于网络的接口，使你能够执行命令和使用 Linux 工具。</p><p><a href="https://jslinux.org/">JSLinux</a> 就是这样一个例子。下面的截图显示了一个可以使用的 Linux 环境：</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/06/jslinux.gif" class="kg-image" alt="jslinux" width="600" height="400" loading="lazy"><figcaption>通过 JSLinux 访问 Linux</figcaption></figure><h2 id="-5-">方案 5：使用基于云的解决方案</h2><p>你可以考虑使用基于云的 Linux 环境或虚拟私人服务器（VPS）来远程访问和使用 Linux，而不是直接在你的 Windows 机器上运行 Linux。</p><p>Amazon EC2、Microsoft Azure 或 DigitalOcean 等服务提供了 Linux 实例，你可以从你的 Windows 电脑上连接到这些实例。请注意，其中一些服务提供免费服务，但如果要长期使用，就需要付费。</p><h2 id="--1">如何选择正确的方法</h2><p>选择什么完全取决于你的使用情况。但有一些因素可以帮助你决定哪种方法最适合你。让我们来讨论它们：</p><ul><li>访问级别/高级权限：如果你需要完全的管理权限，最好跳过基于浏览器的解决方案。WSL、双启动、虚拟机和基于云的解决方案可以为你提供完全的管理控制。</li><li>成本：基于云的解决方案提供的服务是有订阅费用的。这个费用根据操作系统的选择、机器的硬件规格、流量等而有所不同。如果你的预算紧张，基于云的解决方案可能不是最好的。</li><li>可扩展性：如果你刚刚开始，但计划在未来做资源详尽的开发，你可以随时扩大机器的物理规格。一些支持升级的选项是基于云的解决方案和虚拟机。你可以根据你的需要添加更多的处理器或增加 RAM。</li><li>当前系统的硬件规格：如果你目前的系统有较低的 RAM 和存储，运行虚拟机会使系统变得沉重。最好是选择基于云或基于浏览器的解决方案。</li><li>切换：如果你不打算同时使用 Windows 和 Linux，双启动可以是一个非常好的选择。它提供了完整而集中的 Linux 体验。</li></ul><h2 id="--2"><strong>我的配置</strong></h2><p>我正在使用通过 VMWare workstation player 安装的 Ubuntu 虚拟机。它运行得很好，我可以经常在两个操作系统之间切换。它的设置也很简单，我也有管理权限！</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2023/06/my-set.gif" class="kg-image" alt="my-set" width="600" height="400" loading="lazy"></figure><h2 id="--3"><strong>总结</strong></h2><p>我希望你觉得这篇文章对你有帮助。你从这个教程中学到的最喜欢的东西是什么？欢迎<a href="https://zaira_.bio.link/">和我联系</a>。📧</p><p>Happy coding 😁</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Linux ln——如何在 Linux 中创建一个符号链接（Bash 命令示例） ]]>
                </title>
                <description>
                    <![CDATA[ 符号链接（symbolic）是 Linux 中指向其他文件或目录（文件夹）的一种文件类型。 你可以通过在命令行中使用 ln 命令来创建一个符号链接。 符号链接很有用，因为它们是一个文件或目录的快捷方式。 在这篇文章中，我将介绍如何使用 ln 命令来创建一个文件或目录的符号链接。 Linux 中软链接和硬链接的区别是什么 一个软链接或符号链接将指向你系统中的原始文件。硬链接将创建一个文件的副本。 软链接可以指向不同文件系统上的其他文件或目录，而硬链接不能。 如何创建一个文件的符号链接 你可以使用 Mac 上的终端程序或 Windows 上的命令提示符找到命令行。 下面是在终端中创建文件的符号链接的基本语法。 ln -s existing_source_file optional_symbolic_link 你使用 ln 命令来创建文件的链接，并使用 -s 选项来指定这将是一个符号链接。如果你省略了 -s 选项，那么将创建一个硬链接。 existing_source_file 表示你要为其创建符号链接的计算机上的文件。 optional_symbolic_link  ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/linux-ln-how-to-create-a-symbolic-link-in-linux-example-bash-command/</link>
                <guid isPermaLink="false">64536ac1f70dcb066852ac73</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Thu, 04 May 2023 08:36:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/05/gabriel-heinzer-4Mw7nkQDByk-unsplash.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/linux-ln-how-to-create-a-symbolic-link-in-linux-example-bash-command/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Linux ln – How to Create a Symbolic Link in Linux [Example Bash Command]</a>
      </p><p>符号链接（symbolic）是 Linux 中指向其他文件或目录（文件夹）的一种文件类型。</p><p>你可以通过在命令行中使用 <code>ln</code> 命令来创建一个符号链接。</p><p>符号链接很有用，因为它们是一个文件或目录的快捷方式。</p><p>在这篇文章中，我将介绍如何使用 <code>ln</code> 命令来创建一个文件或目录的符号链接。</p><h2 id="linux-">Linux 中软链接和硬链接的区别是什么</h2><p>一个软链接或符号链接将指向你系统中的原始文件。硬链接将创建一个文件的副本。</p><p>软链接可以指向不同文件系统上的其他文件或目录，而硬链接不能。</p><h2 id="-">如何创建一个文件的符号链接</h2><p>你可以使用 Mac 上的终端程序或 Windows 上的命令提示符找到命令行。</p><p>下面是在终端中创建文件的符号链接的基本语法。</p><pre><code class="language-bash">ln -s existing_source_file optional_symbolic_link
</code></pre><p>你使用 <code>ln</code> 命令来创建文件的链接，并使用 <code>-s</code> 选项来指定这将是一个符号链接。如果你省略了 <code>-s</code> 选项，那么将创建一个硬链接。</p><p>existing_source_file 表示你要为其创建符号链接的计算机上的文件。</p><p>optional_symbolic_link 参数是你想要创建的符号链接的名称。如果省略，那么系统将在你当前所在的目录中为你创建一个新的链接。</p><p>让我们来看看一个例子，以更好地理解它是如何工作的。</p><p>在我的桌面上有一个叫作 <code>example_fcc_file.txt</code> 的文件。</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/02/Screen-Shot-2022-02-19-at-7.48.02-PM.png" class="kg-image" alt="Screen-Shot-2022-02-19-at-7.48.02-PM" width="600" height="400" loading="lazy"></figure><p>我将需要首先打开我的终端，然后确保我在 Desktop 目录中。我可以运行 <code>cd Desktop</code> 命令来导航到我的桌面。</p><p>运行该命令后，你应该看到你现在是在桌面上。</p><pre><code class="language-bash">jessicawilkins@Dedrias-MacBook-Pro-2 ~ % cd Desktop
jessicawilkins@Dedrias-MacBook-Pro-2 Desktop % </code></pre><p>然后我可以使用 <code>ln</code> 命令创建一个新的符号链接，名为 <code>fcc_link.txt</code>。</p><pre><code class="language-bash">ln -s example_fcc_file.txt fcc_link.txt</code></pre><p>当你在终端运行该命令时，你会注意到没有任何返回。这是因为当 <code>ln</code> 命令成功时，不会有任何输出。</p><pre><code class="language-bash">jessicawilkins@Dedrias-MacBook-Pro-2 Desktop % ln -s example_fcc_file.txt fcc_link.txt


jessicawilkins@Dedrias-MacBook-Pro-2 Desktop % </code></pre><p>要检查你的符号链接是否成功，你可以使用 <code>ls</code> 命令。`ls` 命令将列出文件的信息，<code>-l</code> 标志代表符号链接。</p><pre><code class="language-bash">ls -l fcc_link.txt</code></pre><p>当你运行该命令时，你应该在终端看到这种类型的结果。</p><pre><code class="language-bash">lrwxr-xr-x  1 jessicawilkins  staff  20 Feb 19 19:56 fcc_link.txt -&gt; example_fcc_file.txt
</code></pre><p>输出中的 <code>fcc_link.txt -&gt; example_fcc_file.txt</code> 部分显示，符号链接指向名为 <code>example_fcc_file.txt</code> 的文件。</p><p>你也应该看到这个新的符号链接出现在你的目录中。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/02/Screen-Shot-2022-02-19-at-8.11.09-PM.png" class="kg-image" alt="Screen-Shot-2022-02-19-at-8.11.09-PM" width="600" height="400" loading="lazy"></figure><h2 id="--1">如何为一个目录创建符号链接</h2><p>在这个例子中，我们要创建一个名为 <code>my_music</code> 的符号链接，它将指向我的电脑 home 目录下的 Music 文件夹。</p><p>首先，确保你是在 home 目录下。你可以在命令行中运行 <code>cd</code> 来回到你的 home 目录。</p><pre><code class="language-bash">jessicawilkins@Dedrias-MacBook-Pro-2 Desktop % cd
jessicawilkins@Dedrias-MacBook-Pro-2 ~ % </code></pre><p>然后你可以使用 <code>ln</code> 命令来创建一个到 Music 目录的符号链接。</p><pre><code class="language-bash">ln -s /Users/jessicawilkins/Music ~/my_music
</code></pre><p>如果成功，你应该在 home 目录中看到它。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/02/Screen-Shot-2022-02-19-at-8.38.14-PM.png" class="kg-image" alt="Screen-Shot-2022-02-19-at-8.38.14-PM" width="600" height="400" loading="lazy"></figure><h2 id="--2">如何删除符号链接</h2><p>要删除符号链接，你可以使用 <code>unlink</code> 或 <code>rm</code> 命令。</p><p>如果我们想删除我们先前创建的 <code>fcc_link.txt</code> 符号链接，那么我们可以使用这两个命令中的任何一个：</p><pre><code class="language-bash">rm fcc_link.txt</code></pre><pre><code class="language-bash">unlink fcc_link.txt</code></pre><p>现在我们应该看到，符号链接已经从我们的目录中被删除。</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/02/Screen-Shot-2022-02-19-at-8.47.30-PM.png" class="kg-image" alt="Screen-Shot-2022-02-19-at-8.47.30-PM" width="600" height="400" loading="lazy"></figure><h2 id="--3">如何覆盖符号链接</h2><p>如果我们试图创建一个新的名为 <code>fcc_link.txt</code> 的符号链接，那么会导致错误，因为它已经被使用并指向另一个文件。</p><pre><code class="language-bash">ln: fcc_link.txt: File exists
</code></pre><p>你可以通过使用强制（<code>-f</code>）选项覆盖这个错误。</p><pre><code class="language-bash">ln -sf example_fcc_file.txt fcc_link.txt</code></pre><h2 id="-ln-">如何学习更多关于 ln 命令的知识</h2><p>如果你想了解更多关于 <code>ln</code> 命令的信息，那么你可以在 <code>man</code> 页面（Linux 命令使用手册）中阅读它。</p><p>在你的终端运行 <code>man ln</code>，你应该可以看到 <code>ln</code> 命令的手册页面。</p><pre><code>LN(1)                     BSD General Commands Manual                    LN(1)

NAME
     link, ln -- make links

SYNOPSIS
     ln [-Ffhinsv] source_file [target_file]
     ln [-Ffhinsv] source_file ... target_dir
     link source_file target_file

DESCRIPTION
     The ln utility creates a new directory entry (linked file) which has the same modes as the original file.  It is
     useful for maintaining multiple copies of a file in many places at once without using up storage for the
     ``copies''; instead, a link ``points'' to the original copy.  There are two types of links; hard links and sym-
     bolic links.  How a link ``points'' to a file is one of the differences between a hard and symbolic link.

     The options are as follows:

     -F    If the target file already exists and is a directory, then remove it so that the link may occur.  The -F
           option should be used with either -f or -i options.  If none is specified, -f is implied.  The -F option
           is a no-op unless -s option is specified.

     -h    If the target_file or target_dir is a symbolic link, do not follow it.  This is most useful with the -f
           option, to replace a symlink which may point to a directory.

     -f    If the target file already exists, then unlink it so that the link may occur.  (The -f option overrides</code></pre><h2 id="--4">总结</h2><p>符号链接（symbolic）是 Linux 中指向其他文件或目录（文件夹）的一种文件类型。你可以通过在命令行中使用 <code>ln</code> 命令来创建一个符号链接。</p><p>符号链接很有用，因为它们是一个文件或目录的快捷方式。</p><p>下面是使用终端创建一个文件的符号链接的基本语法：</p><pre><code class="language-bash">ln -s existing_source_file optional_symbolic_link</code></pre><p>下面是使用终端创建一个目录的符号链接的基本语法：</p><pre><code class="language-bash">ln -s path_to_existing_directory name_of_symbolic_link
</code></pre><p>要删除符号链接，你可以使用 <code>unlink</code> 或 <code>rm</code> 命令：</p><pre><code class="language-bash">rm name_of_symbolic_link</code></pre><pre><code class="language-bash">unlink name_of_symbolic_link</code></pre><p>如果你需要删除一个符号链接，那么你可以使用这个命令：</p><pre><code class="language-bash">ln -sf path_to_existing_directory name_of_symbolic_link</code></pre><p>我希望你喜欢这篇关于符号链接的文章，祝你在编程之旅中好运。</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何在 Linux 终端高效搜索文件 ]]>
                </title>
                <description>
                    <![CDATA[ 你是否曾经为在电脑上手动搜索文件而感到沮丧？如果你是一名开发人员或 DevOps 工程师，在没有 GUI 的 Linux 服务器上工作，来回浏览寻找文件会很困难。 很多人都不知道 Linux 终端的力量。Linux 有一个令人难以置信的强大的命令行，可以让你在几分之一秒内搜索文件和目录。 无论你是初学者还是专家，如果你想把你的文件管理技能提高到一个新的水平，你来到了正确的地方。这篇文章将帮助你了解 Linux 中最常用的 find  命令的基本知识。 Linux 中的 find 命令是什么 find 命令允许你在你的计算机上搜索文件和目录。它可以灵活地搜索特定目录中的文件，或通过所有子目录进行递归搜索。 让我们来探索 find 命令的力量。 如何按名称搜索文件 假设你在某个地方保存了一个叫 hello_world.html 的文件，你甚至不记得目录名称。但你的老板要求你立即把文件发给他们。 通常情况下，如果你忘记了你存储文件的位置，你会开始翻阅一个又一个文件夹，检查文件是否存在。 这时，find 命令就发挥了巨大的作用。与其在你的计算机上手动搜索文件，你可以使用 find ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-to-search-files-in-the-linux-terminal/</link>
                <guid isPermaLink="false">641819365e1a4c068f38d1b6</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Tue, 14 Mar 2023 04:13:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/03/BB---How-to-search-files-effectively-in-linux.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/how-to-search-files-in-the-linux-terminal/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Search Files Effectively in the Linux Terminal</a>
      </p><p>你是否曾经为在电脑上手动搜索文件而感到沮丧？如果你是一名开发人员或 DevOps 工程师，在没有 GUI 的 Linux 服务器上工作，来回浏览寻找文件会很困难。</p><p>很多人都不知道 Linux 终端的力量。Linux 有一个令人难以置信的强大的命令行，可以让你在几分之一秒内搜索文件和目录。</p><p>无论你是初学者还是专家，如果你想把你的文件管理技能提高到一个新的水平，你来到了正确的地方。这篇文章将帮助你了解 Linux 中最常用的 <strong>find</strong> 命令的基本知识。</p><h2 id="linux-find-">Linux 中的 find 命令是什么</h2><p><code>find</code> 命令允许你在你的计算机上搜索文件和目录。它可以灵活地搜索特定目录中的文件，或通过所有子目录进行递归搜索。</p><p>让我们来探索 <code>find</code> 命令的力量。</p><h2 id="-">如何按名称搜索文件</h2><p>假设你在某个地方保存了一个叫 <code>hello_world.html</code> 的文件，你甚至不记得目录名称。但你的老板要求你立即把文件发给他们。</p><p>通常情况下，如果你忘记了你存储文件的位置，你会开始翻阅一个又一个文件夹，检查文件是否存在。</p><p>这时，<code>find</code> 命令就发挥了巨大的作用。与其在你的计算机上手动搜索文件，你可以使用 <code>find</code> 命令来自动完成这一过程。</p><p>通过使用 <code>-name</code> 标志传递文件的名称，<code>find</code> 命令搜索并返回文件的位置。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">find -name &lt;file_name&gt;</code></pre><figcaption>按名称搜索文件的 <code>find</code> 命令语法</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh4.googleusercontent.com/hUG1ogKlPIlvUZZiCIOBO4x1ZTlGAujhGTe2v-KevAi3zU3z-ZuBA0VJvMWht0V-7cLha4beNzMIkENiN0ZiYZfa8Pc0O-XJMzmbfftY_bo9Csrz-4-7dvwJFgC59G94A2GbFpPTkfU6rxL9MrSOCVI" class="kg-image" alt="hUG1ogKlPIlvUZZiCIOBO4x1ZTlGAujhGTe2v-KevAi3zU3z-ZuBA0VJvMWht0V-7cLha4beNzMIkENiN0ZiYZfa8Pc0O-XJMzmbfftY_bo9Csrz-4-7dvwJFgC59G94A2GbFpPTkfU6rxL9MrSOCVI" width="600" height="400" loading="lazy"><figcaption>按名称搜索文件的终端命令</figcaption></figure><p>但请记住，<code>-name</code> 标志执行的是大小写敏感的搜索。如果你想进行不区分大小写的搜索，你可以使用 <code>-iname</code> 标志来代替。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">find -iname &lt;file_name&gt;</code></pre><figcaption>执行区分大小写的搜索的&nbsp;<code>find</code> 命令语法</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh4.googleusercontent.com/Gxuso3qZslePPLMxKDtBuQWwQiliDpU2pHAzRTdiRob2OBKrdN1oWA_rTwe2thYiHeUmRo8SBNE2QR6G2kmdDlKhX14wFd9fYmfppZVQNprUHaGMWLB_GgGVSq7l4DQyP2STSFZcx0Rt5B6thvM7T3Y" class="kg-image" alt="Gxuso3qZslePPLMxKDtBuQWwQiliDpU2pHAzRTdiRob2OBKrdN1oWA_rTwe2thYiHeUmRo8SBNE2QR6G2kmdDlKhX14wFd9fYmfppZVQNprUHaGMWLB_GgGVSq7l4DQyP2STSFZcx0Rt5B6thvM7T3Y" width="600" height="400" loading="lazy"><figcaption>执行区分大小写的搜索的终端命令</figcaption></figure><p>在某些地方，你也可以用 <code>find</code> 命令来替代 <code>ls</code> 命令。我们假设你需要找到所有以 <code>.txt</code> 为扩展名的文件。你可以使用正则模式（<code>*.txt</code>）用 <code>find</code> 命令来实现。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">find /path/to/search -name "*.txt"</code></pre><figcaption><code>find</code> 命令搜素匹配正则的文件</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh3.googleusercontent.com/xtbCKd-v83ytN4mnr35RbiWCgJuEiAt9LBO_Qq2IDwRPJaQWRfzBUe5YY63JEcLHS344TvGWRzK139n93upgh1ALKgRavsWwNe0iTh772rhGZwFXcpP5eyGz_iI6XPHuDK55Ch93rNe70fSIyJJcMmw" class="kg-image" alt="xtbCKd-v83ytN4mnr35RbiWCgJuEiAt9LBO_Qq2IDwRPJaQWRfzBUe5YY63JEcLHS344TvGWRzK139n93upgh1ALKgRavsWwNe0iTh772rhGZwFXcpP5eyGz_iI6XPHuDK55Ch93rNe70fSIyJJcMmw" width="600" height="400" loading="lazy"><figcaption>终端命令显示匹配正则模式的文件</figcaption></figure><p>这个命令将列出你当前目录及其子目录中的所有 <code>.txt</code> 文件。</p><p>如果要搜索某个特定目录和子目录中的 <code>.txt</code> 文件，你可以用你的目录的路径替换 <code>/path/to/search</code>。</p><h2 id="-linux-">如何在 Linux 中搜索一个目录</h2><p>通过在 <code>find</code> 命令中的 <code>-type</code> 参数中传递 <code>d</code>，可以搜索一个目录。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">find /path/to/search -type d</code></pre><figcaption>搜索一个目录的 <code>find</code> 命令语法</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/03/image.png" class="kg-image" alt="image" srcset="https://chinese.freecodecamp.org/news/content/images/size/w600/2023/03/image.png 600w, https://chinese.freecodecamp.org/news/content/images/2023/03/image.png 734w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>终端命令使用 <code>find</code> 命令搜素一个目录</figcaption></figure><p>在上面的截图中，我们正在从我们的当前目录中查找一个名为 <code>zip</code> 的目录。</p><p>同样，<code>-type</code> 选项接受其他参数选项，以简化我们的查找过程。</p><ul><li><code>f</code> 查找常规文件的列表</li><li><code>b</code> 查找块状设备的列表</li><li><code>c</code> 查找字符设备的列表</li><li><code>l</code> 查找符号链接的列表</li><li><code>s</code> 查找套接字的列表</li><li><code>p</code> 查找命名的管道</li></ul><h2 id="-linux--1">如何在 Linux 中按大小搜索文件</h2><p>在 <code>find</code> 命令中加入 <code>-size</code> 选项可以帮助你根据大小来查找文件。在 size 前加一个 <code>+</code> 或 <code>-</code>，分别代表大于和小于。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">find /path/to/search -size &lt;size_of_the_file&gt;</code></pre><figcaption>按大小搜索文件的 <code>find</code>&nbsp;命令语法</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh6.googleusercontent.com/5_gYC6AREIU77iDWAOY3uqfyCEPpICXenMzpxMv15oaOyNg2t4QhtH862wZeIRH3IgWxX1MJYwAOMGQZVeerY6HeNYjcmB_bdMiqPnoAsSyQ5JjQ75DqmCOsbcLQ8AeMk31MQb9Z1aC0Q-1CznPNRn8" class="kg-image" alt="5_gYC6AREIU77iDWAOY3uqfyCEPpICXenMzpxMv15oaOyNg2t4QhtH862wZeIRH3IgWxX1MJYwAOMGQZVeerY6HeNYjcmB_bdMiqPnoAsSyQ5JjQ75DqmCOsbcLQ8AeMk31MQb9Z1aC0Q-1CznPNRn8" width="600" height="400" loading="lazy"><figcaption>按大小搜索文件的终端命令</figcaption></figure><p>在上面的截图中，我们正在查找所有大小大于 1GB 的文件。</p><p>你也可以搜索属于特定大小范围内的所有文件。</p><p>例如，如果你想找到所有大于 50MB 和小于 100MB 的文件，你可以运行以下命令：</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">find /path/to/search -size +50M -size -100M</code></pre><figcaption><code>find</code>&nbsp;命令语法搜索在一个大小范围内的文件</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh6.googleusercontent.com/KylER-ErURtFf22PtpPhqT8yQofvlaA6s7XhP8FdHo4KqLTXYsDY5EL3LhVoyZKrHJGMHYWJ6CheD2PiaS_ynX_x-Ziho5eqK8YbEAqdAVvugE0RUWuOPvuwrUddCIw4TnoqLZDSI2qRak1kdDF6o40" class="kg-image" alt="KylER-ErURtFf22PtpPhqT8yQofvlaA6s7XhP8FdHo4KqLTXYsDY5EL3LhVoyZKrHJGMHYWJ6CheD2PiaS_ynX_x-Ziho5eqK8YbEAqdAVvugE0RUWuOPvuwrUddCIw4TnoqLZDSI2qRak1kdDF6o40" width="600" height="400" loading="lazy"><figcaption>搜索在一个大小范围内的文件的终端命令</figcaption></figure><p>你可以用你喜欢的记号来指定大小。一些可用的符号是：</p><ul><li>K 代表 KB</li><li>M 代表 MB</li><li>G 代表 GB</li><li>b 代表字节</li><li>c 代表块</li></ul><h2 id="--1">如何根据修改时间来搜索一个文件</h2><p>每个文件都有一个与之相关的创建和最后更新时间。让我们假设你的目录中有成千上万的文件。你在过去几天里编辑了一个文件，但忘记了它的名字。你肯定在那之后你只编辑了几个文件。</p><p>在这种情况下，你可以找到过去 7 天内修改过的所有文件。这将你的搜索从 1000 多个文件限制到一个更容易管理的数量。运行该命令后，你能在几秒钟内找到你编辑的文件。</p><p>这可以通过在 <code>find</code> 命令中传递 <code>-mtime</code> 参数来实现。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">find /path/to/search -mtime &lt;-number_of_days_ago&gt;</code></pre><figcaption><code>find</code>&nbsp;命令语法搜索在某几天内修改过的文件</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh3.googleusercontent.com/EOsirsBvBa83A2NeK1qGZ8g_FLriAngr4yso3nhOpuwT18zrkur92GKfMBfr8nA8ULrgdWvREvzJfSznVecNXZXONs3JXdG3gJFoqZ7PcqFmZe3T2IS0ka-bkSajpj3aXunMvTYYPZkLl4YjkYzx_1Y" class="kg-image" alt="EOsirsBvBa83A2NeK1qGZ8g_FLriAngr4yso3nhOpuwT18zrkur92GKfMBfr8nA8ULrgdWvREvzJfSznVecNXZXONs3JXdG3gJFoqZ7PcqFmZe3T2IS0ka-bkSajpj3aXunMvTYYPZkLl4YjkYzx_1Y" width="600" height="400" loading="lazy"><figcaption>根据修改时间来搜索文件的终端命令</figcaption></figure><p>让我们假设另一种情况，今天的日期是 2023 年 2 月 10 日。你在 2023 年 2 月 3 日之前修改了一个文件。2023 年 2 月 3 日之后，你修改了很多文件。你必须找到你在 2023 年 2 月 3 日之前修改的文件。所以，基本上，你需要 2023 年 2 月 3 日之前修改过的文件。</p><p>很奇怪的场景，对吗？</p><p>但是，你也可以使用 <code>find</code> 命令运行这个查询。你可以通过将负号（-）与正号（+）交换来实现。</p><p>下面是为你修改的命令：</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">find /path/to/search -mtime +7</code></pre><figcaption><code>find</code>&nbsp;命令语法搜索在某几天前修改过的文件</figcaption></figure><h2 id="-find-">如何对从 find 命令中筛选出来的文件执行一个命令</h2><p>这个问题可能会让你感到困惑。在揭晓答案之前，让我们通过一个真实的场景来清楚地了解这个问题。</p><p>假设你在一个目录中有 1000 个文件，运行 <code>find</code> 命令返回 20 个匹配文件。你想把这 20 个文件移到另一个目录中。你怎样才能实现这个目标呢？</p><p>简单地说，我们必须对每个被过滤的文件运行一个命令。</p><p>你可以通过在 <code>find</code> 命令中传递 <code>-exec</code> 选项来做到这一点。</p><p><code>-exec</code> 选项对搜索中发现的每个文件执行一条命令。<code>-exec</code> 选项后面是一个命令和它的参数，其中的 <code>{}</code> 符号代表被处理文件的路径。</p><p>为了表示 <code>-exec</code> 命令的结束，我们必须添加 <code>\;</code>（一个反斜杠和一个分号）。</p><p>下面是语法：</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">find /path/to/search -name  -exec  {}  \;</code></pre><figcaption><code>find</code> 命令语法对过滤的文件执行一个操作</figcaption></figure><p>让我们试着把过滤后的文件从 <code>5minslearn</code> 目录移到 <code>zip</code> 目录。</p><p>下面是命令：</p><pre><code>find ./5minslearn -name "*.zip" -exec mv {} ./5minslearn/zip \;</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://lh5.googleusercontent.com/Oysc8VJqcheOL0uSk9t18SM1BBckLmZ1Sfs026TByvdQcHNFVDGssztFu13rHi0waaOUXCuKx1rsHbyWCXr190agnVEKZA3rMexuSH_m6myz38JhQ563hNLBKfTBOMklTt-aH5dd05CfXCVwKG0yiZI" class="kg-image" alt="Oysc8VJqcheOL0uSk9t18SM1BBckLmZ1Sfs026TByvdQcHNFVDGssztFu13rHi0waaOUXCuKx1rsHbyWCXr190agnVEKZA3rMexuSH_m6myz38JhQ563hNLBKfTBOMklTt-aH5dd05CfXCVwKG0yiZI" width="600" height="400" loading="lazy"></figure><p>这个命令在 <code>./5minslearn</code> 目录下搜索所有以 <code>.zip</code> 结尾的文件，然后将每个文件移到 <code>./5minslearn/zip</code> 目录下。</p><p><code>-exec</code> 选项允许你对找到的文件进行一系列的操作。你可以用复制、删除、甚至改变文件权限的命令来代替上面例子中的移动命令。</p><h2 id="--2">如何确认对过滤的文件执行命令</h2><p>如果不确定是否在每个文件上应用操作，大多数人都会选择使用这个选项。</p><p><code>-ok</code> 选项与 <code>-exec</code> 选项类似，只是它在对每个文件执行操作之前会要求确认。这个命令对于在执行具体操作之前审核将被影响的文件是超级有帮助的。如果你不确定或不希望应用该命令，你也可以选择拒绝。</p><p>例如，这次让我们试着把 <code>.txt</code> 文件移到其他目录。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">find /path/to/search -name "*.txt" -ok mv {} /path/to/destination \;</code></pre><figcaption><code>find</code> 命令语法在对过滤文件执行操作之前进行确认</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh3.googleusercontent.com/LR9SFYz9f90xR6_aMS_VKEQa7IS9cecwEAMRkNh5KJ1JSMaQCx0cIe-5XOonpOOdELbnU8549XkQ-HfYCQEoG9Epn8F89cA86o3BRFTR9cJtOLM7GgvKpWMNpkutX89sRtWs96wZ0pz-JHZTSGFBrq0" class="kg-image" alt="LR9SFYz9f90xR6_aMS_VKEQa7IS9cecwEAMRkNh5KJ1JSMaQCx0cIe-5XOonpOOdELbnU8549XkQ-HfYCQEoG9Epn8F89cA86o3BRFTR9cJtOLM7GgvKpWMNpkutX89sRtWs96wZ0pz-JHZTSGFBrq0" width="600" height="400" loading="lazy"><figcaption>终端命令在移动文件时进行确认</figcaption></figure><p>上述命令在 <code>./5minslearn</code> 目录下搜索所有以 <code>.txt</code> 为扩展名的文件，然后在将每个文件移动到 <code>./5minslearn/text_files</code> 目录前提示用户确认。</p><p>如果要批准该操作，请输入 <code>yes</code>，如果拒绝该操作，跳到下一个文件，则输入 <code>no</code>。</p><p>当你想对你所修改的文件持谨慎态度时，<code>-ok</code> 选项很有用，因为它允许你在执行指定的命令前检查每个文件及其位置。</p><h2 id="--3">如何查找文件和详细信息</h2><p><code>find</code> 命令中的 <code>-ls</code> 选项用于显示搜索中发现的文件的信息，其格式与 <code>ls</code> 命令相同。这个选项提供了关于文件的详细信息，例如它们的权限、所有者、大小和最后修改时间。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">find /path/to/search -name "*.&lt;file-extension&gt;" -ls</code></pre><figcaption><code>find</code> 命令语法以 <code>ls</code>&nbsp;命令形式列出文件</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/03/image-1.png" class="kg-image" alt="image-1" srcset="https://chinese.freecodecamp.org/news/content/images/size/w600/2023/03/image-1.png 600w, https://chinese.freecodecamp.org/news/content/images/size/w1000/2023/03/image-1.png 1000w, https://chinese.freecodecamp.org/news/content/images/2023/03/image-1.png 1040w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>终端命令以 <code>ls</code>&nbsp;命令形式列出文件</figcaption></figure><h2 id="--4">如何查找和删除文件</h2><p>你是否曾经需要查找文件并将它们从你的电脑中删除？<code>find</code> 命令中的 <code>-delete</code> 选项可以帮你做到这一点。它允许你删除符合指定条件的文件。</p><pre><code class="language-bash">find . -name "*.&lt;extension&gt;" -delete</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://lh3.googleusercontent.com/W2DQEoEcNi0897Z99NPHyhx6RTPpO1hL0AVCAGCuKdabq8_eXbFtsL2BJdLn6MCqdYXTa7veSRhDj9gTU7Rbbz0vNoIbxF_N_IXmR45IHgH3DMXSnMBRPtLjIKK-G9af5FncqC2s28zqBfP6kcinXqY" class="kg-image" alt="W2DQEoEcNi0897Z99NPHyhx6RTPpO1hL0AVCAGCuKdabq8_eXbFtsL2BJdLn6MCqdYXTa7veSRhDj9gTU7Rbbz0vNoIbxF_N_IXmR45IHgH3DMXSnMBRPtLjIKK-G9af5FncqC2s28zqBfP6kcinXqY" width="600" height="400" loading="lazy"></figure><p>在上面的例子中，你可以看到 <code>find</code> 命令删除了扩展名为 <code>.html</code> 的文件。</p><p>注意：这个操作是不可逆的。当你运行删除操作时，要 100% 确定。</p><p>我建议先运行 <code>find</code> 命令而不要使用 <code>-delete</code> 标志，确保只显示需要删除的文件。一旦你确定了，你就可以执行同样的命令，加上 <code>-delete</code> 标志。</p><h2 id="--5">总结</h2><p>在这篇文章中，你学会了如何使用 Linux 终端有效地搜索文件。</p><p>这些是 <code>find</code> 命令中非常基本的选项，我认为每个开发者都应该知道。我相信掌握基础知识是掌握更高级的 Linux 的第一步。我在我所有的博客中都涵盖了基础知识，以帮助你打下坚实的基础。</p><p>要了解更多关于 Linux 的信息，请在我的<a href="https://5minslearn.gogosoon.com/?ref=fcc_find_command">网站</a>上订阅我的电子邮件通讯，并在社交媒体上关注我。</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何处理 Python 报错 TypeError: 'int' object is not subscriptable ]]>
                </title>
                <description>
                    <![CDATA[ 当你试图把一个整数当作一个可下标的对象时，就会出现 Python 错误 “TypeError: 'int' object is not subscriptable”。 在 Python 中，一个可下标的对象是你可以添加下标或可迭代的对象。 为什么会出现 “TypeError: 'int' object is not subscriptable Error” 错误 你可以在一个字符串、列表、元组、甚至字典上进行迭代，但不可能在一个整数或数字集上迭代。 所以，如果你得到这个错误，说明你试图在一个整数上迭代，或者你把一个整数当作一个数组。 在下面的例子中，我把出生日期（dob 变量）写成了 ddmmyy（日期+月份+年份）格式。我试图得到出生的月份，但没有成功。它抛出了错误 “TypeError: 'int' object is not subscriptable”： dob = 21031999 mob = dob[2:4] print(mob) # Output: Traceback (most recent call last): #   File ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/python-typeerror-int-object-not-subscriptable-solved/</link>
                <guid isPermaLink="false">640f18c47d792438fafeff08</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Wed, 08 Mar 2023 03:22:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/03/in_not_subable.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/python-typeerror-int-object-not-subscriptable-solved/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">TypeError: 'int' object is not subscriptable [Solved Python Error]</a>
      </p><p>当你试图把一个整数当作一个可下标的对象时，就会出现 Python 错误 “TypeError: 'int' object is not subscriptable”。</p><p>在 Python 中，一个可下标的对象是你可以添加下标或可迭代的对象。</p><h2 id="-typeerror-int-object-is-not-subscriptable-error-"><strong>为什么会出现 “TypeError: 'int' object is not subscriptable Error” 错误</strong></h2><p>你可以在一个字符串、列表、元组、甚至字典上进行迭代，但不可能在一个整数或数字集上迭代。</p><p>所以，如果你得到这个错误，说明你试图在一个整数上迭代，或者你把一个整数当作一个数组。</p><p>在下面的例子中，我把出生日期（<code>dob</code> 变量）写成了 ddmmyy（日期+月份+年份）格式。我试图得到出生的月份，但没有成功。它抛出了错误 “TypeError: 'int' object is not subscriptable”：</p><pre><code class="language-python">dob = 21031999
mob = dob[2:4]

print(mob)

# Output: Traceback (most recent call last):
#   File "int_not_subable..py", line 2, in &lt;module&gt;
#     mob = dob[2:4]
# TypeError: 'int' object is not subscriptable
</code></pre><h2 id="-typeerror-int-object-is-not-subscriptable-"><strong>如何修复 “TypeError: 'int' object is not subscriptable” 错误</strong></h2><p>要解决这个错误，你需要将整数转换为可迭代的数据类型，例如字符串。</p><p>如果你得到这个错误是因为你把某个东西转换成了整数，那么你需要把它改回原来的样子，例如，字符串、元组、列表，等等。</p><p>在上面那个出错的代码中，我通过将 <code>dob</code> 变量转换为字符串，使其正常运行：</p><pre><code class="language-py">dob = "21031999"
mob = dob[2:4]

print(mob)

# Output: 03
</code></pre><p>如果你在将某样东西转换为整数后得到错误，这意味着你需要将它转换回字符串或保持原样。</p><p>在下面的例子中，我写了一个 Python 程序，以 ddmmyy 的格式打印出出生日期，但是它返回了一个错误：</p><pre><code class="language-py">name = input("What is your name? ")
dob = int(input("What is your date of birth in the ddmmyy order? "))
dd = dob[0:2]
mm = dob[2:4]
yy = dob[4:]
print(f"Hi, {name}, \nYour date of birth is {dd} \nMonth of birth is {mm} \nAnd year of birth is {yy}.")

#Output: What is your name? John Doe
# What is your date of birth in the ddmmyy order? 01011970
# Traceback (most recent call last):
#   File "int_not_subable.py", line 12, in &lt;module&gt;
#     dd = dob[0:2]
# TypeError: 'int' object is not subscriptable
</code></pre><p>看了一下代码，我想起输入返回的是一个字符串，所以我不需要把用户的出生日期输入的结果转换成一个整数。这就解决了这个错误：</p><pre><code class="language-py">name = input("What is your name? ")
dob = input("What is your date of birth in the ddmmyy order? ")
dd = dob[0:2]
mm = dob[2:4]
yy = dob[4:]
print(f"Hi, {name}, \nYour date of birth is {dd} \nMonth of birth is {mm} \nAnd year of birth is {yy}.")

#Output: What is your name? John Doe
# What is your date of birth in the ddmmyy order? 01011970
# Hi, John Doe,
# Your date of birth is 01
# Month of birth is 01
# And year of birth is 1970.
</code></pre><h2 id="-"><strong>总结</strong></h2><p>在这篇文章中，你了解了 Python 中 “TypeError: 'int' object is not subscriptable” 错误的原因以及如何解决这个问题。</p><p>如果你得到这个错误，这意味着你把整数当作可迭代的数据。整数不是可迭代的，所以你需要使用一个不同的数据类型，或者将整数转换成可迭代的数据类型。</p><p>而如果错误的发生是因为你把某样东西转换成了整数，那么你就需要把它改回原本的可迭代的数据类型。</p><p>谢谢你阅读本文。</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Linux cp 命令——如何在 Linux 中复制文件 ]]>
                </title>
                <description>
                    <![CDATA[ 当你在电脑上工作时，有几种不同的方式来复制和粘贴内容。 如果你花更多时间在设备的用户界面上，你可能会用鼠标来做这个。你可以通过右键单击文件并选择“复制”，然后进入不同的目录并选择“粘贴”来复制文件。 对于使用终端的朋友来说，你也可以在不离开终端的情况下进行文件复制-粘贴操作。在基于 Linux 的终端中，你可以使用 cp 命令来完成这一操作。 在这篇文章中，我将解释什么是 cp 命令，并告诉你如何在 Linux 中使用终端复制和粘贴文件和目录。 什么是 cp 命令 你使用 cp 命令将文件从一个地方复制到另一个地方。这个命令也可以复制目录（文件夹）。 这个命令的语法是： cp [...file/directory-sources] [destination] [file/directory-sources] 指定你要复制的文件或目录的来源。而 [destination] 参数则指定了你想复制文件的位置。 为了理解本文的其余部分，我将使用这个文件夹结构的例子。假设一个名为 DirectoryA 的目录，里面有两个目录，DirectoryA_1 和  DirectoryA ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/the-linux-cp-command-how-to-copy-files-in-linux/</link>
                <guid isPermaLink="false">63f83ee30687e3060be26a0a</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Thu, 23 Feb 2023 04:36:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/02/linux-cp-command.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/the-linux-cp-command-how-to-copy-files-in-linux/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The Linux cp Command – How to Copy Files in Linux</a>
      </p><p>当你在电脑上工作时，有几种不同的方式来复制和粘贴内容。</p><p>如果你花更多时间在设备的用户界面上，你可能会用鼠标来做这个。你可以通过右键单击文件并选择“复制”，然后进入不同的目录并选择“粘贴”来复制文件。</p><p>对于使用终端的朋友来说，你也可以在不离开终端的情况下进行文件复制-粘贴操作。在基于 Linux 的终端中，你可以使用 <code>cp</code> 命令来完成这一操作。</p><p>在这篇文章中，我将解释什么是 <code>cp</code> 命令，并告诉你如何在 Linux 中使用终端复制和粘贴文件和目录。</p><h2 id="-cp-"><strong>什么是 </strong><code><strong>cp</strong></code><strong> 命令</strong></h2><p>你使用 <code>cp</code> 命令将文件从一个地方复制到另一个地方。这个命令也可以复制目录（文件夹）。</p><p>这个命令的语法是：</p><pre><code class="language-bash">cp [...file/directory-sources] [destination]
</code></pre><p><code>[file/directory-sources]</code> 指定你要复制的文件或目录的来源。而 <code>[destination]</code> 参数则指定了你想复制文件的位置。</p><p>为了理解本文的其余部分，我将使用这个文件夹结构的例子。假设一个名为 <strong>DirectoryA</strong> 的目录，里面有两个目录，<strong>DirectoryA_1</strong> 和 <strong>DirectoryA_2</strong>。这些子目录里有许多文件和子目录。</p><p>我还将假设你目前在终端中的 <strong>DirectoryA</strong> 位置：</p><pre><code class="language-bash">cd DirectoryA
</code></pre><h2 id="-cp--1">如何用 cp 命令复制文件</h2><p>如果你想复制一个文件，比如 <strong>README.txt</strong>，从 <strong>DirectoryA_1</strong> 复制到 <strong>DirectoryA_2</strong>，你将这样使用 <code>cp</code> 命令：</p><pre><code class="language-bash">cp ./DirectoryA_1/README.txt ./DirectoryA_2
# ./DirectoryA_1/README.txt is the source file
# ./DirectoryA_2 is the destination
</code></pre><p>如果你想从 <strong>DirectoryA_1</strong> 复制一个以上的文件到 <strong>DirectoryA_2</strong>，你会这样使用 <code>cp</code> 命令：</p><pre><code class="language-bash">cp ./DirectoryA_1/README.txt ./DirectoryA_1/ANOTHER_FILE.txt ./DirectoryA_2
</code></pre><p>正如你所看到的，你将把所有的源文件放在前面，而最后一个参数将是目的文件。</p><h2 id="-cp--2">如何用 cp 命令复制目录</h2><p>默认情况下，<code>cp</code> 命令对文件起作用。因此，如果你试图像这样复制一个目录：</p><pre><code class="language-bash">cp ./DirectoryA_1/Folder/ ./DirectoryA_2
</code></pre><p>你将得到一个错误：</p><p><strong><strong>./DirectoryA_1/Folder/ is a directory</strong></strong></p><p>要复制目录，你必须传入 <code>-r</code> 标志。这个标志通知 <code>cp</code> 命令递归地复制一个目录及其内容（可以是文件或其他子目录）。因此，对于前面的命令，你可以在目录源之前加上这个标志，像这样：</p><pre><code class="language-bash">cp -r ./DirectoryA_1/Folder/ ./DirectoryA_2
</code></pre><p>这个命令将递归复制 <strong><strong>./DirectoryA_1/</strong></strong> 中的 <strong><strong>Folder</strong></strong> 目录，以及 <strong><strong>Folder</strong></strong> 目录中的所有文件和目录。</p><h2 id="-glob-">如何复制符合 glob 模式的文件</h2><p>glob 模式类似于 Regex，它允许你匹配多个名称与特定模式相匹配的文件。在这里可以了解到更多的区别：<a href="https://dillionmegida.com/p/regex-vs-glob-patterns/">Regex vs Glob 模式</a>。</p><p>例如，如果你想复制 <strong>DirectoryA_1</strong> 中所有扩展名为 .txt 的文件，你可以执行这个命令：</p><pre><code class="language-bash">cp ./DirectoryA_1/*.txt ./DirectoryA_2
</code></pre><p><code>./DirectoryA_1/*.txt</code> 匹配名字中带有 <code>.txt</code> 扩展名的文件，<code>cp</code> 命令可以将所有这些文件复制到目的地。</p><p>你可以查看 <a href="https://linux.die.net/man/7/glob">glob 文档</a>，了解更多关于可以使用的 glob 模式和字符。</p><p>现在你知道如何从命令行中直接复制文件（和目录）了。谢谢你阅读本文！</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何管理 Linux 进程 ]]>
                </title>
                <description>
                    <![CDATA[ 我们都遵循某些流程来实现我们的目标，类似的是，每个系统都有自己的进程来完成任务。 在 Linux 系统中执行的每个程序或命令都被称为一个进程。 在本教程中，让我们来探讨进程以及我们如何在 Linux 中管理它们。 什么是 Linux 进程 理论上，一个进程被称为一个正在执行的程序，就是一个系统目前正在进行的任务。 你在系统上的每一个动作都会导致一个新的进程。例如，打开一个浏览器就会启动一个进程。 简单地说，一个进程是一个程序的实例。用户的操作被转化为一个命令，在执行该命令时将会创建一个新的进程。 进程按照父-子层次结构工作。正如层次结构的名称所表示的那样，由命令/程序启动的进程被称为父进程，父进程产生的进程被称为子进程。 Linux 进程的类型 在 Linux 发行版中，进程被分为两种类型：  * 前台进程  * 后台进程 前台进程 一个需要用户使用终端命令或程序来启动的进程被称为前台进程。这意味着前台进程需要一个来自用户的输入触发。所以每个前台进程都是手动触发的。 每当一个进程在前台运行时，其他进程应该等待，直到当前进程完成。 证明这一点的最好例子是通过 sle ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-to-manage-linux-processes/</link>
                <guid isPermaLink="false">63e600e7e673d23d2887835e</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Fri, 10 Feb 2023 08:22:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/02/BB---How-to-manage-processes-in-Linux-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/how-to-manage-linux-processes/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Manage Linux Processes</a>
      </p><p>我们都遵循某些流程来实现我们的目标，类似的是，每个系统都有自己的进程来完成任务。</p><p>在 Linux 系统中执行的每个程序或命令都被称为一个进程。</p><p>在本教程中，让我们来探讨进程以及我们如何在 Linux 中管理它们。</p><h1 id="-linux-">什么是 Linux 进程</h1><p>理论上，一个进程被称为一个正在执行的程序，就是一个系统目前正在进行的任务。</p><p>你在系统上的每一个动作都会导致一个新的进程。例如，打开一个浏览器就会启动一个进程。</p><p>简单地说，一个进程是一个程序的实例。用户的操作被转化为一个命令，在执行该命令时将会创建一个新的进程。</p><p>进程按照父-子层次结构工作。正如层次结构的名称所表示的那样，由命令/程序启动的进程被称为父进程，父进程产生的进程被称为子进程。</p><h2 id="linux-">Linux 进程的类型</h2><p>在 Linux 发行版中，进程被分为两种类型：</p><ul><li>前台进程</li><li>后台进程</li></ul><h3 id="-">前台进程</h3><p>一个需要用户使用终端命令或程序来启动的进程被称为前台进程。这意味着前台进程需要一个来自用户的输入触发。所以每个前台进程都是手动触发的。</p><p>每当一个进程在前台运行时，其他进程应该等待，直到当前进程完成。</p><p>证明这一点的最好例子是通过 <code>sleep</code> 命令。<code>sleep</code> 命令不允许用户与终端互动，直到达到给定的时间。</p><figure class="kg-card kg-code-card"><pre><code>sleep 10</code></pre><figcaption>终端命令在前台延迟 10 秒</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/02/image.png" class="kg-image" alt="image" width="600" height="400" loading="lazy"><figcaption><code>sleep</code> 终端命令在前台运行并暂停用户输入</figcaption></figure><p>我们应该等待 10 秒钟，以访问终端运行另一个命令。</p><h3 id="--1">后台进程</h3><p>一个独立于用户输入运行的进程被称为后台进程。与前台进程不同，我们可以在一个后台进程中同时运行多个进程。</p><p>要在后台运行一个进程，在你用来启动该进程的命令的结尾处放一个安培号（&amp;）。</p><p>这里有一个例子：</p><p>让我们在一个后台进程中执行 <code>sleep</code> 命令。它将在后台运行，并将终端还给我们以运行其他命令。</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh4.googleusercontent.com/99ky8Jj_UgNSPmaxJC1k7KOQdfbN-_hhRh31cfAxpyxECAvJFHJjuHSrRF03epnMcUn14p_-w6I4obtRHBLPmIefL8CWT14hYr4_7WI6H3t6lzOCQWJWtajR_MVFfSiP986loc_qhxToalcOttf99gr6pyGJDgGU80hu3sMkJpJLLNu-VgbKugMiNrqnqQ" class="kg-image" alt="99ky8Jj_UgNSPmaxJC1k7KOQdfbN-_hhRh31cfAxpyxECAvJFHJjuHSrRF03epnMcUn14p_-w6I4obtRHBLPmIefL8CWT14hYr4_7WI6H3t6lzOCQWJWtajR_MVFfSiP986loc_qhxToalcOttf99gr6pyGJDgGU80hu3sMkJpJLLNu-VgbKugMiNrqnqQ" width="600" height="400" loading="lazy"><figcaption>后台进程的终端命令示例</figcaption></figure><figure class="kg-card kg-code-card"><pre><code>sleep 10 &amp;</code></pre><figcaption>终端命令在后台延迟 10 秒</figcaption></figure><p>现在我们可以看到，上述命令在后台运行。它创建了一个 <code>PID</code> 19003 的进程。所以我们可以同时运行另一条命令（<code>pwd</code> 命令）。</p><h2 id="--2">如何将一个前台进程改为后台进程</h2><p>如果我们在前台启动一个进程并想把它放到后台，我们可以用 <code>bg</code> 命令来实现。让我们看看如何将前台进程改为后台。</p><p>如果一个进程正在运行，按 <code>CTRL+Z</code> 键。这个命令将暂停当前进程。</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/01/image-372.png" class="kg-image" alt="image-372" width="600" height="400" loading="lazy"><figcaption>前台进程输出</figcaption></figure><p>然后运行 <code>bg</code> 命令。它接受一个进程 ID 作为参数，并将该进程放入后台。如果参数为空，它将把当前暂停的进程放入后台。</p><figure class="kg-card kg-code-card"><pre><code>bg &lt;process_id&gt;</code></pre><figcaption>将进程移至后台的命令</figcaption></figure><figure class="kg-card kg-code-card"><pre><code>bg</code></pre><figcaption>将上一个进程移到后台的命令</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/01/image-373.png" class="kg-image" alt="image-373" width="600" height="400" loading="lazy"><figcaption>前台进程向后台进程输出</figcaption></figure><p>我们可以看到暂停的命令（<code>sudo apt update</code>）在后台恢复了。</p><h1 id="-linux--1">如何列出 Linux 进程</h1><p>在我们介绍如何做到这一点之前，你应该知道为什么你可能需要知道一个进程的列表。这里有几个原因：</p><ul><li>要知道哪个进程消耗的时间更多</li><li>要知道哪个进程占用更多的内存和 CPU</li><li>要知道一个正在运行的进程所触发的命令</li></ul><p>要查看当前正在运行的进程，我们可以使用 <code>ps</code>（Process Status 进程状态）命令：</p><figure class="kg-card kg-code-card"><pre><code>ps</code></pre><figcaption>列出正在运行的进程的终端命令</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/02/image-1.png" class="kg-image" alt="image-1" width="600" height="400" loading="lazy"><figcaption><code>ps</code>&nbsp;命令展示正在运行的进程的列表</figcaption></figure><p>要列出每个登录用户的所有进程的摘要，我们可以使用 <code>w</code> 命令。这个命令是 Linux 中 <code>who</code>、<code>uptime</code> 和 <code>ps -a</code> 命令的结合。</p><figure class="kg-card kg-code-card"><pre><code>w</code></pre><figcaption>列出所有登录用户的进程的终端命令</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/02/image-2.png" class="kg-image" alt="image-2" width="600" height="400" loading="lazy"><figcaption><code>w</code>&nbsp;命令显示所有用户的进程列表</figcaption></figure><h2 id="--3">如何以树状视图列出进程</h2><p>当一个程序/命令运行时，它启动了一个被称为“父进程”的主进程。父进程可能依赖于其他一些命令/程序，这将创建一个子进程。</p><p>下面的截图是一个例子。</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh5.googleusercontent.com/Dwa-k101f5l6-Sy3ec8BotbvFggPF4x_UjXdmWpc_YB7AsFb_iKXT-RAjzwA3GhXQI3wa5hdwRBr8hL3eUh4TnyKft_LCPgC0XYDOtLEYeRRBKBGrjZNw3m9irt3XUkaV_7y86LXdRNCssT_Qa1eclk" class="kg-image" alt="Dwa-k101f5l6-Sy3ec8BotbvFggPF4x_UjXdmWpc_YB7AsFb_iKXT-RAjzwA3GhXQI3wa5hdwRBr8hL3eUh4TnyKft_LCPgC0XYDOtLEYeRRBKBGrjZNw3m9irt3XUkaV_7y86LXdRNCssT_Qa1eclk" width="600" height="400" loading="lazy"><figcaption>父进程（firefox）的子进程</figcaption></figure><p>在上面的截图中，Firefox 是父进程，其他进程是其子进程。</p><p>让我们来探讨一下如何以树状结构列出进程。</p><p><code>pstree</code> 是一个 Linux 命令，用于以树状结构列出所有用户的当前运行进程。它被用作 <code>ps</code> 命令的一个更直观的替代。</p><figure class="kg-card kg-code-card"><pre><code>pstree</code></pre><figcaption>将进程以树状结构列出的终端命令</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/02/image-3.png" class="kg-image" alt="image-3" width="600" height="400" loading="lazy"><figcaption><code>pstree</code>&nbsp;命令以树状结构列出所有进程</figcaption></figure><p>我们可以看到，正在运行的进程是以树状形式显示的。这对于可视化进程是很有用的。</p><p>在命令中添加 <code>-p</code> 标志将显示每个分支和其进程 ID。</p><figure class="kg-card kg-code-card"><pre><code>pstree -p</code></pre><figcaption>以树状结构显示一个父进程的子进程的终端命令</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh6.googleusercontent.com/elX0V2qolKRLEhXmJuPc549_YdTr80Vz5t60XRucXDrYC3_LFKKRDlB_-kP_uJSYvepwX3n6_XQ8jLvzMohI76-gfhSPDO7eD1KEexqRqEfw49K4E2ZpPodobGvnPA0paKsGXHdxDQ1CjVpfTOSduGI" class="kg-image" alt="elX0V2qolKRLEhXmJuPc549_YdTr80Vz5t60XRucXDrYC3_LFKKRDlB_-kP_uJSYvepwX3n6_XQ8jLvzMohI76-gfhSPDO7eD1KEexqRqEfw49K4E2ZpPodobGvnPA0paKsGXHdxDQ1CjVpfTOSduGI" width="600" height="400" loading="lazy"><figcaption>终端命令以树状视图显示带有 PID 的进程列表</figcaption></figure><p>要列出一个特定进程的子进程，请将进程 ID 作为参数传给 <code>pstree</code> 命令。</p><figure class="kg-card kg-code-card"><pre><code>pstree 3149</code></pre><figcaption>列出进程 id 3149 的进程的终端命令</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh5.googleusercontent.com/L_OeZYxLZCDFFxMqelMfvxXWc2g3eKbKlt4EPV1bPfUBGZ5-STfSv9gxSEOksHsWuufeniSgbGS1-w5DL9uzEuQhWRMb7MOXuKpIn3Nr40wBJbDQkOnswClwvLhY0f9o-fuxV_OUwUqY6gDIc6koa0Q" class="kg-image" alt="L_OeZYxLZCDFFxMqelMfvxXWc2g3eKbKlt4EPV1bPfUBGZ5-STfSv9gxSEOksHsWuufeniSgbGS1-w5DL9uzEuQhWRMb7MOXuKpIn3Nr40wBJbDQkOnswClwvLhY0f9o-fuxV_OUwUqY6gDIc6koa0Q" width="600" height="400" loading="lazy"><figcaption>将某一进程罗列为树状视图</figcaption></figure><p>在上文中，我提到 <code>pstree</code> 命令列出了所有用户的进程。在 <code>pstree</code> 命令中传递用户名，只列出该用户运行的进程。</p><pre><code>pstree root</code></pre><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh6.googleusercontent.com/zTEM4mk9LXPrkBs3KoJ4Y8eBzuH3blStmsX-bgk1ohMwad8LF6hsAXwzSx_aF1vDqE-SdyhhaBWQrNyeuRNN_QHCrU5SY2TFDjnfB1cKbROiBsEBQmLuiXrGPV53ZKJqUGaM6TIYosf3TT1Uk1py-Po" class="kg-image" alt="zTEM4mk9LXPrkBs3KoJ4Y8eBzuH3blStmsX-bgk1ohMwad8LF6hsAXwzSx_aF1vDqE-SdyhhaBWQrNyeuRNN_QHCrU5SY2TFDjnfB1cKbROiBsEBQmLuiXrGPV53ZKJqUGaM6TIYosf3TT1Uk1py-Po" width="600" height="400" loading="lazy"><figcaption>以树状视图列出特定用户的进程</figcaption></figure><p>上面的截图显示了由 <code>root</code> 用户运行的进程。</p><h2 id="--4">如何查看某个程序的进程</h2><p>很多开发者可能都遇到过以下情况：</p><p>在进行 web 开发项目时，我们使用 Chrome、Firefox 等不同的浏览器来验证输出。</p><p>有些开发者会不断地打开标签，而从不关闭已打开的标签。由于负载过重（如果打开了 150 多个标签），浏览器有时会没有反应😣导致系统挂起。最糟糕的是，我们将无法关闭浏览器😂。</p><p>与 Windows 不同，我们在 Linux 中没有任务管理器来杀死浏览器。</p><p>这个问题在 Linux 中也可以轻松解决。让我们看看一个 Linux 专家是如何处理这种情况的。</p><p>我们知道，每个程序（包括浏览器）都是作为一个进程运行的。所以，你只需要找到进程的 ID，然后关掉它。</p><p>让我们看看如何找到你需要的一个命令/程序的进程 ID。</p><p>在我的系统中，Chrome 正在运行，现在我们可以通过运行以下命令得到 Chrome 的 PID：</p><figure class="kg-card kg-code-card"><pre><code>pidof chrome</code></pre><figcaption>查找进程 ID 的终端命令</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh3.googleusercontent.com/TUL8R945bAnPXPIZ61Cs6VKzDVLAoRiOGbfZWD-x4u_Jzja72eGqGTXJjC14lhNqa4uF2-jKT3ttOtBJ6f-rbaxqGtEQoI2yPPwanl1ieftWpqMTMFGCn11pfRl2q3s98rehfm0-X7353cJ5KkoM1j2zLxk1CKAM6X-4NMxr_14M0WWdStMC9QhfqbbRrg" class="kg-image" alt="TUL8R945bAnPXPIZ61Cs6VKzDVLAoRiOGbfZWD-x4u_Jzja72eGqGTXJjC14lhNqa4uF2-jKT3ttOtBJ6f-rbaxqGtEQoI2yPPwanl1ieftWpqMTMFGCn11pfRl2q3s98rehfm0-X7353cJ5KkoM1j2zLxk1CKAM6X-4NMxr_14M0WWdStMC9QhfqbbRrg" width="600" height="400" loading="lazy"><figcaption>查找 Chrome 进程 ID 的终端命令</figcaption></figure><h2 id="--5">如何杀死一个进程</h2><p>在 Linux 中，有一个叫作 <code>kill</code> 的命令，通过传递 PID（进程 ID）或进程名称来杀死任何进程。</p><p>下面是 <code>kill</code> 命令的语法：</p><figure class="kg-card kg-code-card"><pre><code>kill &lt;pid/processname&gt;</code></pre><figcaption>kill 命令的语法</figcaption></figure><p>让我们存储 Chrome 的 PID，并使用 <code>kill</code> 命令杀死它：</p><figure class="kg-card kg-code-card"><pre><code>a=$(pidof chrome)
kill $a</code></pre><figcaption>杀死一个进程的命令</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh5.googleusercontent.com/KJP27zaj4YOe4BlWlDQskMlX5ymEUfdcATwD-yyD6LpORFMrV7uTC-E8AlvbmQXpTYNKnytLhAmBgORLpCYCRHeTVnjU9lQfIISxcmFpUJtY13rnnPJT5sdYBz3oPkgr9MnXjqx8F8wdU_bAZTM6EhffPLIA9GhD8lrI3o4ysM-QWZdDLptnyEeadAM9HA" class="kg-image" alt="KJP27zaj4YOe4BlWlDQskMlX5ymEUfdcATwD-yyD6LpORFMrV7uTC-E8AlvbmQXpTYNKnytLhAmBgORLpCYCRHeTVnjU9lQfIISxcmFpUJtY13rnnPJT5sdYBz3oPkgr9MnXjqx8F8wdU_bAZTM6EhffPLIA9GhD8lrI3o4ysM-QWZdDLptnyEeadAM9HA" width="600" height="400" loading="lazy"><figcaption>杀死一个进程的终端命令</figcaption></figure><p>上述命令将杀死 Chrome web 浏览器。</p><h2 id="--6">如何列出所有进程</h2><p>我们可以使用 <code>top</code> 命令查看所有的 Linux 进程。它为所有用户显示每个进程的实时更新。</p><figure class="kg-card kg-code-card"><pre><code>top</code></pre><figcaption>实时列出所有进程的命令</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh6.googleusercontent.com/aDFrfxMKy6yydKH81T7o4S-Z5cV552h0qTq34UH_oUuzj-Oml8CQVlzc2rrBUMNCawgMTxxePSFiI0uCTAHWVUMqaxe__JIGJFCbTn8TRoYWqzoDFxeUfmLHH4tphdUr8DYGyLPx-1vfEP-ZaMzfSlLvcNx-qaGTqxSc9JepmJRmbE5Crd6EI52sOt6JRQ" class="kg-image" alt="aDFrfxMKy6yydKH81T7o4S-Z5cV552h0qTq34UH_oUuzj-Oml8CQVlzc2rrBUMNCawgMTxxePSFiI0uCTAHWVUMqaxe__JIGJFCbTn8TRoYWqzoDFxeUfmLHH4tphdUr8DYGyLPx-1vfEP-ZaMzfSlLvcNx-qaGTqxSc9JepmJRmbE5Crd6EI52sOt6JRQ" width="600" height="400" loading="lazy"><figcaption>实时显示所有进程的终端命令</figcaption></figure><p>让我们了解一下标题，以理解下方的数据。</p><ul><li>PID 代表一个唯一的进程 ID</li><li>USER 代表任务所有者的用户名</li><li>PR 代表该进程的优先级，数字越小，优先级越高</li><li>NI 代表任务的优先级，一个负的 Nice 值意味着更高的优先级，一个正的 Nice 值意味着更低的优先级</li><li>VIRT 代表任务使用的总虚拟内存</li><li>RES 代表一个进程的 RAM 使用量，以千字节为单位</li><li>SHR 代表一个进程使用的共享内存大小（Kb）</li><li>S 代表进程的状态：<br>- <strong><strong>D</strong>：</strong>不间断的睡眠<br>- <strong><strong>R</strong>：</strong>运行<br>- <strong><strong>S</strong>：</strong>睡眠<br>- <strong><strong>T</strong>：</strong>追踪（已停止）<br>- <strong><strong>Z</strong>：</strong>僵尸</li><li>CPU 代表 CPU 使用率</li><li>MEM 代表任务的内存使用量</li><li>TIME 代表 CPU 时间</li><li>COMMAND 代表用于启动进程的命令</li></ul><p>要显示特定的用户进程，我们应该使用标志 <code>-u</code>：</p><figure class="kg-card kg-code-card"><pre><code>top -u &lt;username&gt;</code></pre><figcaption>列出特定用户进程的终端命令语法</figcaption></figure><p>要查看由用户 <code>gogosoon</code> 运行的进程，请运行以下命令：</p><figure class="kg-card kg-code-card"><pre><code class="language-linux">top -u gogosoon</code></pre><figcaption>列出由用户 <code>gogosoon</code>&nbsp;启动的进程的终端命令</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/02/image-4.png" class="kg-image" alt="image-4" width="600" height="400" loading="lazy"><figcaption>由用户 <code>gogosoon</code>&nbsp;启动的所有进程的终端输出</figcaption></figure><p>你可能对命令行的输出感到困惑 😆。这对实时调试进程来说有点困难。</p><p>这里有一个方便的 GUI 工具来处理 Linux 中的进程。但我们必须手动安装这个工具。这将更像 Windows 中的任务管理器。</p><figure class="kg-card kg-code-card"><pre><code>sudo apt install gnome-system-monitor</code></pre><figcaption>安装系统监控应用程序的终端命令</figcaption></figure><p>安装后，只需在终端输入软件的名称：</p><figure class="kg-card kg-code-card"><pre><code>gnome-system-monitor</code></pre><figcaption>在 GUI 中打开进程列表的命令</figcaption></figure><p>这将在一个新的窗口中打开所有的进程，并有一个不错的 GUI：</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/02/image-7.png" class="kg-image" alt="image-7" width="600" height="400" loading="lazy"><figcaption>Gnome 系统监控</figcaption></figure><p>当我们右键点击任何进程时，它将显示诸如杀死、停止、结束等操作。</p><p>资源选项卡显示以下工具：</p><ul><li>CPU 历史</li><li>内存和交换历史</li><li>网络历史</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/02/image-5.png" class="kg-image" alt="image-5" width="600" height="400" loading="lazy"><figcaption>CPU 历史记录</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/02/image-6.png" class="kg-image" alt="image-6" width="600" height="400" loading="lazy"><figcaption>内存和交换历史记录</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/02/image-8.png" class="kg-image" alt="image-8" width="600" height="400" loading="lazy"><figcaption>网络历史记录</figcaption></figure><p>这些图表对确定你的系统中的负载很有用。</p><h2 id="--7">总结</h2><p>在这篇文章中，你已经了解了 Linux 中进程的基本知识。我希望你现在能更好地理解它们是如何工作的。我建议你在你的系统中尝试这些命令。</p><p>要了解更多关于 Linux 的信息，请在我的<a href="https://5minslearn.gogosoon.com/?ref=fcc_linux_processes">网站</a>上订阅我的电子邮件通讯，并在社交媒体上关注我。</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 初学者应该知道的 Linux 网络命令 ]]>
                </title>
                <description>
                    <![CDATA[ 你能想象有一台笔记本电脑却不能上网是什么样子吗？ 如果你是一名开发人员（或有抱负的人），你可能每天都会使用互联网。所以你应该学习一些有用的网络命令。 要在 Linux 中学习网络，你还应该知道如何使用终端。因为使用终端命令要比使用用户界面强大得多。它也会更快、更有效率。 前提条件 对 Linux 终端有一个基本的了解，就足以学习 Linux 中的网络。 如何找到你的机器的 IP 地址 这是网络中最基本的问题，它是学习网络的起点。 但是，请等一下。 什么是 IP 地址 IP 是“互联网协议”的缩写，它是管理数据如何通过互联网或本地网络发送的协议（一套规则）。 IP 地址基本上是一个唯一的地址，用于识别互联网或本地网络上的设备。 好了，现在我们知道什么是 IP 地址了，让我们继续。 作为一个专业的网络开发人员，我的工作是开发网站及其后端服务。 有一天，一个实习生问我一些关于他正在做的一个有趣项目的问题。他希望他的网站在桌面、手机和平板电脑上都能访问。 虽然该网站看起来是响应式的，但一旦我调整浏览器窗口，在他的笔记本电脑上切换到移动视图，部署后在手机上的结果就不那么令人 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/linux-networking-commands-for-beginners/</link>
                <guid isPermaLink="false">63ba944781727e0763145d8e</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ luojiyin ]]>
                </dc:creator>
                <pubDate>Fri, 06 Jan 2023 10:16:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/01/FreeCodeCamp---Networking-in-Linux-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/linux-networking-commands-for-beginners/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Linux Networking Commands You Should Know as a Beginner</a>
      </p><!--kg-card-begin: markdown--><p>你能想象有一台笔记本电脑却不能上网是什么样子吗？</p>
<p>如果你是一名开发人员（或有抱负的人），你可能每天都会使用互联网。所以你应该学习一些有用的网络命令。</p>
<p>要在 Linux 中学习网络，你还应该知道如何使用终端。因为使用终端命令要比使用用户界面强大得多。它也会更快、更有效率。</p>
<h2 id="">前提条件</h2>
<p>对 Linux 终端有一个基本的了解，就足以学习 Linux 中的网络。</p>
<h2 id="ip">如何找到你的机器的 IP 地址</h2>
<p>这是网络中最基本的问题，它是学习网络的起点。</p>
<p>但是，请等一下。</p>
<h3 id="ip">什么是 IP 地址</h3>
<p>IP 是“互联网协议”的缩写，它是管理数据如何通过互联网或本地网络发送的协议（一套规则）。</p>
<p>IP 地址基本上是一个唯一的地址，用于识别互联网或本地网络上的设备。</p>
<p>好了，现在我们知道什么是 IP 地址了，让我们继续。</p>
<p>作为一个专业的网络开发人员，我的工作是开发网站及其后端服务。</p>
<p>有一天，一个实习生问我一些关于他正在做的一个有趣项目的问题。他希望他的网站在桌面、手机和平板电脑上都能访问。</p>
<p>虽然该网站看起来是响应式的，但一旦我调整浏览器窗口，在他的笔记本电脑上切换到移动视图，部署后在手机上的结果就不那么令人印象深刻了。</p>
<p>所以，他向我寻求帮助。</p>
<p>“我想用我的手机在开发模式下检查网站的响应性。这可能吗？”他问。</p>
<p>“可以的。将你的笔记本电脑和手机连接在同一个网络上。找到你的笔记本 IP，并在你的手机浏览器上访问 <code>ip:&lt;server_port&gt;</code>”，我回答说。</p>
<p>于是他在浏览器中打开一个新标签，开始输入 “<a href="https://whatismy">https://whatismy</a>...” ，我阻止了他，问他在搜索什么。</p>
<p>他告诉我他正在寻找他的 IP 地址。</p>
<p>我回答说：“使用 <code>ifconfig</code> 命令来查找你的机器的 IP 地址”。</p>
<p>他打开了终端，试了试这个命令，像这样：</p>
<pre><code class="language-bash">ifconfig
</code></pre>
<p>通过这个命令找到你的机器的 IP 地址。</p>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://lh3.googleusercontent.com/ikkm_6NNhq1HetyT5ahF0dKUda-E23afbdn6seevR-tZTEalhOBN-W75GhUApYv1Xiw-ojtm9YLqIAXcalxsSpal53tsOefrLuzbhMzlK-2N7bkyUu4PZyharx0XzsQSN-9KBNjZ4pk_kLnnaTiyQcsYDBaSF5mAUSz0EGZx1pGJGlBO0PYhQZEpOjVCVg" alt="ifconfig 命令的输出示例" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>ifconfig 命令的输出示例</figcaption>
</figure>
<p>“哦，伙计！我现在很迷惑。哪个是我的 IP？”，这是他的下一个问题。</p>
<p>于是我向他解释了上述输出中的每个内容：</p>
<p>在进入每个信息区间之前，你可以发现有几个是所有信息区间的共同点。让我们来了解一下它们。</p>
<h3 id="">网络接口的特性</h3>
<p>第一行显示 UP、LOOPBACK、RUNNING、NOARP、MULTICAST 等。这些是网络接口的特性。例如，能够进行 BROADCAST，能够进行 MULTICAST。默认情况下，<code>ifconfig</code> 命令只列出 UP 状态设备。该接口也可以处于 down 状态。</p>
<h3 id="mtu">什么是 MTU</h3>
<p>MTU 是指最大传输单元。它决定了所发送的数据包的最大有效载荷大小。默认的标准值是 <strong>1500 字节</strong>。然而，你可以增加数据包的有效载荷大小（MTU），这样你就可以发送更多的数据，提高数据传输率。</p>
<h3 id="ifconfiginet">ifconfig 中的 inet 行</h3>
<p><strong>inet</strong> 是分配给该指定接口的互联网（IPv4）地址。它将由 DHCP 客户端设置。</p>
<p><strong>Netmask</strong> 是一个 32 位的 <code>掩码</code>，用于将一个 IP 地址段划分为子网，并指定网络的可用主机。</p>
<p><strong>Broadcast address（广播地址）</strong> 指的是同时在指定网络上的所有主机。</p>
<p><strong>Destination adress （目的地）</strong> 是点对点链接另一端的远程主机的地址。</p>
<p><strong>inet6</strong> 是分配给该指定接口的 IPv6 地址。</p>
<p><strong>prefixlen</strong> 被称为前缀长度，它指定了 IP 地址中作为子网掩码的比特数。</p>
<p><strong>scopeid</strong> 是为一个区域分配的 ID。范围是一个拓扑区域，在这个区域内，IPv6 地址可以作为一个接口或一组接口的唯一标识。</p>
<h3 id="rxtx">Rx 和 Tx</h3>
<p>Rx / Tx packets - 显示接收/传输的数据包数量<br>
Rx / Tx bytes – 显示桶（buckets）中的数据包大小<br>
Rx / Tx errors – 显示错误数据包的数量<br>
Rx / Tx drop – 显示丢弃的数据包数量<br>
Rx / Tx overrun – 显示溢出数据包的数量</p>
<p>上面提到的所有关键词都是不言自明的，除了溢出（overrun）。这里有一个关于溢出（overrun）的定义。</p>
<p><strong>overrun</strong> 是指在一个特定的轮询周期内没有被发送出去的数据包。这是由于调度的原因。它并不表明数据包的失败，只是表明它没有被发送。Overrun packets（溢出数据包）会在下一个周期重新调度，但同一个数据包有可能再次被溢出（overrun）。</p>
<p>让我们探讨一下每个信息展示的用途。</p>
<p>第一个以 “enx...” 开头的块（以前叫 “eth0”）是用于以太网连接。由于我没有连接以太网电缆（网线），所以它没有显示任何数据。</p>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://www.freecodecamp.org/news/content/images/2022/12/image-34.png" alt="ifconfig 命令中的以太信息" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>ifconfig 命令中的以太信息</figcaption>
</figure>
<p>以 <code>lo</code>开头的块被称为回环接口。这是一个特殊的接口，系统用它来与自己通信。</p>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://www.freecodecamp.org/news/content/images/2022/12/image-35.png" alt="ifconfig 命令中的 LoopBack 接口信息" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>ifconfig 命令中的 LoopBack 接口信息</figcaption>
</figure>
<p>以 <code>tun0</code> 开头的块被称为隧道接口。它包含你所连接的 VPN 的信息。</p>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://www.freecodecamp.org/news/content/images/2022/12/image-36.png" alt="ifconfig 命令中的隧道接口信息" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>ifconfig 命令中的隧道接口信息</figcaption>
</figure>
<p>以 <code>wlp2s0</code> 开头的块被称为 PCI 上的无线。这是连接到本地网络 WIFI 的主要接口。</p>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://www.freecodecamp.org/news/content/images/2022/12/image-37.png" alt="ifconfig 命令中的无线接口信息" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>ifconfig 命令中的无线接口信息</figcaption>
</figure>
<p>如果你连接了你的 Wifi，你应该使用最后一个。</p>
<h2 id="linux">如何使用 Linux 终端下载文件</h2>
<p>有一天，我的老板给我发了一堆可下载的链接，并要求我下载并把它们压缩在一个 Zip 文件中，然后发送回给他。</p>
<p>我以为这是个简单的工作，但后来我发现它有 100 多个可下载的链接。</p>
<p>激活了思考模式，我开始寻找一种方法来自动处理这个问题。这时我发现了 <code>wget</code> 命令。你可以使用这个终端命令从一个链接中下载资源。</p>
<p><code>wget</code> 命令非常灵活，你可以在脚本和 cron 工作中使用它。由于 <code>wget</code> 是非交互式的，它可以在后台独立下载资源，并且不要求用户处于活动或登录状态。</p>
<p>下面的命令将从 w3schools 网站下载一张图片，作为例子，在你当前的文件夹中：</p>
<pre><code class="language-bash">wget https://www.w3schools.com/html/img_chania.jpg
</code></pre>
<p>这是从 Linux 终端下载文件的命令。</p>
<p><img src="https://lh5.googleusercontent.com/qOuoghtmQbA7z0LYjN0vyL_UmDcJr_GIcOx_eU2RbUAo5IJFJ1_PiS6ncoTcUm_MUDHBEkk9N5oEnq3nH6ClbIwXFstZzBKqCHcU-0EUw0wObDngNWeMWOAUOBMBzpzrlJxGSNBP9omCkqVCMuujevN1-x6QnS-ZME0v6uPK0eKir02c5mSdfvfZEFSQog" alt="qOuoghtmQbA7z0LYjN0vyL_UmDcJr_GIcOx_eU2RbUAo5IJFJ1_PiS6ncoTcUm_MUDHBEkk9N5oEnq3nH6ClbIwXFstZzBKqCHcU-0EUw0wObDngNWeMWOAUOBMBzpzrlJxGSNBP9omCkqVCMuujevN1-x6QnS-ZME0v6uPK0eKir02c5mSdfvfZEFSQog" width="600" height="400" loading="lazy"></p>
<p>你可以传递另一个参数来指定下载文件的目标文件夹，像这样：</p>
<pre><code class="language-bash">wget https://www.w3schools.com/html/img_chania.jpg /home/user/downloads/pics/
</code></pre>
<p>这个终端命令下载文件到指定文件夹上。</p>
<p>我写了一个脚本，使用 <code>wget</code> 命令下载所有的文件，并在短短 15 分钟内把它们交给了我的老板。他相当惊讶。</p>
<h2 id="">如何使用终端命令确定你的系统是否连接到了互联网上</h2>
<p>在你的一生中，你可能至少遇到过一次这个问题。</p>
<p>我的笔记本电脑连接了 wifi。但为什么我不能上网，而我周围的人却能上网？</p>
<p>默认情况下，大多数人通常会尝试断开连接并重新连接到相同或不同的 WIFI 网络。99% 的情况下这是行不通的，你最终会面临一个在 <strong>Linux</strong> 中出现的<strong>嗯我们找不到那个网站</strong>的信息，或者在 <strong>Chorme 浏览器</strong>出现的的恐龙游戏，提示<strong>没有互联网</strong>。</p>
<p>这时你只需要耐心地找出问题所在。你需要发现是你的系统还是你的浏览器有问题。你必须弄清楚你是否能够在不使用浏览器的情况下访问互联网。</p>
<p>你可以通过使用 <code>ping</code> 终端命令来实现这一目标。它看起来像这样：</p>
<pre><code class="language-bash">ping google.com
</code></pre>
<p>这是检查互联网连接的终端命令。</p>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://lh6.googleusercontent.com/2XfEhTdEZNavg-ZMMyWDjhBzQAe4ZSXmXkeUUElef6KSrmCcfJ1Y9G2-R2BFo8iO7SoIuKMp37PAUvIYMOzrODEHaUdatGqonjUOKLXpyJBoSInyfqdpy5_0SFhrXPyqkMO5utbvsC4vBekygIq4FX4OG1_YL7C6a07KYqnuPrCtWf-1aNWz-qaUhVkLSA" alt="ping 命令的输出示例" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>ping 命令的输出示例</figcaption>
</figure>
<p>你可以使用 ping 命令来检查你的网络连接。该命令以 URL 或 IP 地址为参数，向该指定地址发送数据包。然后它打印来自服务器的响应和传输时间。它将连续打印响应，直到你取消这个过程（用 CTRL + C）。最后，它将返回以下细节：</p>
<ol>
<li>收到响应所需的最少时间</li>
<li>接收响应的平均时间</li>
<li>收到回复所需的最长时间</li>
</ol>
<p>我们可以使用 <code>-c</code> 标志指定要发送的数据包的数量，像这样：</p>
<pre><code class="language-bash">ping google.com -c 10
</code></pre>
<p>这是通过发送 10 个数据包来验证连接性的终端命令。</p>
<p>我们还可以使用 <code>-s</code> 标志指定数据包的大小：</p>
<pre><code class="language-bash">ping google.com -s 40
</code></pre>
<p>这个终端命令通过发送 40 字节的数据包来验证连接性。</p>
<p>我们还可以使用 <code>-i</code> 标志来指定下一个请求时间：</p>
<pre><code class="language-bash">ping google.com -i 2
</code></pre>
<p>终端命令来验证连接性，两个请求之间的间隔为 2 秒以及更多。</p>
<p>执行上述命令后，希望你能发现你的系统是否连接到了互联网。最有可能的是，你的浏览器将是问题的根源。重新安装浏览器将解决这个问题。</p>
<h2 id="ip">如何找到一个网站的 IP 地址</h2>
<p>在我们继续前进之前，你应该能够回答以下问题：</p>
<h3 id="dns">什么是 DNS</h3>
<p>DNS 是域名系统的意思。我们使用的每个网站都有一个域名（例如 google.com 或 freecodecamp.org）。这些域名中的每一个都会指向服务器的特定 IP 地址。DNS 基本上是一个系统，它有一个表，将每个域名与 IP 地址映射。</p>
<p>现在是时候回到正轨，学习如何找到一个网站的 IP 地址。</p>
<p><strong><code>nslookup</code></strong>（代表“名称服务器查询”）是一个查询 DNS 服务器的命令。它是一个网络管理工具，用于查询域名系统（DNS）以获得域名或 IP 地址映射或任何其他特定的 DNS 记录。系统管理员和 DevOps 使用它来解决与 DNS 有关的问题。</p>
<p>下面是如何使用它：</p>
<pre><code class="language-bash">nslookup google.com
</code></pre>
<p>这是查找任何网站的 IP 地址的终端命令。</p>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://lh3.googleusercontent.com/lwSLDftMWk2HsBYdKfc7FTwksBDqe4DqYBeNj6YEtU22Qi9cMVhbxy3SKFORTptHl2MOf4n8RZqmGDPPpFZoa5yyythXFKBVtIQBeioK3rLOgK6ExQ3_CUiC76DNMIreiW2zdLrVGgtI9DMIU4Tx8dj8Gg0pHh1PF5pdwl6vNBmf4bsSOX--dquLupoJbw" alt="nslookup 命令的输出示例" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>nslookup 命令的输出示例</figcaption>
</figure>
<h2 id="">如何知道哪个用户已经登录</h2>
<p>Linux 支持多个用户并让你管理这些用户。每次你都可以以不同的用户身份登录。而且你可以使用 <code>who</code> 命令来了解你以哪个用户的身份登录。</p>
<pre><code class="language-bash">who
</code></pre>
<p>这是寻找登录用户的终端命令。</p>
<p>它看起来像这样：</p>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://lh5.googleusercontent.com/H6ceH-av643ixKZD2Zj5R13uPoNrHKH4gqcipQmWUMCIREKz9AAPZ8jV5eVYXvGldFPZKQzL5CiRZ-DXUSfVNH6Ot0jXo-5BkrcQ2DMr3Zs-TUCAFA0VmOwRQYvPLjwIRW3mZfpdkiMw5CC22edsvC4rNi4rcbf3Je0cXEfWSRyg30ohFChk8w93klrSXg" alt="在 Linux 终端找到已登录用户的终端命令" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>在 Linux 终端找到已登录用户的终端命令</figcaption>
</figure>
<h2 id="">总结</h2>
<p>在这篇文章中，你已经学会了 Linux 中的一些基本网络命令。</p>
<p>你可以在我的<a href="https://5minslearn.gogosoon.com/">个人网站</a>上订阅我的消息，以便直接在你的收件箱中收到更多这样有见地的文章。你还会发现我所有博客的综合列表。</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何查看你的 Linux 进程 ]]>
                </title>
                <description>
                    <![CDATA[ 你可能习惯于使用 MacOS 中的 Activity Monitor（活动监视器）  或 Windows 中的 Task Manager（任务管理器）  来查看你系统中当前运行的进程。 但是对于那些运行 Linux 的人来说，如果包括双启动、虚拟盒，甚至是 WSL2，你可以使用一个有用的 Linux 命令来检查和查看你的操作系统中正在进行的所有进程。 MacOS Activity Monitor（活动监视器）  Windows Task Manager（任务管理器）在 Linux 中如何显示当前进程 Linux 中的top（进程表）命令将显示所有的系统进程。如果你在你的终端尝试这个命令，你会看到这个： 这很整洁，top  程序显示了你的 Linux 系统中所有正在运行的进程的动态列表。 通常情况下，这个命令显示的是你的系统中当前被 Linux 内核运行/管理的信息摘要。 要离开top，请按键盘上的 q  退出交互式 shell。 栏的含义  * PID：  显示任务的唯一进程 ID。 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/linux-top/</link>
                <guid isPermaLink="false">63b57872836d320782be1a05</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ luojiyin ]]>
                </dc:creator>
                <pubDate>Wed, 04 Jan 2023 04:19:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/01/Screenshot-2022-12-05-235534.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/linux-top/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to View Your Linux Processes</a>
      </p><!--kg-card-begin: markdown--><p>你可能习惯于使用 MacOS 中的 <code>Activity Monitor（活动监视器）</code> 或 Windows 中的 <code>Task Manager（任务管理器）</code> 来查看你系统中当前运行的进程。</p>
<p>但是对于那些运行 Linux 的人来说，如果包括双启动、虚拟盒，甚至是 WSL2，你可以使用一个有用的 Linux 命令来检查和查看你的操作系统中正在进行的所有进程。</p>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://www.freecodecamp.org/news/content/images/2022/12/image-8.png" alt="MacOS Activity Monitor（活动监视器）" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>MacOS Activity Monitor（活动监视器）</figcaption>
</figure>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://www.freecodecamp.org/news/content/images/2022/12/image-7.png" alt="Windows Task Manager（任务管理器）" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>Windows Task Manager（任务管理器）</figcaption>
</figure>
<h2 id="linux">在 Linux 中如何显示当前进程</h2>
<p>Linux 中的<code>top</code>（进程表）命令将显示所有的系统进程。如果你在你的终端尝试这个命令，你会看到这个：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/30fps.gif" alt="30fps" width="600" height="400" loading="lazy"></p>
<p>这很整洁，<code>top</code> 程序显示了你的 Linux 系统中所有正在运行的进程的动态列表。</p>
<p>通常情况下，这个命令显示的是你的系统中当前被 Linux 内核运行/管理的信息摘要。</p>
<p>要离开<code>top</code>，请按键盘上的 <code>q</code> 退出交互式 shell。</p>
<h3 id="">栏的含义</h3>
<ul>
<li><strong>PID：</strong> 显示任务的唯一进程 ID。</li>
<li><strong>USER：</strong> 显示哪个用户正在运行什么任务</li>
</ul>
<p>例如，你看到 <code>root</code> 和 <code>brandgrim</code>。Root 是运行该进程的系统的根，而 "brandgrim"（我）是运行该进程的用户。</p>
<ul>
<li><strong>PR：</strong> *这个数字显示进程的优先级--数字越小，优先级越高。（从直觉上讲是有道理的，对吗？）</li>
<li><strong>VIRT：</strong> 该任务使用的总虚拟内存</li>
<li><strong>RES：</strong> 该进程实际使用了多少 RAM，以 KB 为单位</li>
<li><strong>SHR：</strong> 这个数字代表特定任务使用的共享内存大小</li>
<li><strong>%CPU：</strong> 代表 CPU 的使用情况</li>
<li><strong>%MEM：</strong> 代表内存使用情况</li>
<li><strong>+TIME：</strong> 描述了任务开始后所使用的总 CPU 时间</li>
<li><strong>COMMAND：</strong> 实际启动该进程的命令的名称</li>
</ul>
<p>当你在 <code>top</code> 的交互式 shell 中时，你可以按 <code>h</code> 键调出 <code>Summary of Less Commands</code>，这是一个 <code>top</code> 所提供的所有命令的列表。</p>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://www.freecodecamp.org/news/content/images/2022/12/image-9.png" alt="在 top 中显示命令摘要" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>在 top 中显示命令摘要</figcaption>
</figure>
<h2 id="">有用的标志和命令</h2>
<p><code>top</code> 有许多独特的标志和命令，要知道使用哪一个可能会让人不知所措，尽管有一些标志一开始就很有用。</p>
<h3 id="">怎么过滤用户</h3>
<p><code>-u</code>标志指定哪些进程应该被列出，取决于你指定的用户。</p>
<p>例如，我们看到在 <strong>USER</strong> 栏下有 <code>root</code> 和 <code>brandgrim</code>，所以如果我们尝试这样做：</p>
<pre><code class="language-bash">top -u root
</code></pre>
<p>我们会看到以下情况:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/image-10.png" alt="image-10" width="600" height="400" loading="lazy"></p>
<p>它列出了在 <code>root</code> 用户下正在运行的进程。另一方面，如果我们要尝试这个命令：</p>
<pre><code class="language-bash">top -u brandgrim
</code></pre>
<p>我们会得到以下结果（显示在 <code>brandgrim</code> 用户下运行的进程）：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/image-11.png" alt="image-11" width="600" height="400" loading="lazy"></p>
<h3 id="">如何改变刷新间隔</h3>
<p>默认情况下，top 的屏幕刷新时间间隔被设置为 3.0 秒。如果你想增加或减少这个时间间隔，你可以在 <code>top</code> 交互式外壳中按下 <code>d</code>，以设置一个理想的时间。</p>
<p><img src="https://i.ibb.co/d0PYmJ3/281f04fc75ba.gif" alt="281f04fc75ba" width="600" height="400" loading="lazy"></p>
<p>上图显示如何改变刷新间隔时间。</p>
<h3 id="cpu">如何按 CPU 利用率对进程进行排序</h3>
<p>为了按照 CPU 的使用量对所有的 Linux 进程进行排序，你需要按 <code>SHIFT+P</code> 键，以便将它们排序到 <code>top</code>。现在你知道是什么占用了你的 CPU 了，那个讨厌的小的 while 循环一直在无限地运行！这就是为什么你的 CPU 会被占用。</p>
<p>例如，当我打开 VSCode 时过滤我的进程，这是我看到的：</p>
<p><img src="https://i.ibb.co/3YwQhbf/88368a8fe195.gif" alt="Processes" width="600" height="400" loading="lazy"></p>
<p>你可以看到，CPU 的利用率最初非常高，尽管随着 VSCode 加载我所有的扩展（extensions）和智能补全（Intellisense），它开始下降。</p>
<h3 id="top">如何在一个文件中保存 top 中的进程信息</h3>
<p>要把所有正在运行的 top 命令的结果保存到一个文件中，可以使用这些命令：</p>
<pre><code class="language-bash">top -n 1 -b &gt; top-processes.txt
</code></pre>
<h2 id="top"><code>top</code> 的替代品</h2>
<p>有很多 <code>top</code> 的替代品，如 <code>Htop</code>、<code>Vtop</code>、<code>Gtop</code>、<code>Gotop</code>等等，尽管我不会在这篇文章中介绍所有这些。</p>
<p><code>Htop</code>是目前最流行的<code>top</code>替代品，这要归功于它的交互式菜单和垂直和水平滚动的能力。更不用说 <code>Htop</code> 还允许你以树状结构查看你的进程，这更容易可视化。</p>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://www.freecodecamp.org/news/content/images/2022/12/image-12.png" alt="Htop（看起来很酷！）" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>Htop（看起来很酷！）</figcaption>
</figure>
<h1 id="">总结</h1>
<p><code>top</code> 是一个交互式的 shell，允许你以实时的方式查看所有的 Linux 进程。它显示系统信息以及 Linux 内核目前正在使用的进程或线程的列表。</p>
<p><code>top</code> 有自己有用的命令，如 <code>-u</code> 标志和 <code>d</code> 命令。还有一些更现代的 <code>top</code> 替代品，如 <code>Htop</code>，它允许更多的色彩和互动的 shell。</p>
<p>来源：<a href="https://tenor.com/view/how-linux-users-install-a-web-browser-linux-linux-users-gif-20223386">https://tenor.com/view/how-linux-users-install-a-web-browser-linux-linux-users-gif-20223386</a></p>
<p>希望这篇文章对你有帮助！谢谢你阅读本文:)</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何在 Linux 中设置环境变量 ]]>
                </title>
                <description>
                    <![CDATA[ 在编程时，你使用变量来临时存储信息，如字符串和数字。 变量可以在整个代码中反复使用，或者由你的操作系统提供数值。你可以编辑它们、覆盖它们，并删除它们。 在本教程中，我将教你什么是环境变量以及如何在 Linux 中设置它们。 什么是环境变量 环境变量是特定环境中的变量。例如，操作系统中的每个用户都有自己的环境，一个管理员用户拥有与其他用户不同的环境。 你可能会声明一个只有你的用户需要的环境变量（例如一个秘密令牌），不需要暴露给其他用户。 下面是 Linux 中环境变量的一些例子：  * USER - 这指的是当前登录的用户。  * HOME - 这显示了当前用户的主目录。  * SHELL - 这存储了当前用户的 shell 路径，如 bash 或 zsh。  * LANG - 这个变量指向当前的语言 /locales 设置。  * MAIL - 这显示了当前用户的邮件存储的位置。 这些环境变量根据当前的用户会话而变化。 如何在 Linux 中列出环境变量 用于显示为当前会话定义的所有环境变量的命令是 env。 下面是我的会话的输出： ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-to-set-an-environment-variable-in-linux/</link>
                <guid isPermaLink="false">63b2e1ed836d320782be167d</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Thu, 29 Dec 2022 04:24:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/01/Copy-of-Copy-of-read-write-files-python--3-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/how-to-set-an-environment-variable-in-linux/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Set an Environment Variable in Linux</a>
      </p><p>在编程时，你使用变量来临时存储信息，如字符串和数字。</p><p>变量可以在整个代码中反复使用，或者由你的操作系统提供数值。你可以编辑它们、覆盖它们，并删除它们。</p><p>在本教程中，我将教你什么是环境变量以及如何在 Linux 中设置它们。</p><h2 id="-">什么是环境变量</h2><p>环境变量是特定环境中的变量。例如，操作系统中的每个用户都有自己的环境，一个管理员用户拥有与其他用户不同的环境。</p><p>你可能会声明一个只有你的用户需要的环境变量（例如一个秘密令牌），不需要暴露给其他用户。</p><p>下面是 Linux 中环境变量的一些例子：</p><ul><li><code>USER</code> - 这指的是当前登录的用户。</li><li><code>HOME</code> - 这显示了当前用户的主目录。</li><li><code>SHELL</code> - 这存储了当前用户的 shell 路径，如 bash 或 zsh。</li><li><code>LANG</code> - 这个变量指向当前的语言 /locales 设置。</li><li><code>MAIL</code> - 这显示了当前用户的邮件存储的位置。</li></ul><p>这些环境变量根据当前的用户会话而变化。</p><h2 id="-linux-">如何在 Linux 中列出环境变量</h2><p>用于显示为当前会话定义的所有环境变量的命令是 <code>env</code>。</p><p>下面是我的会话的输出：</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">root@Zaira:~# env
SHELL=/bin/bash
PWD=/root
LOGNAME=root
HOME=/root
LANG=C.UTF-8
LESSOPEN=| /usr/bin/lesspipe %s
USER=root
SHLVL=1
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
MAIL=/var/mail/root
_=/usr/bin/env</code></pre><figcaption><code>env</code> 命令的输出</figcaption></figure><h2 id="-linux--1">如何打印 Linux 中的环境变量</h2><p>有两种方法可以打印已经定义的环境变量：</p><ul><li><code>printenv VARIABLE_NAME</code></li><li><code>echo $varname</code></li></ul><p>让我们用这两种方法来打印变量 <code>SHELL</code> 的值。下面是一个使用 <code>printenv</code> 打印的例子：</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">root@Zaira:~# printenv SHELL
/bin/bash</code></pre><figcaption>使用 <code>printenv</code>&nbsp;打印环境变量值</figcaption></figure><p>这是一个使用 <code>echo</code> 的例子：</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">root@Zaira:~# echo $SHELL
/bin/bash</code></pre><figcaption>使用 <code>echo</code> 打印环境变量值</figcaption></figure><h2 id="-linux--2">如何在 Linux 中设置环境变量</h2><p>定义环境变量的基本语法如下：</p><pre><code class="language-bash">export VARIABLE_NAME=value</code></pre><p>我们来定义一个环境变量，列出它，并打印它的值。</p><ul><li>定义变量 <code>JAVA_HOME</code>：</li></ul><pre><code class="language-bash">root@Zaira:~# export JAVA_HOME=/usr/bin/java</code></pre><ul><li>通过列出它来验证：</li></ul><figure class="kg-card kg-code-card"><pre><code class="language-bash">root@Zaira:~# env
SHELL=/bin/bash
JAVA_HOME=/usr/bin/java
PWD=/root
LOGNAME=root
HOME=/root
LANG=C.UTF-8
LESSCLOSE=/usr/bin/lesspipe %s %s
TERM=xterm-256color
global22=yolo
LESSOPEN=| /usr/bin/lesspipe %s
USER=root
SHLVL=1
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
MAIL=/var/mail/root
_=/usr/bin/env</code></pre><figcaption>我们的变量 JAVA_HOME 在 #2 行中被定义</figcaption></figure><ul><li>打印它的值：</li></ul><pre><code class="language-bash">root@Zaira:~# echo $JAVA_HOME
/usr/bin/java</code></pre><p>然而，使用这种方法定义的变量只存储在当前会话中。在下一个会话中不能使用它们。</p><p>让我们通过打开一个新的会话并打印变量的值来验证。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">zaira@Zaira:/etc$ echo $JAVA_HOME

</code></pre><figcaption>输出是空的</figcaption></figure><p>但是，我们可以让这些定义持久化，如下一节所示。</p><h2 id="-linux--3">如何在 Linux 中使环境变量持久化</h2><p>为了使 <code>JAVE_HOME</code> 变量持久化，编辑文件 <code>.bashrc</code> 并在其中定义其值。</p><p><code>.bashrc</code> 是一个脚本文件，每当用户登录的时候就会执行。它是隐藏的，默认位于用户的主目录中。</p><p>我对我的 <code>.bashrc</code> 文件做了如下编辑：</p><pre><code class="language-bash">vi ~/.bashrc</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/01/image.png" class="kg-image" alt="image" width="600" height="400" loading="lazy"><figcaption>在 <code>.bashrc</code>&nbsp;文件的末尾添加环境变量的定义</figcaption></figure><p>为了使这些变化生效，使用 <code>source</code> 命令更新 <code>.bashrc</code> 文件：</p><pre><code class="language-bash">source .bashrc</code></pre><p>让我们通过打开一个新的会话来验证。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">root@Zaira:~# echo $JAVA_HOME
/usr/bin/java</code></pre><figcaption>这就是我们的变量！</figcaption></figure><h2 id="-linux--4">如何在 Linux 中创建一个持久的全局变量</h2><p>有时你可能需要定义一个所有用户都可以访问的全局环境变量。</p><p>为此，我们需要首先声明一个变量，并在读取环境变量的相关文件中进行修改。</p><p>让我们一步一步来。</p><ol><li>我以用户 <code>Zaira</code> 的身份登录。我正在创建一个全局变量 <code>GLOBAL_VARIABLE</code>，像这样：</li></ol><pre><code class="language-bash">zaira@Zaira:~$ export GLOBAL_VARIABLE="This is a global variable"</code></pre><p>2. 编辑以下文件：</p><ul><li><code>/etc/environment</code> - 这个文件用来设置全系统的环境变量。</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/01/image-1.png" class="kg-image" alt="image-1" width="600" height="400" loading="lazy"><figcaption>更新 <code>/etc/environment</code>&nbsp;文件</figcaption></figure><p>为了使这些变化生效，请使用命令 <code>source /etc/environment</code>。</p><ul><li><code>/etc/profile</code> - 只要登录了 bash shell，就会读取该文件中设置的变量。编辑这个文件并使用 <code>export</code> 命令：</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/01/image-2.png" class="kg-image" alt="image-2" width="600" height="400" loading="lazy"><figcaption>更新 <code>/etc/profile</code></figcaption></figure><p>是时候进行测试了！</p><p>现在，我将用户切换为根用户，并验证我是否可以访问变量 <code>GLOBAL_VARIABLE</code>。</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">root@Zaira:~# echo $GLOBAL_VARIABLE
This is a global variable</code></pre><figcaption>通过根用户访问全局变量</figcaption></figure><p>成功了！我能够通过 <code>root</code> 用户访问由用户 <code>Zaira</code> 定义的全局变量。这一点也适用于其他用户。所以现在你也知道如何定义全局环境变量了。</p><h2 id="--1">总结</h2><p>在本教程中，你学会了如何在 Linux 中创建和定义环境变量。你还学会了如何使它们持久化，以便你可以在多个会话中使用它们。</p><p>你在这里学到的最喜欢的东西是什么？请在 <a href="https://twitter.com/hira_zaira">Twitter</a> 上告诉我。</p><p>你可以在<a href="https://www.freecodecamp.org/news/author/zaira/">这里</a>阅读我的其他文章。</p><p>图片来自 Freepik，作者 <a href="https://www.freepik.com/free-vector/hacker-operating-laptop-cartoon-icon-illustration-technology-icon-concept-isolated-flat-cartoon-style_11602236.htm#query=programmer&amp;position=2&amp;from_view=search&amp;track=sph">catalyststuff</a>。</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
