Useful unix tricks

written by paul on September 5th, 2007 @ 09:52 PM

Update (2/20/09): Check out Useful unix tricks – part 2 and Useful unix tricks – part 3

My current project uses macs for development and linux boxes for build and deployment. I also run linux on my personal computers, so I have learned the value of command line proficiency. Here are a few tricks that I think are worth sharing. I learned some of these on my own, and I picked up others while on this project.

Ctrl+r searches through history

Are you tired of using the up arrow to try to find old commands? Ctrl+r lets you search the history. Type Ctrl+r and start typing part of the old command. Pressing Ctrl+r again finds the next match. Once you find the one you like, just press enter to run it or the left or right arrows to modify it.

Use the history command plus !# to run old commands

Searching the history with Ctrl+r shows you old commands one at a time. Use the history command to see a list of them instead.

% history
    1  cd /tmp
    2  scp user@host:~/my_file .

Now, if you want to run one of those old commands, use !#. For example, to run the scp command again, type:

!2

Source command runs file in current shell

The source command is especially useful when shell config files have changed. For example:

% echo alias ls="ls -F" >> .zshrc
% source .zshrc

This will run the .zshrc file in the current shell. There is no need to open a new terminal to see the changes.

Launch a shell with sudo to run multiple commands

Update (2/16/08): Use “sudo -s” instead of “sudo bash” to start a shell as root.

If you have to run multiple commands with sudo, consider just running “sudo zsh” or “sudo bash” to start a shell as root. If you have sudo rights, but cannot sudo a shell, try this: Run “sudo vi” and then type :shell to open a shell within vi.

Shell expansion using {}

% echo a{a,b,c}
aa ab ac

The {} contain a comma separated list of expansions. One common use is to back up a file. For example, the command:

cp foo.sh foo.sh.old

can be rewritten as:

cp foo.sh{,.old}

zsh is a great shell

zsh is my favorite shell, and I don’t think most people understand how great it is. Here are a few things that it can do:

Tab completion is application specific. For example, type svn and then press tab:

% svn
add       cleanup   diff      info      merge     propedit  resolved  unlock
blame     commit    export    list      mkdir     propget   revert    update
cat       copy      help      lock      move      proplist  status
checkout  delete    import    log       propdel   propset   switch

zsh also tab completes options. For example, type mkdir – and then press tab:

% mkdir -
--context  -Z  -- set SELinux context
--help         -- display help information
--mode     -m  -- set permission mode
--parents  -p  -- make parent directories as needed
--verbose  -v  -- print message for each created directory
--version      -- display version information

These both work for many common programs. Just remember to put the following in your ~/.zshrc file:

autoload -U compinit
compinit

I also like changing my prompt to something that looks like

host:~/my/current/directory%
using the following lines in my .zshrc file:

export PS1="%m:%~%# " 

zsh adds a -D option to history to display how long each command took. This is helpful since I don’t have to remember to time my commands up front:

% history -D
    1  0:00  cd myproject
    2  0:07  rake test

The filename completion is also a little better than bash. Repeatedly pressing TAB will cycle through all completions.

Tab competion even works across scp/rsync/etc. For example, typing the first line and pressing tab will show all of the files that I can scp:

% scp paul@host:/etc/apache2/
README                 envvars                mods-enabled/          ssl/
apache2.conf           httpd.conf             ports.conf             svn-auth-file
apache2.conf.dpkg-old  magic                  sites-available/       webdav-auth-file
conf.d/                mods-available/        sites-enabled/

However, set up ssh keys before trying this trick unless you want zsh prompting for a password on each completion attempt.

Comments

  • Rakesh gupta on 28 Nov 13:37

    sudo bash sounds interesting, gonna try that.. thank you, Rakesh Gupta
  • Brad on 14 Feb 21:04

    try sudo -s instead of sudo bash
  • Peter on 03 Apr 20:19

    Unfortunately there is no audit trail or even history if you sudo bash or sudo -s. Only the sudo audit that says the user changed to bash.
  • noah on 09 Apr 08:01

    Thanks for your site that is promising to be learning ground for me. I have currently started learning Web page Design with simple HTML and CSS. I have tried to load my files to the internet but I could not. Pls All I need is to show me how to use the scp command in uploading webpages to the net. Thanks and God bless you Ps I know this is not the purpose for creating this comment space, but i haighly need your assistance.
  • Paul Gross on 09 Apr 19:59

    Noah, take a look at http://acs.ucsd.edu/info/scp.shtml.
  • Hates_ on 21 Feb 04:46

    Wow great tips. I never knew about the foo{,bar} one.

Post a comment

Options:

Size

Colors