Zum Inhalt

Fisch - Freundliche interaktive Shell

generieren

Fish (Freundlich Interactive Shell) ist eine intelligente und benutzerfreundliche Kommandozeilenhülle, die für interaktive Nutzung, Usability und Entdeckbarkeit konzipiert ist. Erstellt von Axel Liljencrantz im Jahr 2005, Fish nimmt eine andere Herangehensweise von traditionellen Shells, indem es Benutzererfahrung priorisiert und vernünftige Standardeinstellungen aus der Box. Im Gegensatz zu POSIX-konformen Schalen, Fisch verfügt über Syntax-Highlighting, Autovorschläge, Tab-Vervollständigungen, die ohne Konfiguration arbeiten, und eine saubere, moderne Syntax, die darauf abzielt, intuitiver und weniger fehleranfälliger als herkömmliche Shell-Sprachen zu sein.

Installation und Inbetriebnahme

Installation von Fish Shell

```fish

Ubuntu/Debian

sudo apt update && sudo apt install fish

CentOS/RHEL/Fedora

sudo dnf install fish

macOS (using Homebrew)

brew install fish

Arch Linux

sudo pacman -S fish

FreeBSD

pkg install fish

From source (latest version)

git clone https://github.com/fish-shell/fish-shell.git cd fish-shell cmake . make sudo make install ```_

Fish als Standard Shell

```fish

Check Fish installation

which fish /usr/bin/fish

Add Fish to available shells

echo /usr/bin/fish|sudo tee -a /etc/shells

Set Fish as default shell

chsh -s /usr/bin/fish

Verify change (restart terminal)

echo $SHELL ```_

Erst-Zeit-Setup

```fish

Start Fish shell

fish

Fish will create configuration directory automatically

~/.config/fish/

Run Fish configuration wizard

fish_config

This opens a web-based configuration interface

Accessible at http://localhost:8000

```_

Grundkonfiguration Struktur

```fish

Fish configuration files

~/.config/fish/config.fish # Main configuration file ~/.config/fish/functions/ # Custom functions directory ~/.config/fish/completions/ # Custom completions directory ~/.config/fish/conf.d/ # Additional configuration files

Create basic config.fish

mkdir -p ~/.config/fish cat > ~/.config/fish/config.fish << 'EOF'

Fish configuration

Set environment variables

set -gx EDITOR vim set -gx BROWSER firefox

Add to PATH

set -gx PATH $HOME/bin $PATH set -gx PATH $HOME/.local/bin $PATH

Aliases

alias ll 'ls -alF' alias la 'ls -A' alias l 'ls -CF'

Custom greeting

set fish_greeting "Welcome to Fish Shell!" EOF ```_

Fischsyntax und Spracheigenschaften

Variablen und Geltungsbereich

```fish

Variable assignment (no $ for assignment)

set name "John Doe" set age 30 set path "/home/user"

Using variables ($ required for expansion)

echo $name echo "Hello, $name" echo "Age: $age"

Variable scopes

set -l local_var "local" # Local to current scope set -g global_var "global" # Global to current session set -U universal_var "universal" # Universal across all sessions set -x exported_var "exported" # Exported to child processes

Multiple assignment

set fruits apple banana orange echo $fruits[1] # apple (1-indexed) echo $fruits[2] # banana echo $fruits[-1] # orange (last element)

Array operations

set fruits $fruits grape # Append set fruits[2] kiwi # Replace element set -e fruits[1] # Erase element ```_

Kommando Substitution

```fish

Command substitution using parentheses

set current_date (date) set file_count (ls|wc -l) set user_home (eval echo ~$USER)

Nested command substitution

echo "Today is "(date +%A)", "(date +%B)" "(date +%d)

Store command output in variable

set git_branch (git branch --show-current 2>/dev/null) if test -n "$git_branch" echo "Current branch: $git_branch" end ```_

String Manipulation

