Showing posts with label fish. Show all posts
Showing posts with label fish. Show all posts

Monday, April 18, 2011

Linux: Fish Hanging

fish is a "user friendly command line shell for UNIX-like operating systems such as Linux." I've been using fish for about a year, and I really like it. Unfortunately, until recently, I had a problem that I couldn't log into virtual consoles in Linux. If I hit Cntl-Alt-F1 and tried to log in, fish would just hang. This was mentioned on the mailing list a long time ago. I'm pleased to say that I finally solved the problem.

I had the following code in my ~/.config/fish/config.fish:
type fortune > /dev/null
and begin
fortune
echo
end
Basically, this code says, "If fortune exists, run it. Otherwise, don't complain." I figured out through a process of elimination that was the culprit. I replaced it with:
if status --is-interactive
fortune
echo
end
This code will result in an error if fortune doesn't exist, but it won't die. It turns out to be fine for me since I only run fish on my laptop, and I usually install fortune at the same time I install fish.

Linux: ^\

Am I the only one who didn't know that you could use ^\ (i.e. control backslash) to kill a process when ^c doesn't work? Usually, I have to use ^z to background the process, and then type kill -9 %1. I think ^\ makes the process dump core, but since dumping core seems to be turned off by default, it works out well. Here's an example of my killing a process under fish (my shell):
fish: Job 1, “nosetests” terminated by signal SIGQUIT (Quit request from job control with core dump (^\))
Thanks to Jeff Lindsay for the tip.

Tuesday, May 04, 2010

Linux: fish: The Friendly, Interactive Shell

I'm trying out a new shell called fish. Here are some screen shots and here is a great article to help you get started.

Usually, I'm a zsh user. fish aims to be as powerful as, say, zsh, but a heck of a lot easier to use and a lot easier to learn. So far, that's proven true. The shell provides intelligent tab completion, syntax highlighting, helpful error reporting, integrated documentation, etc.

Fish is inspired by Bourne shell syntax, but is not compatible with it. Specifically, a lot of ugly things have been cleaned up and made more regular. I do think that the syntax is nicer, although it takes a while to get the hang of if you're already a shell expert. About the only inconvenient part of switching to fish is that I can no longer copy and paste complicated bash one-liners from various places online.

The documentation is excellent. However, you might find this cheat sheet helpful for getting started:
help:
: Get help with using fish.
Searching through history:
: Type in the search string, and press the up arrow.
open FILENAME
: Open a file using the proper application.
if true; echo hello; end
for i in a b c; echo $i; end
switch $you; case '*'; echo hi; end
function hi; echo hello; end
rm $file:
: You don't have to quote $file, even if it has spaces.
quoting:
: Double quotes do variable substitution. Single quotes don't.
: Nesting doubles in singles or singles in doubles doesn't hurt
: anything. Both forms allow a minimal escaping, such as \', \\,
: or \$.
set smurf blue
: This is variable assignment. They didn't use the "=" syntax
: because in fish, *everything* is a command. Use -e to erase a
: variable, -l to set a variable locally, -g to set a variable
: globally, and -u to set a variable universally. Setting a
: variable universally applies to all fish sessions and will
: even survive a reboot. Use -x when setting a variable to export
: the value of that variable. It is convention that exported
: variables are in uppercase and unexported variables are in
: lowercase.
eval COMMAND
echo (ls)
: Use parenthesis for subshells.
f1; and f2
: This is like f1 && f2 in bash.
ls **.as
: Find all the .as files recursively.
^FILE
: Redirect standard error to a file. ^^ is used for appending to
: a file.
function ll; ls -l $argv; end
: This is the replacement for aliasing and "$@".
$status
: This is $! in bash.
~/.config/fish/functions
: This is the directory for all your functions. They must use a
: .fish extension.
echo input.{c,h,txt}
: Echoes: input.c input.h input.txt
echo {$USER}meister
Arrays:
for i in (seq 10); echo $i; end
: Counts to 10. Actually, so does "seq 10" ;)
set my_array a b c; echo $my_array[1]
: Prints "a". Note, arrays are 1-based, just like seq.
count $my_array
: Returns the number of items in the array.
for i in (seq (count $my_array)); echo $my_array[$i]; end
: Here's how to loop over an array.
for i in $PATH; echo $i; end
: This is the easier way to loop over an array.
The startup file is ~/.config/fish/config.fish.
alt-l
: Quickly lists the current directory, or the directory your
: cursor is over.
alt-p
: Adds "| less". Think "pager".
Fish supports even more Emacs-like commands--even a killring.