Unix/Linux - Shell 输入/输出重定向
你好,未来的命令行巫师们!今天,我们将踏上一段激动人心的旅程,探索Unix/Linux壳的输入/输出重定向的世界。如果你之前从未编写过一行代码,也不用担心——我会一步步引导你完成这次冒险,就像我多年来为无数学生所做的那样。所以,戴上你的虚拟安全帽,让我们一起潜入!
理解基础
在我们深入了解之前,让我们从一个简单的类比开始。想象壳是一个乐于助人的助手。通常,这个助手会从键盘(标准输入)读取你的命令,在屏幕上显示结果(标准输出),并在屏幕上显示错误(标准错误)。但如果我们想改变这种默认行为呢?这就是输入/输出重定向的用武之地!
输出重定向
'>'的魔力
让我们从输出重定向开始。'>'符号是我们的第一根魔法棒。它允许我们将命令的输出发送到文件,而不是屏幕。
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