```fish

String operations

set string "Hello, World!" echo (string length "$string") # String length echo (string sub -s 1 -l 5 "$string") # Substring (Hello) echo (string replace "Hello" "Hi" "$string") # Replace echo (string upper "$string") # Uppercase echo (string lower "$string") # Lowercase

String splitting and joining

set words (string split " " "$string") echo $words[1] # Hello, set rejoined (string join "-" $words) echo $rejoined # Hello,-World!

Pattern matching

if string match -q "Hello*" "$string" echo "String starts with Hello" end

Regular expressions

if string match -qr "W\w+d" "$string" echo "String contains word starting with W and ending with d" end ```_

Bedingte Aussagen

```fish

if-then-else

if test $age -gt 18 echo "Adult" else if test $age -eq 18 echo "Just turned adult" else echo "Minor" end

Test conditions

if test -f "file.txt" # File exists echo "File exists" end

if test -d "directory" # Directory exists echo "Directory exists" end

if test "$var" = "value" # String equality echo "Variable equals value" end

if test $num -eq 10 # Numeric equality echo "Number is 10" end

Logical operators

if test $age -gt 18; and test $age -lt 65 echo "Working age" end

if test $status -eq 0; or test $force = "true" echo "Success or forced" end

if not test -f "file.txt" echo "File does not exist" end

Switch statement

switch $file_extension case "txt" echo "Text file" case "jpg" "png" "gif" echo "Image file" case "*" echo "Unknown file type" end ```_

Loops und Iteration

```fish

for loop

for i in (seq 1 10) echo "Number: $i" end

for file in *.txt echo "Processing: $file" end

for item in $array echo "Item: $item" end

while loop

set counter 1 while test $counter -le 10 echo "Counter: $counter" set counter (math $counter + 1) end

Loop control

for i in (seq 1 10) if test $i -eq 5 continue # Skip iteration end if test $i -eq 8 break # Exit loop end echo $i end ```_

Funktionen und Skripten

Beschreibung der Funktion

```fish

Basic function

function greet echo "Hello, $argv[1]!" end

Function with description

function greet --description "Greet a user" echo "Hello, $argv[1]!" end

Function with argument validation

function calculate_sum --description "Calculate sum of two numbers" if test (count $argv) -ne 2 echo "Usage: calculate_sum " return 1 end

math $argv[1] + $argv[2]

end

Function with local variables

function process_file --description "Process a file" set -l filename $argv[1] set -l line_count (wc -l < "$filename") echo "File $filename has $line_count lines" end ```_

Erweiterte Funktionen

```fish

Function with options

function my_ls --description "Enhanced ls with options" argparse 'l/long' 'a/all' 'h/help' -- $argv or return

if set -q _flag_help

| echo "Usage: my_ls [-l | --long] [-a | --all] [directory]" | return end

set -l ls_args
if set -q _flag_long
    set ls_args $ls_args -l
end
if set -q _flag_all
    set ls_args $ls_args -a
end

ls $ls_args $argv

end

Function with completion

function mycommand --description "Custom command with completion" switch $argv[1] case "start" echo "Starting service" case "stop" echo "Stopping service" case "status" echo "Service status" case "*" | echo "Usage: mycommand \\{start | stop | status\\}" | end end

Save function permanently

funcsave greet funcsave calculate_sum ```_

Fehlerbehebung

```fish

Function with error handling

function safe_copy --description "Safe file copy with error handling" if test (count $argv) -ne 2 echo "Error: Exactly two arguments required" >&2 return 1 end

set -l source $argv[1]
set -l dest $argv[2]

if not test -f "$source"
    echo "Error: Source file '$source' does not exist" >&2
    return 1
end

if test -f "$dest"
    echo "Warning: Destination file '$dest' already exists"
    read -P "Overwrite? (y/N): " -l confirm
    if test "$confirm" != "y"
        echo "Copy cancelled"
        return 1
    end
end

if cp "$source" "$dest"
    echo "Successfully copied '$source' to '$dest'"
else
    echo "Error: Failed to copy file" >&2
    return 1
end

end ```_

Interaktive Funktionen

Autosuggestions

```fish

Autosuggestions are enabled by default

Type a command and Fish will suggest completions based on:

- Command history

- Valid file paths

- Command completions

Accept suggestion: Right arrow or Ctrl+F

Accept single word: Alt+Right arrow or Alt+F

Dismiss suggestion: Escape

Configure autosuggestion color

set -g fish_color_autosuggestion 555 ```_

