Reputation: 341
I stumbled upon a shell instruction which looks odd:
ls -a | grep ".qmail-" | grep -v "mail" | grep ".mail" > t ; echo $?
I suspect that the returned value would represent an error. Could anyone confirm this or explain in which circumstances this instruction would be applied ?
Upvotes: 1
Views: 247
Reputation: 31
The bash shell (and most other shells) let users use the output of one command as the input of another. This is accomplished with the |
operator which is called a pipe. So the output of of ls -a
is fed to grep ".qmail-"
and so on. The >
operator sends the output of the command to a file, in this case t
. So ls -a | grep ".qmail-" | grep -v "mail" | grep ".mail" > t
lists the contents of a directory and passes the output through successive filters before finally saving the output to the file t
.
The semicolon signals the end of a command and allows multiple bash commands to be entered on a single line.
echo $?
prints out the return value of the last executed command, in this case, ls -a | grep ".qmail-" | grep -v "mail" | grep ".mail" > t
. By convention, any value besides 0 indicates some sort of error occurred.The Linux Documentation Project gives a list of some common exit codes.
Upvotes: 1
Reputation: 754550
The first grep
only allows through lines that contain qmail
(preceded by any character and followed by a dash, but that is largely immaterial). The second grep
strips out lines that contain mail
, which means every line passed by the first grep
is deleted by the second. There's nothing left for the third one to process, so the file t
will always be empty. The value for $?
should be 1, failure, since the third grep
failed to find any lines that matched its pattern (because it got no lines to process).
It is a mistake.
It is hard to know how to fix it without knowing what it is trying to do.
Upvotes: 4