Unix/Linux - Shell 输入/输出重定向

你好,未来的命令行巫师们!今天,我们将踏上一段激动人心的旅程,探索Unix/Linux壳的输入/输出重定向的世界。如果你之前从未编写过一行代码,也不用担心——我会一步步引导你完成这次冒险,就像我多年来为无数学生所做的那样。所以,戴上你的虚拟安全帽,让我们一起潜入!

Unix / Linux - IO Redirections

理解基础

在我们深入了解之前,让我们从一个简单的类比开始。想象壳是一个乐于助人的助手。通常,这个助手会从键盘(标准输入)读取你的命令,在屏幕上显示结果(标准输出),并在屏幕上显示错误(标准错误)。但如果我们想改变这种默认行为呢?这就是输入/输出重定向的用武之地!

输出重定向

'>'的魔力

让我们从输出重定向开始。'>'符号是我们的第一根魔法棒。它允许我们将命令的输出发送到文件,而不是屏幕。

echo "你好,世界!" > greeting.txt

如果你运行这个命令,屏幕上不会显示任何东西。相反,它会创建一个名为'greeting.txt'的文件,包含"你好,世界!"。如果文件已经存在,它会被覆盖。使用这个功能时要小心!

使用'>>'追加

现在,如果你想在不覆盖现有文件的情况下添加更多内容,该怎么办呢?这时'>>'就派上用场了。

echo "你好吗?" >> greeting.txt

这个命令将"你好吗?"追加到我们的'greeting.txt'文件中。如果你现在打开这个文件,你会看到两行内容。

输入重定向

使用'<'从文件读取

正如我们可以重定向输出一样,我们也可以重定向输入。'<'符号允许我们使用文件作为命令的输入。

sort < names.txt

这个命令读取'names.txt'的内容并按字母顺序排序。就像告诉'sort'命令:"嘿,别等我输入名字,从这个文件里读取它们!"

Here 文档

'<<'的魔力

有时,我们想将多行输入传递给命令。这时就轮到'here 文档'大显身手了,使用'<<'。

cat << EOF
这是第1行
这是第2行
EOF

这个巧妙的方法允许你输入多行,直到壳遇到'EOF'(代表End Of File,但你可以使用任何单词)。

忽略输出

安静的'/dev/null'

有时我们运行一个命令,但不关心它的输出。这时,'/dev/null',Unix/Linux的数字黑洞,就派上用场了。

ls non_existent_file 2> /dev/null

这个命令尝试列出一个不存在的文件,但不是显示错误,而是默默地忽略它。就像给你的命令装上了"静音"按钮!

重定向命令

让我们总结一下我们学到的重定向命令,并整理成一个方便的表格:

命令 描述
> 将输出重定向到文件(覆盖)
>> 将输出追加到文件
< 从文件重定向输入
<< Here 文档(多行输入)
2> 重定向错误输出
&> 同时重定向标准输出和错误

实际示例

现在我们已经覆盖了基础知识,让我们看一些实际示例来巩固我们的理解。

结合输入和输出重定向

sort < unsorted_names.txt > sorted_names.txt

这个命令从'unsorted_names.txt'读取名字,排序它们,并将排序后的列表写入'sorted_names.txt'。就像给你的文件配备了个人组织者!

同时重定向输出和错误

ls /home /nonexistent 1> output.txt 2> error.txt

在这里,我们正在列出两个目录。标准输出(成功列出/home)被写入'output.txt',而任何错误(比如尝试列出不存在的目录)被写入'error.txt'。

使用Here 文档进行脚本输入

mysql -u username -p << EOF
USE mydatabase;
SELECT * FROM users;
EXIT
EOF

这个示例使用Here 文档来运行多个MySQL命令,而不需要进入交互模式。就像给你的数据库列出一个待办事项列表!

结论

恭喜你!你已经迈出了进入Unix/Linux的I/O重定向强大世界的第一步。记住,像任何技能一样,掌握这些概念需要练习。不要害怕实验——这是我们所有人学习的方式!

在我多年的教学过程中,我看到了学生从对这些概念感到困难到成为命令行忍者。其中一个学生甚至开玩笑说,在学习了I/O重定向之后,她觉得自己像一个"文件低语者"——能够让她想要的数据流向任何地方。

所以,继续探索,继续练习,很快你就能像专业人士一样重定向输入和输出。谁知道呢?也许你会在你的编码之旅中成为下一个"文件低语者"!

Credits: Image by storyset