Tab Fertigkeiten

```fish

Tab completions work automatically for:

- Commands in PATH

- File and directory names

- Command-specific options and arguments

Custom completion for your function

complete -c mycommand -a "start stop status restart" -d "Service commands" complete -c mycommand -s h -l help -d "Show help" complete -c mycommand -s v -l verbose -d "Verbose output"

File-based completion

complete -c myapp -a "(__fish_complete_suffix .conf)" -d "Configuration files"

Conditional completion

complete -c git -n "__fish_git_needs_command" -a "add commit push pull" complete -c git -n "__fish_git_using_command add" -a "(__fish_git_modified_files)" ```_

Syntax Highlights

```fish

Syntax highlighting is automatic and includes:

- Valid/invalid commands (green/red)

- Strings and quotes

- Variables and expansions

- Comments

Customize syntax highlighting colors

set -g fish_color_command blue set -g fish_color_param cyan set -g fish_color_redirection yellow set -g fish_color_comment brblack set -g fish_color_error red set -g fish_color_escape bryellow set -g fish_color_operator green set -g fish_color_quote yellow set -g fish_color_valid_path --underline ```_

Geschichte und Suche

```fish

History search (automatic)

Type partial command and use Up/Down arrows

History search with specific text

Type text and press Ctrl+R for reverse search

History commands

history # Show all history history search "git" # Search history for "git" history delete --prefix "rm" # Delete commands starting with "rm" history clear # Clear all history

Configure history

set -g fish_history_max 10000 # Maximum history entries ```_

Konfiguration und Anpassung

Umweltvariablen

```fish

Set environment variables

set -gx EDITOR vim set -gx BROWSER firefox set -gx PAGER less

PATH manipulation

set -gx PATH $HOME/bin $PATH set -gx PATH $HOME/.local/bin $PATH set -gx PATH /usr/local/bin $PATH

Remove from PATH

set -l index (contains -i /unwanted/path $PATH) if test $index -gt 0 set -e PATH[$index] end

Conditional environment variables

if test -d "$HOME/.cargo/bin" set -gx PATH $HOME/.cargo/bin $PATH end

Platform-specific variables

switch (uname) case Darwin set -gx HOMEBREW_PREFIX /opt/homebrew case Linux set -gx XDG_CONFIG_HOME $HOME/.config end ```_

Alias und Abkürzungen

```fish

Aliases (expanded when defined)

alias ll 'ls -alF' alias la 'ls -A' alias l 'ls -CF' alias grep 'grep --color=auto'

Abbreviations (expanded when typed)

abbr -a g git abbr -a gc 'git commit' abbr -a gp 'git push' abbr -a gl 'git log --oneline' abbr -a gst 'git status'

Conditional abbreviations

if command -v docker >/dev/null abbr -a d docker abbr -a dc 'docker-compose' abbr -a dps 'docker ps' end

List and manage abbreviations

abbr -l # List all abbreviations abbr -e gc # Erase abbreviation ```_

Prompt Anpassung

```fish

Simple prompt function

function fish_prompt set_color green echo -n (whoami) set_color normal echo -n "@" set_color blue echo -n (hostname) set_color normal echo -n ":" set_color yellow echo -n (prompt_pwd) set_color normal echo -n "\$ " end

Advanced prompt with Git integration

function fish_prompt set -l last_status $status

# User and host
set_color green
echo -n (whoami)
set_color normal
echo -n "@"
set_color blue
echo -n (hostname)
set_color normal

# Current directory
echo -n ":"
set_color yellow
echo -n (prompt_pwd)
set_color normal

# Git information
if git rev-parse --git-dir >/dev/null 2>&1
    set -l branch (git branch --show-current 2>/dev/null)
    if test -n "$branch"
        echo -n " ("
        set_color cyan
        echo -n "$branch"
        set_color normal

        # Check for changes
        if not git diff --quiet 2>/dev/null
            set_color red
            echo -n "*"
            set_color normal
        end
        echo -n ")"
    end
end

# Prompt symbol based on last command status
if test $last_status -eq 0
    set_color green
    echo -n " ❯ "
else
    set_color red
    echo -n " ❯ "
end
set_color normal

end

Right prompt

function fish_right_prompt set_color brblack echo -n (date "+%H:%M:%S") set_color normal end ```_

