Administration
  Home arrow Administration arrow Page 4 - Personalizing the User Environment in ...
Dev Shed Forums 
Administration  
Apache  
BrainDump  
DHTML  
Flash  
Java  
JavaScript  
Multimedia  
MySQL  
Oracle  
Perl  
PHP  
Practices  
Python  
Reviews  
Security  
Style-Sheets  
Web Services  
XML  
Zend  
Zope  
Forums Sitemap 
IBM® developerWorks 
Dedicated Servers 
E-Commerce Hosting 
Linux Web Hosting 
Managed Hosting 
Small Business Hosting 
Download TestComplete 
VPS Hosting 
Weekly Newsletter

 
Developer Updates  
Free Website Content 
eWeek
 RSS  Articles
 RSS  Forums
 RSS  All Feeds
Write For Us Get Paid 
Request Media Kit
Contact Us 
Site Map 
Privacy Policy 
Support 
 USERNAME
 
 PASSWORD
 
 
  >>> SIGN UP!  
  Lost Password? 
ADMINISTRATION

Personalizing the User Environment in BSD
By: O'Reilly Media
  • Search For More Articles!
  • Disclaimer
  • Author Terms
  • Rating: 5 stars5 stars5 stars5 stars5 stars / 5
    2006-12-14

    Table of Contents:
  • Personalizing the User Environment in BSD
  • Hack 6: Get Your Daily Dose of Trivia
  • Hack 7: Lock the Screen
  • Hack 8: Create a Trash Directory

  • Rate this Article: Poor Best 
      ADD THIS ARTICLE TO:
      Del.ici.ous Digg
      Blink Simpy
      Google Spurl
      Y! MyWeb Furl
    Email Me Similar Content When Posted
    Add Developer Shed Article Feed To Your Site
    Email Article To Friend
    Print Version Of Article
    PDF Version Of Article
     
     
     
    ADVERTISEMENT

    Ziff Davis Enterprise Virtual Tradeshows: Hot Topics, Cutting Edge Technology, Real-time Networking among IT Professionals. Learn more

    Personalizing the User Environment in BSD - Hack 8: Create a Trash Directory
    (Page 4 of 4 )

    Save “deleted” files until you’re really ready to send them to the bit bucket.

    One of the first things Unix users learn is that deleted files are really, really gone. This is especially true at the command line where there isn’t any Windows-style recycling bin to rummage through should you have a change of heart regarding the fate of a removed file. It’s off to the backups! (You do have backups, don’t you?)

    Fortunately, it is very simple to hack a small script that will send removed files to a custom trash directory. If you’ve never written a script before, this is an excellent exercise in how easy and useful scripting can be.

    Shell Scripting for the Impatient

    Since a script is an executable file, you should place your scripts in a directory that is in your path. Remember, your path is just a list of directories where the shell will look for commands if you don’t give them full path-names. To see your path:

      % echo $PATH    
      PATH=
    /sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/ usr/local/sbin:/usr/ 
      local/bin:/usr/X11R6/bin:/home/dru/bin

    In this output, the shell will look for executables in the bin subdirectory ofdru’s home directory. However, it won’t look for executables placed directly in my home directory, or /home/dru. Since bin isn’t created by default, I should do that first:

      % cd
      %
    mkdir bin

    As I create scripts, I’ll store them in /home/dru/bin, since I don’t have permission to store them anywhere else. Fortunately, no one else has permission to store them in my bin directory, so it’s a good match.

    The scripts themselves contain at least three lines:

      #!/bin/sh
      # a comment explaining what the script does
      the command to be executed

    The first line indicates the type of script by specifying the program to use to execute the script. I’ve chosen to use a Bourne script because that shell is available on all Unix systems.

    Your script should also have comments, which start with the #character. It’s surprising how forgetful you can be six months down the road, especially if you create a lot of scripts. For this reason, you should also give the script a name that reminds you of what it does.

    The third and subsequent lines contain the meat of the script: the actual command(s) to execute. This can range from a simple one-liner to a more complex set of commands, variables, and conditions. Fortunately, we can make a trash script in a simple one-liner.

    The Code

    Let’s start with this variant, which I found as the result of a Google search:

      % more ~/bin/trash
      #!/bin/sh
      # script to send removed files to trash directory
      mv $1 ~/.trash/

    You should recognize the path to the Bourne shell, the comment, and themvcommand. Let’s take a look at that$1. This is known as a positional parameter and specifically refers to the first parameter of thetrashcommand. Since themvcommands takes filenames as parameters, the command:

      mv $1 ~/.trash/

    is really saying,mvthe first filename, whatever it happens to be, to a directory called .trash in the user’s home directory (represented by the shell shortcut of~). This move operation is our custom “recycle.”

    Before this script can do anything, it must be set as executable:

      % chmod +x ~/bin/trash

    And I must create that trash directory for it to use:

      % mkdir ~/.trash

    Note that I’ve chosen to create a hidden trash directory; any file or directory that begins with the . character is hidden from normal listings. This really only reduces clutter, though, as you can see these files by passing the -a switch to ls . If you also include theFswitch, directory names will end with a /:

      % ls -aF ~
      .cshrc     .history   .trash/
      bin/       images/    myfile

    Replacing rm with ~/bin/trash

    Now comes the neat part of the hack. I want this script to kick in every time I userm. Since it is the shell that executes commands, I simply need to make my shell use thetrashcommand instead. I do that by adding this line to ~/.cshrc:

      alias rm    trash

    That line basically says: when I typerm, executetrashinstead. It doesn’t matter which directory I am in. As long as I stay in my shell, it willmvany files I try tormto my hidden trash directory.

    Running the Code Safely

    Whenever you create a script, always test it first. I’ll start by telling my shell to reread its configuration file:

      % source ~/.cshrc

    Then, I’ll make some test files to remove:

      % cd
     
    % mkdir test
      % cd test
      % touch test1
     
    %
    rm test1
      % ls ~/.trash
      test1 

    Looks like the script is working. However, it has a flaw. Have you spotted it yet? If not, try this:

      % touch a aa aaa aaaa
     
    %
    rm a*
     
    % ls ~/.trash
      test1          a
     
    % ls test
     
    aa         aaa         aaaa

    What happened here? I passed the shell more than one parameter. The a* was expanded to a, aa,aaa, andaaaabefore trashcould execute. Those four parameters were then passed on to themvcommand in my script. However,trashpasses only the first parameter to themvcommand, ignoring the remaining parameters. Fortunately, they weren’t removed, but the script still didn’t achieve what I wanted.

    You can actually have up to nine parameters, named$1to$9. However, our goal is to catch all parameters, regardless of the amount. To do that, we use$@:

      mv $@ ~/.trash/

    Make that change to your script, then test it by removing multiple files. You should now have a script that works every time.

    Taking Out the Trash

    You should occasionally go through your trash directory and really remove the files you no longer want. If you’re really on your toes you may be thinking, “But how do I empty the trash directory?” If you do this:

    % rm ~/.trash/*

    your trash directory won’t lose any files! This time you really do want to use rm, not trash. To tell your shell to use the real rm command, simply put a\in front of it like so:

      % \rm /trash/*

    Voila, empty recycling bin.

    Hacking the Hack

    One obvious extension is to keep versioned backups. Use thedatecommand to find the time of deletion and append that to the name of the file in thetrashcommand. You could get infinitely more complicated by storing a limited number of versions or deleting all versions older than a week or a month. Of course, you could also keep your important files under version control and leave the complexity to someone else!

    Please check back next week for the conclusion of this article.


    DISCLAIMER: The content provided in this article is not warranted or guaranteed by Developer Shed, Inc. The content provided is intended for entertainment and/or educational purposes in order to introduce to the reader key ideas, concepts, and/or product reviews. As such it is incumbent upon the reader to employ real-world tactics for security and implementation of best practices. We are not liable for any negative consequences that may result from implementing any information covered in our articles or tutorials. If this is a hardware review, it is not recommended to open and/or modify your hardware.

       · This article is an excerpt from the book "BSD Hacks," published by O'Reilly. We hope...
     

    Buy this book now. This article is excerpted from chapter one of the book BSD Hacks, written by Dru Lavigne (O'Reilly, 2005; ISBN: 0596006799). Check it out today at your favorite bookstore. Buy this book now.

       

    ADMINISTRATION ARTICLES

    - Configuring Load-Balanced Clusters
    - Load-Balanced Clusters
    - UNIX Time Format Demystified
    - Making Changes in the CVS
    - Building Your First CVS Repository
    - CVS Quickstart Guide
    - Authorizing Users in Samba
    - Handling User Accounts in Samba
    - Authentication in Samba
    - Accounts, Authentication, and Authorization
    - Advanced Concepts on Dealing with Files and ...
    - Dealing with Files and Filesystems
    - More Hacks for the User Environment in BSD
    - Personalizing the User Environment in BSD
    - Customizing the User Environment in BSD

     
    Accelerating Trading Partner Performance
     
    Competing on Analytics
     
    Cost Effective Scaling with Virtualization and Coyote Point Systems
     
    Five Checkpoints to Implementing IP Telephony
     
    Hosted Email Security: Staying Ahead of New Threats
     




    © 2003-2008 by Developer Shed. All rights reserved. DS Cluster 2 hosted by Hostway