Hacker News new | comments | show | ask | jobs | submit login
Top Ten One-Liners from CommandLineFu Explained (catonmat.net)
172 points by pkrumins 2863 days ago | hide | past | web | favorite | 23 comments

Last year a friend taught me about the bash trick "CTRL-R" <start typing 'ssh' or some other previously run command> on the command line for reverse history searching, and it is an amazing time saver. It acts as a great alternative to #8, "Find the last command that begins with “whatever,” but avoid running it"

$ !whatever:p

I use up-arrow for that. My .inputrc has:

    "\e[A": history-search-backward
If you don't type anything, it acts exactly as the old up-arrow.

Or in ~/.zshrc:

    bindkey '\e[A'  history-beginning-search-backward

An important addition to that is to repeatedly hit ctrl-r to cycle through the matching commands in the history.

How do you reverse the search? <S-C-R> didn't do it for me. Either way this could be a good substitute for what I do now, tediously grepping .zsh/bash_history...

If by reverse you mean going forward instead of backwards, that should be done with Ctrl-S; it does not work in Bash though, since Ctrl-S locks the scrolling of the terminal. I believe this behavior can be overridden, through some .xinputrc settings perhaps, but I haven't still found enough motivation to look it up!

edit: ok, I've found this: http://wiki.archlinux.org/index.php/Bash#History_search

I'm pretty I learned this from reading an article on HN... anyone got a citation for me?

Perhaps my article "The Definitive Guide to Bash History?"


#3. Save a file you edited in vim without the needed permissions

:w !sudo tee %

I've used vim for a long time, but didn't know about this one.

Of course it assumes sudo's present.

When I need to do number one -- add sudo to the previous command -- I just use the up arrow, Ctrl-a to get to the beginning of the line, and add sudo. It's a little slower than the method in the article, but I find it downright dangerous to have something in your command history that means "do whatever was typed previously as root".

It actually won't be in your command history as that. The entry will go into your command history as "sudo previous-line".Try it yourself:

  $ true
  $ echo !!
  echo true
  [up-arrow to see]
  $ echo true

Nice! Consider my objection withdrawn, and my compliments to the developers of bash.

I think in this case, the compliments should go to bill joy, the creator of csh.

Couple of little nits - 5. and 8. are not bash specific and neither are event designators, these work fine in tcsh and zsh. I think caret substitution might have actually come from the *csh world. Not that big of a deal since bash is so prevalent these days but hey, a pedantipoint is a pedantipoint.

Good points, I like being corrected where appropriate.

I'm always finding new places to use brace expansion. Recently I've starting doing

    diff longpath_andor_longfilename{a,b}*

On #10. Capture video of a linux desktop you suggest removing -r and using -b 250kbit/s. Did you try that? ;)

Is there a way to use a better codec?

Didn't try it. It actually turns out you need -r. Seems like an exception. I updated the article to reflect that. :)

The output codec? Use `-vcodec <format>`, where <format> is a video coded output by `ffmpeg -formats`.

Update: The whole comment about kbit/s was actually unnecessary, so I edited the article and replaced it with a better comment.

I should have mentioned the message in my comment, sorry about the wittyness. Thanks for updating!

Very helpful, thanks. To my tech. note list it goes!

neat. thanks for the explanations!

My favorite is the modifier for histories.

$ ls a b c

a b c

$ ls !$

ls c


$ ls a b c

a b c

$ ls !:3 !:2 !:1 !:0

ls c b a ls

ls: ls: No such file or directory

a b c


Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | DMCA | Apply to YC | Contact