Thema und Farbkonfiguration

```fish

Use fish_config for GUI configuration

fish_config

Or set colors manually

set -g fish_color_normal normal set -g fish_color_command blue set -g fish_color_quote yellow set -g fish_color_redirection cyan set -g fish_color_end green set -g fish_color_error red set -g fish_color_param cyan set -g fish_color_comment brblack set -g fish_color_match --background=brblue set -g fish_color_selection white --bold --background=brblack set -g fish_color_search_match bryellow --background=brblack set -g fish_color_history_current --bold set -g fish_color_operator green set -g fish_color_escape bryellow set -g fish_color_cwd green set -g fish_color_cwd_root red set -g fish_color_valid_path --underline set -g fish_color_autosuggestion 555 set -g fish_color_user brgreen set -g fish_color_host normal set -g fish_color_cancel -r set -g fish_pager_color_completion normal set -g fish_pager_color_description B3A06D yellow set -g fish_pager_color_prefix white --bold --underline set -g fish_pager_color_progress brwhite --background=cyan ```_

Paketverwaltung und Plugins

Fisher Plugin Manager

```fish

Install Fisher

curl -sL https://git.io/fisher|source && fisher install jorgebucaran/fisher

Install plugins

fisher install jorgebucaran/nvm.fish fisher install PatrickF1/fzf.fish fisher install franciscolourenco/done fisher install jethrokuan/z

List installed plugins

fisher list

Update plugins

fisher update

Remove plugin

fisher remove jorgebucaran/nvm.fish ```_

Beliebte Fisch Plugins

```fish

z - Directory jumping

fisher install jethrokuan/z

Usage: z partial_directory_name

fzf integration

fisher install PatrickF1/fzf.fish

Provides Ctrl+R for history search, Ctrl+Alt+F for file search

done - Desktop notifications

fisher install franciscolourenco/done

Notifies when long-running commands complete

nvm for Node.js

fisher install jorgebucaran/nvm.fish nvm install node nvm use node

autopair - Automatic bracket pairing

fisher install jorgebucaran/autopair.fish

bass - Run Bash utilities in Fish

fisher install edc/bass bass source ~/.bashrc ```_

Manuelle Plugin Installation

```fish

Create functions directory

mkdir -p ~/.config/fish/functions

Download and install plugin manually

curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher

Install from local directory

git clone https://github.com/user/plugin.git cp plugin/*.fish ~/.config/fish/functions/ ```_

Erweiterte Funktionen und Tipps

Mathematik

```fish

Math command for calculations

math 5 + 3 # 8 math 10 * 2 # 20 (escape * in some contexts) math "10 * 2" # 20 math 20 / 4 # 5 math 17 % 5 # 2

Math with variables

set num1 10 set num2 5 math $num1 + $num2 # 15

Advanced math functions

math "sqrt(16)" # 4 math "sin(3.14159/2)" # 1 math "log(10)" # 2.30259 math "pow(2, 8)" # 256

Floating point precision

math -s2 10 / 3 # 3.33 (2 decimal places) ```_

Dateioperationen und Globbing

```fish

Basic globbing

ls .txt # All .txt files ls /.py # All .py files recursively ls file?.txt # file1.txt, file2.txt, etc.

Advanced globbing patterns

| ls *.(txt | md | rst) # Files with specific extensions | ls file[1-9].txt # file1.txt through file9.txt

File test operations

if test -f "file.txt" echo "File exists" end

if test -d "directory" echo "Directory exists" end

if test -x "script.sh" echo "File is executable" end

File manipulation

cp source.txt destination.txt mv old_name.txt new_name.txt rm unwanted_file.txt mkdir new_directory rmdir empty_directory ```_

Prozessmanagement

