Buffer in order to avoir mistakes with redirections that empty your files

buffer () { tty -s && return; tmp=$(mktemp); cat > "${tmp}"; if [ -n "$1" ] && ( ( [ -f "$1" ] && [ -w "$1" ] ) || ( ! [ -a "$1" ] && [ -w "$(dirname "$1")" ] ) ); then mv -f "${tmp}" "$1"; else echo "Can't write in \"$1\""; rm -f "${tmp}"; fi }
A common mistake in Bash is to write command-line where there's command a reading a file and whose result is redirected to that file. It can be easily avoided because of : 1) warnings "-bash: file.txt: cannot overwrite existing file" 2) options (often "-i") that let the command directly modify the file but I like to have that small function that does the trick by waiting for the first command to end before trying to write into the file. Lots of things could probably done in a better way, if you know one...
Sample Output
$ echo "zbc" > file.txt # write 'zbc' in file.txt
$ cat file.txt | sed "s/z/a/g" > file.txt # we want 'abc' in file.txt (I know that the "cat" is useless here but...)
$ cat file.txt # we have nothing in file.txt

$ echo "zbc" > file.txt # write 'zbc' in file.txt
$ cat file.txt | sed "s/z/a/g" | buffer file.txt # we want 'abc' in file.txt
$ cat file.txt # we have 'abc' in file.txt

By: Josay
2009-07-27 20:21:15

These Might Interest You

  • Have you ever had to scp a file to your work machine in order to copy its contents to a mail? xclip can help you with that. It copies its stdin to the X11 buffer, so all you have to do is middle-click to paste the content of that looong file :)

    ssh user@host cat /path/to/some/file | xclip
    raphink · 2009-02-18 10:56:38 2
  • 355 # from zsh-users 356 edit_command_line () { 357 # edit current line in $EDITOR 358 local tmpfile=${TMPPREFIX:-/tmp/zsh}ecl$$ 359 360 print -R - "$PREBUFFER$BUFFER" >$tmpfile 361 exec 362 ${VISUAL:-${EDITOR:-vi}} $tmpfile 363 zle kill-buffer 364 BUFFER=${"$( 365 CURSOR=$#BUFFER 366 367 command rm -f $tmpfile 368 zle redisplay 369 } 370 zle -N edit_command_line

    zsh$ M-v
    bucciarati · 2009-11-10 23:02:56 0
  • the last person who posted used the most roundabout way to concatinate files, there's a reason there's a "conCATinate" command... Using this method, you also get to choose the order of the files, below another person just did *.txt > combined.txt which is fine but the order depends on the implementation of "cat" which is probably alphabetical order of filenames. Show Sample Output

    cat file1 ... fileN > combinedFile;
    GinoMan2440 · 2010-04-17 01:00:04 1
  • indenting all the files at a time, if the file has local variable for indentation style its even better. This one liner is not pretty but it does the job.

    lst=`find . -iname \*.c -or -iname \*.h`; for i in $lst; do emacs -nw -q $i --eval "(mark-whole-buffer)" --eval "(indent-region (point-min) (point-max) nil)" --eval "(save-buffer)" --kill; done
    JollyJumper · 2010-09-09 22:02:54 0

What Others Think

holy !@#$
linuxrawkstar · 464 weeks ago
debian/ubuntu moreutils has "sponge" which does what I think you're getting at: sed '...' file | grep '...' | sponge file
eichin · 464 weeks ago
Perl can do that fine too, if we just want to use a replacement: echo "zbc" > file.txt perl -pi -e 's/z/a/g' file.txt cat text.txt abc
Blackbit · 463 weeks and 5 days ago

What do you think?

Any thoughts on this command? Does it work on your machine? Can you do the same thing with only 14 characters?

You must be signed in to comment.

What's this?

commandlinefu.com is the place to record those command-line gems that you return to again and again. That way others can gain from your CLI wisdom and you from theirs too. All commands can be commented on, discussed and voted up or down.

Share Your Commands

Stay in the loop…

Follow the Tweets.

Every new command is wrapped in a tweet and posted to Twitter. Following the stream is a great way of staying abreast of the latest commands. For the more discerning, there are Twitter accounts for commands that get a minimum of 3 and 10 votes - that way only the great commands get tweeted.

» http://twitter.com/commandlinefu
» http://twitter.com/commandlinefu3
» http://twitter.com/commandlinefu10

Subscribe to the feeds.

Use your favourite RSS aggregator to stay in touch with the latest commands. There are feeds mirroring the 3 Twitter streams as well as for virtually every other subset (users, tags, functions,…):

Subscribe to the feed for: