Unix / Linux - Shell 輸入/輸出重定向
Hello there, future command-line wizards! Today, we're going to embark on an exciting journey into the world of Unix/Linux shell input/output redirections. Don't worry if you've never written a line of code before – I'll guide you through this adventure step by step, just like I've done for countless students over my years of teaching. So, grab your virtual hard hats, and let's dive in!
Understanding the Basics
Before we jump into the nitty-gritty, let's start with a simple analogy. Imagine the shell as a helpful assistant. Normally, this assistant reads your commands from the keyboard (standard input), shows results on the screen (standard output), and displays errors on the screen too (standard error). But what if we want to change this default behavior? That's where I/O redirection comes in handy!
Output Redirection
The Magic of '>'
Let's start with output redirection. The '>' symbol is our first magic wand. It allows us to send the output of a command to a file instead of the screen.
echo "Hello, World!" > greeting.txt
If you run this command, it won't show anything on the screen. Instead, it creates a file named 'greeting.txt' containing "Hello, World!". If the file already exists, it gets overwritten. Be careful with this power!
Append with '>>'
Now, what if you want to add more to an existing file without overwriting it? That's where '>>' comes to the rescue.
echo "How are you?" >> greeting.txt
This command appends "How are you?" to our 'greeting.txt' file. If you open the file now, you'll see both lines.
Input Redirection
Reading from Files with '<'
Just as we can redirect output, we can also redirect input. The '<' symbol allows us to use a file as input for a command.
sort < names.txt
This command reads the content of 'names.txt' and sorts it alphabetically. It's like telling the 'sort' command, "Hey, instead of waiting for me to type names, read them from this file!"
Here Document
The Magic of '<<'
Sometimes, we want to pass multiple lines of input to a command. That's where the 'here document' comes in, using '<<'.
cat << EOF
This is line 1
This is line 2
EOF
This nifty trick allows you to input multiple lines until the shell encounters 'EOF' (which stands for End Of File, but you can use any word).
Discard the Output
The Quiet '/dev/null'
There are times when we run a command but don't care about its output. Enter '/dev/null', the digital black hole of Unix/Linux.
ls non_existent_file 2> /dev/null
This command tries to list a non-existent file, but instead of showing an error, it silently discards it. It's like having a "mute" button for your commands!
Redirection Commands
Let's summarize the redirection commands we've learned in a handy table:
Command | Description |
---|---|
> | Redirects output to a file (overwrites) |
>> | Appends output to a file |
< | Redirects input from a file |
<< | Here document (multi-line input) |
2> | Redirects error output |
&> | Redirects both standard output and error |
Practical Examples
Now that we've covered the basics, let's look at some practical examples to solidify our understanding.
Combining Input and Output Redirection
sort < unsorted_names.txt > sorted_names.txt
This command reads names from 'unsorted_names.txt', sorts them, and writes the sorted list to 'sorted_names.txt'. It's like having a personal organizer for your files!
Redirecting Both Output and Errors
ls /home /nonexistent 1> output.txt 2> error.txt
Here, we're listing two directories. The standard output (successful listing of /home) goes to 'output.txt', while any errors (like trying to list the non-existent directory) go to 'error.txt'.
Using Here Document for Script Input
mysql -u username -p << EOF
USE mydatabase;
SELECT * FROM users;
EXIT
EOF
This example uses a here document to run multiple MySQL commands without having to enter interactive mode. It's like giving your database a to-do list!
Conclusion
Congratulations! You've just taken your first steps into the powerful world of I/O redirection in Unix/Linux. Remember, like any skill, mastering these concepts takes practice. Don't be afraid to experiment – that's how we all learn!
In my years of teaching, I've seen students go from struggling with these concepts to becoming command-line ninjas. One of my students even joked that after learning I/O redirection, she felt like a "file whisperer" – able to make data flow exactly where she wanted it to go.
So, keep exploring, keep practicing, and soon you'll be redirecting input and output like a pro. Who knows? Maybe you'll be the next "file whisperer" in your coding journey!
Credits: Image by storyset