```fish

Background jobs

command & # Run in background jobs # List active jobs fg %1 # Bring job 1 to foreground bg %1 # Send job 1 to background kill %1 # Kill job 1

Process information

ps aux # List all processes pgrep firefox # Find process by name pkill firefox # Kill process by name

Disown processes

command & disown # Detach from shell ```_

Input/Output-Umleitung

```fish

Output redirection

command > file.txt # Redirect stdout to file command >> file.txt # Append stdout to file command 2> error.log # Redirect stderr to file command &> output.log # Redirect both stdout and stderr

Input redirection

command < input.txt # Read input from file

Pipes

ls -l|grep "txt" # Pipe output to grep | ps aux | grep "firefox" | wc -l # Count firefox processes |

Tee command

command|tee file.txt # Write to file and stdout ```_

Best Practices Scripting

Schriftstruktur

```fish

!/usr/bin/env fish

Script description

Author: Your Name

Date: YYYY-MM-DD

Function definitions

function usage echo "Usage: $argv[0]

function main # Parse arguments argparse 'h/help' 'v/verbose' -- $argv or return

if set -q _flag_help
    usage
    return 0
end

if set -q _flag_verbose
    set -g verbose true
end

# Main script logic here
echo "Script execution completed"

end

Call main function with all arguments

main $argv ```_

Fehlerbehebung

```fish

Check command success

if command_that_might_fail echo "Command succeeded" else echo "Command failed with status $status" exit 1 end

Validate arguments

function validate_file set -l file $argv[1] if not test -f "$file" echo "Error: File '$file' does not exist" >&2 return 1 end return 0 end

Use in script

if not validate_file "important.txt" exit 1 end ```_

Leistungsbetrachtungen

```fish

Use built-in string operations instead of external commands

set result (string replace "old" "new" $text) # Instead of sed set length (string length $text) # Instead of wc

Avoid unnecessary command substitutions

if test -f "file.txt" # Instead of if test (ls file.txt) echo "File exists" end

Use arrays efficiently

set files .txt for file in $files # Instead of for file in (ls .txt) process_file $file end ```_

Debugging und Fehlerbehebung

Debug Mode

```fish

Run script with debug output

fish -d 3 script.fish

Enable debug in script

set fish_trace 1

Your commands here

set fish_trace 0

Function debugging

function debug_function echo "Function called with arguments: $argv" >&2 echo "Current directory: "(pwd) >&2 echo "Status: $status" >&2 end ```_

Gemeinsame Themen und Lösungen

```fish

Issue: Command not found

Solution: Check PATH and command existence

if not command -v mycommand >/dev/null echo "mycommand is not installed or not in PATH" exit 1 end

Issue: Variable not expanding

Solution: Use proper Fish syntax

set var "value" echo $var # Correct echo "$var" # Also correct echo '$var' # Wrong - literal string

Issue: Function not found

Solution: Check function definition and loading

functions myfunction # Check if function exists funcsave myfunction # Save function permanently ```_

Leistungsprofil

```fish

Time command execution

time command

Profile function execution

function profile_function set -l start_time (date +%s%N) your_function $argv set -l end_time (date +%s%N) set -l duration (math "($end_time - $start_time) / 1000000") echo "Function took $duration ms" end ```_

Fish Shell stellt eine Paradigmenverschiebung in der Shell-Design, Priorisierung der Benutzererfahrung und Entdeckbarkeit über strenge POSIX-Compliance. Seine intelligente Autovorschläge, Syntax-Highlighting und webbasierte Konfiguration machen es besonders attraktiv für Neuankömmlinge in der Kommandozeile, während seine leistungsstarken Skripting-Funktionen und umfangreiches Plugin-Ökosystem den Bedürfnissen von fortgeschrittenen Benutzern gerecht werden. Obwohl seine unterschiedliche Syntax einige Anpassungen für Benutzer erfordert, die von traditionellen Shells kommen, macht Fish den Fokus darauf, hilfreich und intuitiv zu sein, eine ausgezeichnete Wahl für interaktive Shell-Nutzung und moderne Entwicklungs-Workflows.