a shell function to print a ruler the width of the terminal window.

ruler() { for s in '....^....|' '1234567890'; do w=${#s}; str=$( for (( i=1; $i<=$(( ($COLUMNS + $w) / $w )) ; i=$i+1 )); do echo -n $s; done ); str=$(echo $str | cut -c -$COLUMNS) ; echo $str; done; }

By: bartonski
2010-01-28 19:25:25

1 Alternatives + Submit Alt

What Others Think

linuxrawkstar · 589 weeks and 2 days ago
? If a take a real ruler, that doesn't match the result of the shell output...
sputnick · 589 weeks and 2 days ago
This is a little shorter, but it doesn't work on zsh: ruler(){ for s in '....^....|' '1234567890';do unset str;while [ ${#str} -lt $COLUMNS ];do str=$str$s;done;echo ${str:0:$COLUMNS};done;} I think this method is kind of interesting too: ruler(){ for s in '....^....|' '1234567890';do str=$(printf "%$((COLUMNS))s"|sed 's/./'$s'/g');echo ${str:0:$COLUMNS};done;}
eightmillion · 589 weeks and 2 days ago
This is a fun command to play around with. Thanks for submitting it. This version numbers the fields like a ruler: ruler(){ local c;for s in '...^^^...|' '1234567890';do unset str;while [ ${#str} -lt $COLUMNS ];do str=${str/^^^/$(printf "%.3d" $c)}$s;c=$[c+1];done;echo ${str:0:$COLUMNS};done;}
eightmillion · 589 weeks and 2 days ago
Thanks, eightmillion. I was trying to figure out a way to number the ruler. I wrote a version of this in perl that will do just that. The perl version actually puts the tens digit where the pipe symbol goes: ....^....1....^....2....^....3 123456789012345678901234567890 I figure that anyone can figure out which hundred they're in, so having the marks accurate to the 10s digit is sufficient... I can grab that by dividing and modding the number by 10. I'll play around with that this weekend. Sputnick -- the idea here is not to create a ruler to measure in inches or centimeters, but rather to measure by characters on the screen. Handy when you're trying to figure out where the start and end positions are for 'cut' for example. FWIW, I believe that there are a couple of generators out there for PostScript rulers and PostScript graph paper. As long as you print these out on a printer which does not scale the image, you will come out with something that you can use to measure in inches or cm.
bartonski · 589 weeks and 1 day ago
irg. got the code tags wrong on the ruler. That should have looked like this: ....^....1....^....2....^....3 123456789012345678901234567890
bartonski · 589 weeks and 1 day ago
sigh. ....^....1....^....2....^....3 123456789012345678901234567890
bartonski · 589 weeks and 1 day ago
@eightmillion: for zsh, change the echo to: echo ${str[1,$COLUMNS]}
dennisw · 589 weeks ago
@eightmillion: your field numbering version sometimes misses the last one. Adding ten to the number of columns in the while statement fixes that. Here's one way to do it: while (( ${#str} < $COLUMNS + 10 ))
dennisw · 589 weeks ago
@bartonski: Here's a version of eightmillion's version that does what your Perl version does: ruler(){ local c;for s in '....^....|' '1234567890';do unset str;while (( ${#str} < $COLUMNS + 10 ));do str=${str/|/$(printf "%d" $c)}$s;((c=(c+1)%10));done;echo ${str:0:$COLUMNS};done;} @eightmillion: You're right, it is fun.
dennisw · 589 weeks 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: