opus7: submit a new article from Athas - tgtimes - The Gopher Times
(HTM) git clone git://bitreich.org/tgtimes git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/tgtimes
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
---
(DIR) commit c8279e8b137436c61ad76e077afe0cec09ed9260
(DIR) parent 9c6672aaa881709d5e0139128423ad83000b557f
(HTM) Author: Josuah Demangeon <me@josuah.net>
Date: Sun, 16 Oct 2022 02:09:47 +0200
opus7: submit a new article from Athas
Diffstat:
A opus7/article-athas-shell-redirect… | 73 +++++++++++++++++++++++++++++++
1 file changed, 73 insertions(+), 0 deletions(-)
---
(DIR) diff --git a/opus7/article-athas-shell-redirections.mw b/opus7/article-athas-shell-redirections.mw
@@ -0,0 +1,73 @@
+.SH athas
+Shell Redirections
+.2C 60
+.
+.PP
+Newcomers to the Unix shell quickly encounter handy tools such as
+sed(1) and sort(1). This command prints the lines of the given file
+to stdout, in sorted order:
+.
+.DS
+$ sort numbers
+.DE
+.
+.PP
+Soon after, newcomers will also encounter shell redirection, by which
+the output of these tools can conveniently be read from or stored in
+files:
+.
+.DS
+$ sort < numbers > numbers_sorted
+.DE
+.
+.PP
+Our new user, fascinated by the modularity of the Unix shell, may then
+try the rather obvious possibility of having the input and output file
+be the same:
+.
+.DS
+$ sort < numbers > numbers
+.DE
+.
+.PP
+But disaster strikes: the file is empty! The user has lost their
+precious collection of numbers - let's hope they had a backup. Losing
+data this way is almost a rite of passage for Unix users, but let us
+spell out the reason for those who have yet to hurt themselves this
+way.
+.
+.PP
+When the Unix shell evaluates a command, it starts by processing the
+redirection operators - that's the '>' and '<' above. While '<' just
+opens the file, '>' *truncates* the file in-place as it is opened for
+reading! This means that the 'sort' process will dutifully read an
+empty file, sort its non-existent lines, and correctly produce empty
+output.
+.
+.PP
+Some programs can be asked to write their output directly to files
+instead of using shell redirection (sed(1) has '-i', and for sort(1)
+we can use '-o'), but this is not a general solution, and does not
+work for pipelines. Another solution is to use the sponge(1) tool
+from the "moreutils" project, which stores its standard input in
+memory before finally writing it to a file:
+.
+.DS
+$ sort < numbers | sponge numbers
+.DE
+.
+.PP
+The most interesting solution is to take advantage of subshells, the
+shell evaluation order, and Unix file systems semantics. When we
+delete a file in Unix, it is removed from the file system, but any
+file descriptors referencing the file remain valid. We can exploit
+this behaviour to delete the input file *after* directing the input,
+but *before* redirecting the output:
+.
+.DS
+$ (rm numbers && sort > numbers) < numbers
+.DE
+.
+.PP
+This approach requires no dependencies and will work in any Unix
+shell.