csh - C Shell¶
Die C Shell (csh) ist eine Unix Shell, die von Bill Joy an der University of California, Berkeley entwickelt wurde. Entwickelt, um eine C-ähnliche Syntax für den interaktiven Einsatz bereitzustellen, stellte csh viele Features vor, die in späteren Shells Standard wurden, einschließlich Befehlshistorie, Aliases und Job Control. Während csh und seine erweiterte Version tcsh in erster Linie für interaktive Sitzungen verwendet werden, anstatt Scripting, bleiben sie in bestimmten Unix-Umgebungen wichtig und bieten einzigartige Features, die einige Benutzer bevorzugen. csh zu verstehen ist wertvoll für Systemadministratoren und Benutzer, die es in Legacy-Systemen oder spezifischen Unix-Vertrieben begegnen.
Installation und Inbetriebnahme¶
C Shell Varianten¶
```bash
Check which csh variant is available¶
which csh /bin/csh
which tcsh /usr/bin/tcsh
Check shell version¶
echo $version
tcsh 6.22.04 (Astron) 2021-04-26 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,color,filec¶
Check if running csh or tcsh¶
echo $shell /bin/tcsh ```_
Installation von C Shell¶
```bash
Ubuntu/Debian¶
sudo apt update && sudo apt install csh tcsh
CentOS/RHEL/Fedora¶
sudo dnf install tcsh
macOS (tcsh is usually pre-installed)¶
For csh specifically:¶
brew install tcsh
Arch Linux¶
sudo pacman -S tcsh
FreeBSD (usually pre-installed)¶
pkg install tcsh
Check installation¶
csh --version tcsh --version ```_
csh/tcsh als Standard Shell einstellen¶
```bash
Check current shell¶
echo $SHELL
Add csh to available shells¶
echo /bin/csh|sudo tee -a /etc/shells echo /bin/tcsh|sudo tee -a /etc/shells
Set tcsh as default shell (recommended over csh)¶
chsh -s /bin/tcsh
Verify change (restart terminal)¶
echo $SHELL /bin/tcsh ```_
Grundkonfigurationsdateien¶
```bash
Configuration files for csh/tcsh¶
~/.cshrc # Main configuration file ~/.tcshrc # tcsh-specific configuration ~/.login # Login shell configuration ~/.logout # Logout script
Create basic .tcshrc¶
cat > ~/.tcshrc ``<< 'EOF'
tcsh configuration¶
Set environment variables¶
setenv EDITOR vi setenv PAGER less setenv LANG en_US.UTF-8
Set path¶
set path = (/usr/local/bin /usr/bin /bin $path)
Aliases¶
alias ll 'ls -l' alias la 'ls -la' alias h 'history' alias .. 'cd ..'
Prompt¶
set prompt = '%n@%m:%c$ '
History¶
set history = 1000 set savehist = 1000
Completion¶
set autolist set complete = enhance
Other options¶
set noclobber set notify EOF
Source configuration¶
source ~/.tcshrc ```_
C Shell Syntax und Variablen¶
Variable Zuordnung und Nutzung¶
```bash
Simple variable assignment¶
set name = "John Doe" set age = 30 set path_var = "/home/user"
Using variables¶
echo $name echo "Hello, $name" echo 'Literal: $name' # Single quotes prevent expansion
Array variables¶
set fruits = (apple banana orange) set numbers = (1 2 3 4 5)
Accessing array elements¶
echo $fruits[1] # First element (1-indexed) echo $fruits[2] # Second element echo \(fruits[\)#fruits] # Last element echo $fruits[*] # All elements echo $#fruits # Number of elements
Environment variables¶
setenv PATH "/usr/local/bin:$PATH" setenv EDITOR vi setenv HOME /home/user
Unset variables¶
unset name unsetenv PATH # Dangerous!
Special variables¶
echo $0 # Shell name echo $ # Process ID echo $? # Exit status of last command echo $#argv # Number of arguments echo $argv[*] # All arguments ```_
String Operations¶
```bash
String concatenation¶
set first = "Hello" set second = "World" set combined = "$first, $second!" echo $combined # Hello, World!
String length (tcsh)¶
set string = "Hello, World!" echo $%string # Length: 13
Substring operations (limited in csh)¶
set filename = "document.txt" set basename = $filename:r # Remove extension: document set extension = $filename:e # Get extension: txt set dirname = $filename:h # Get directory (if path) set tail = $filename:t # Get filename (if path)
Case conversion (tcsh)¶
set upper = $string:u # Uppercase set lower = $string:l # Lowercase ```_
Kommando Substitution¶
```bash
Command substitution using backticks¶
set current_date = date
set file_count = ls|wc -l
set user_home = eval echo ~$USER
Using command substitution in expressions¶
echo "Today is date +%A
"
set files = (ls *.txt
)
Nested command substitution¶
set day_of_week = date +%A
echo "Today is $day_of_week, date +%B
date +%d
"
```_
Kontrollstrukturen¶
Bedingte Aussagen¶
```bash
if-then-else¶
if (\(age >`` 18) then echo "Adult" else if (\)age == 18) then echo "Just turned adult" else echo "Minor" endif
String comparisons¶
if ("$name" == "John") then echo "Hello John" endif
if ("$name" != "John") then echo "Not John" endif
File tests¶
if (-f "file.txt") then echo "File exists" endif
if (-d "directory") then echo "Directory exists" endif
if (-r "file.txt") then echo "File is readable" endif
if (-w "file.txt") then echo "File is writable" endif
if (-x "script.sh") then echo "File is executable" endif
Logical operators¶
if ($age > 18 && $age ``< 65) then echo "Working age" endif
if (\(status == 0||\)force == "true") then echo "Proceeding" endif
if (! -f "file.txt") then echo "File does not exist" endif ```_
Schaltaussagen¶
```bash
switch statement¶
switch ($variable) case pattern1: echo "Matched pattern1" breaksw case pattern2: case pattern3: echo "Matched pattern2 or pattern3" breaksw default: echo "No pattern matched" breaksw endsw
Switch with file extensions¶
switch ($filename) case *.txt: echo "Text file" breaksw case *.jpg: case *.png: case *.gif: echo "Image file" breaksw case *.sh: echo "Shell script" breaksw default: echo "Unknown file type" breaksw endsw ```_
Loops¶
```bash
foreach loop¶
foreach item (apple banana orange) echo "Fruit: $item" end
foreach with array variable¶
set files = (*.txt) foreach file ($files) echo "Processing: $file" end
foreach with command substitution¶
foreach user (cat users.txt
)
echo "User: $user"
end
while loop¶
set counter = 1 while ($counter <= 10) echo "Counter: $counter" @ counter++ end
while loop with file reading¶
set line = "" while (1) set line = \(< if (\)line == "") break echo "Line: $line" end
Nested loops¶
foreach dir (/usr /opt /var) foreach file ($dir/*) if (-f $file) then echo "File: $file" endif end end ```_
Arithmetische Operationen¶
Arithmetik mit @ Befehl¶
```bash
Basic arithmetic¶
@ result = 5 + 3 # 8 @ result = 10 - 4 # 6 @ result = 6 * 7 # 42 @ result = 20 / 4 # 5 @ result = 17 % 5 # 2 (modulo)
Arithmetic with variables¶
set num1 = 10 set num2 = 5 @ sum = $num1 + $num2 # 15 @ product = $num1 * $num2 # 50
Increment and decrement¶
set counter = 0 @ counter++ # Increment @ counter-- # Decrement @ counter += 5 # Add and assign @ counter -= 3 # Subtract and assign
Complex expressions¶
@ result = ($num1 + $num2) * 2 @ result = $num1 ** 2 # Exponentiation (tcsh)
Comparison operations¶
@ is_greater = ($num1 >`` \(num2) # Returns 1 if true, 0 if false if (\)is_greater) then echo "num1 is greater than num2" endif ```_
Externe Arithmetik Werkzeuge¶
```bash
Using expr for complex calculations¶
set result = expr 5 + 3
set result = expr $num1 \* $num2
# Note: * must be escaped
Using bc for floating point¶
set result = echo "scale=2; 10/3"|bc
set result = echo "scale=4; sqrt(16)"|bc -l
Using awk for calculations¶
set result = awk "BEGIN \\{print 10/3\\}"
```_
Alias und Geschichte¶
Alias Management¶
```bash
Simple aliases¶
alias ll 'ls -l' alias la 'ls -la' alias h 'history' alias .. 'cd ..' alias ... 'cd ../..'
Aliases with arguments¶
alias rm 'rm -i' # Interactive removal alias cp 'cp -i' # Interactive copy alias mv 'mv -i' # Interactive move
Complex aliases¶
alias lsd 'ls -l|grep "^d"' # List only directories alias psg 'ps aux|grep' # Process search
Conditional aliases¶
if (-f /usr/bin/vim) then alias vi vim endif
List aliases¶
alias # Show all aliases alias ll # Show specific alias
Remove aliases¶
unalias ll unalias * # Remove all aliases ```_
Geschichte Management¶
```bash
History configuration¶
set history = 1000 # Number of commands to remember set savehist = 1000 # Number of commands to save to file
History commands¶
history # Show all history history 10 # Show last 10 commands history -r # Read history from file history -w # Write history to file
History expansion¶
!! # Previous command !n # Command number n !string # Last command starting with string !?string # Last command containing string oldnew # Replace old with new in previous command
History modifiers¶
!:0 # Command name only !:1 # First argument !:$ # Last argument !:* # All arguments !:1-3 # Arguments 1 through 3
Examples¶
echo !$ # Echo last argument of previous command cp file.txt !$.bak # Copy file with .bak extension ```_
Job Control und Prozessmanagement¶
Job Control¶
```bash
Background jobs¶
command & # Run command 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
Job control signals¶
Ctrl+C: Interrupt (SIGINT)¶
Ctrl+Z: Suspend (SIGTSTP)¶
Ctrl+: Quit (SIGQUIT)¶
Process management¶
ps # Show current processes ps aux # Show all processes kill PID # Terminate process kill -9 PID # Force kill process killall process_name # Kill all processes by name
Nohup equivalent¶
nohup command & # Run command immune to hangups ```_
Informationen zum Thema¶
```bash
Process variables¶
echo $ # Current shell PID echo $! # PID of last background job
Process status¶
echo $? # Exit status of last command echo $status # Same as $? in csh
Wait for processes¶
wait # Wait for all background jobs wait %1 # Wait for specific job ```_
Eingabe/Ausgabe und Umleitung¶
Grund I/O Umleitung¶
```bash
Output redirection¶
command > file.txt # Redirect stdout to file command >> file.txt # Append stdout to file command >& file.txt # Redirect both stdout and stderr command >>& file.txt # Append both stdout and stderr
Input redirection¶
command < input.txt # Read input from file sort < unsorted.txt > sorted.txt
Pipes¶
ls -l|grep "txt" # Pipe output to grep ps aux|grep "process"|wc -l # Count matching processes
Here documents (limited support)¶
cat << EOF This is a here document Variables like $HOME are expanded EOF ```_
Erweiterte I/O-Funktionen¶
```bash
Noclobber option¶
set noclobber # Prevent overwriting files command >! file.txt # Force overwrite with noclobber set
Tee equivalent¶
command|tee file.txt # Write to file and stdout
Error redirection¶
command >& /dev/null # Redirect both stdout and stderr to null (command > output.txt) >& error.log # Separate stdout and stderr ```_
Integrierte Befehle und Funktionen¶
Wesentliche Einbauten¶
```bash
echo command¶
echo "Simple message" echo -n "No newline" # tcsh only
printf (tcsh only)¶
printf "%s: %d\n" "Count" 42 printf "%-10s %5d\n" "Name" 123
set and setenv¶
set var = value # Local variable setenv VAR value # Environment variable
which and where¶
which command # Show command location where command # Show all command locations (tcsh)
Directory operations¶
cd directory # Change directory pushd directory # Push directory onto stack popd # Pop directory from stack dirs # Show directory stack
File operations¶
ls -l # List files cp source dest # Copy files mv old new # Move/rename files rm file # Remove files mkdir directory # Create directory rmdir directory # Remove empty directory ```_
tcsh-Specific Features¶
```bash
Command completion¶
set complete = enhance # Enhanced completion set autolist # Automatically list completions
Spelling correction¶
set correct = cmd # Correct commands set correct = complete # Correct completions set correct = all # Correct everything
File completion¶
set filec # Enable filename completion
Auto-logout¶
set autologout = 60 # Auto-logout after 60 minutes
Watch for logins¶
set watch = (any any) # Watch for any user login set who = "%n has %a %l from %M at %t." # Login message format ```_
Konfiguration und Anpassung¶
Prompt Anpassung¶
```bash
Simple prompts¶
set prompt = '%n@%m:%c$ ' # user@host:dir$ set prompt = '% ' # Simple % set prompt = '! % ' # History number %
Prompt escape sequences¶
%n - Username¶
%m - Hostname¶
%c - Current directory (basename)¶
%C - Current directory (full path)¶
%/ - Current directory (full path)¶
%~ - Current directory (with ~ substitution)¶
%t - Time (12-hour)¶
%T - Time (24-hour)¶
%p - Time (AM/PM)¶
%d - Day of week¶
%D - Date¶
%w - Month¶
%W - Year¶
%! - History number¶
%# - # if root, % otherwise¶
Advanced prompt with colors (tcsh)¶
set prompt = '%\\{\033[1;32m%\\}%n@%m%\\{\033[0m%\\}:%\\{\033[1;34m%\\}%c%\\{\033[0m%\\}$ '
Multi-line prompt¶
set prompt = '%n@%m:%c\ $ '
Conditional prompt¶
if (\(uid == 0) then set prompt = 'root@%m:%c# ' else set prompt = '%n@%m:%c\) ' endif ```_
Umweltkonfiguration¶
```bash
Path management¶
set path = (/usr/local/bin /usr/bin /bin) set path = ($path /opt/bin) # Append to path
Environment variables¶
setenv EDITOR vi setenv PAGER less setenv BROWSER firefox setenv LANG en_US.UTF-8
Platform-specific configuration¶
switch (uname
)
case Linux:
setenv LS_COLORS 'di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30'
breaksw
case Darwin:
setenv LSCOLORS ExFxCxDxBxegedabagacad
breaksw
endsw
Conditional environment¶
if (-d "\(HOME/.local/bin") then set path = (\)HOME/.local/bin $path) endif
if ($?DISPLAY) then setenv BROWSER firefox else setenv BROWSER lynx endif ```_
Shell Optionen¶
```bash
Important shell options¶
set noclobber # Prevent file overwriting set notify # Report job status immediately set noglob # Disable filename expansion set ignoreeof # Don't exit on Ctrl+D
tcsh-specific options¶
set autolist # List completions automatically set complete = enhance # Enhanced completion set correct = cmd # Correct commands set filec # Filename completion set histdup = erase # Remove duplicate history entries set listjobs = long # Long format for job listing set rmstar # Ask before rm * ```_
Scripting Überlegungen¶
Schriftstruktur¶
```bash
!/bin/csh -f¶
Script description¶
Note: -f flag prevents reading .cshrc¶
Variable declarations¶
set script_name = $0:t set script_dir = $0:h set version = "1.0"
Function equivalent (using goto/label)¶
goto main
usage: echo "Usage: $script_name [options] [arguments]" echo "Options:" echo " -h Show this help" echo " -v Show version" exit 0
version: echo "$script_name version $version" exit 0
error: echo "Error: $error_msg" exit 1
main: # Parse arguments while (\(#argv > 0) switch (\)argv[1]) case -h: goto usage case -v: goto version case -*: set error_msg = "Unknown option: $argv[1]" goto error default: break endsw shift argv end
# Main script logic
echo "Script execution completed"
exit 0
```_
Best Practices für csh Scripts¶
```bash
Use tcsh instead of csh for scripts¶
!/bin/tcsh -f¶
Always use -f flag to avoid .cshrc interference¶
!/bin/csh -f¶
Error handling¶
set error_exit = 0 if (! -f "required_file.txt") then echo "Error: Required file not found" set error_exit = 1 endif
if ($error_exit) exit 1
Input validation¶
if ($#argv == 0) then echo "Error: No arguments provided" exit 1 endif
Safe variable usage¶
if ($?variable) then echo "Variable is set: $variable" else echo "Variable is not set" endif
Avoid complex scripting in csh¶
Use sh/bash for complex scripts¶
Use csh/tcsh primarily for interactive use¶
```_
Einschränkungen und Alternativen¶
Bekannte Einschränkungen¶
```bash
csh scripting limitations:¶
1. No functions (use goto/labels instead)¶
2. Limited error handling¶
3. No local variables in "functions"¶
4. Inconsistent syntax¶
5. Poor signal handling¶
Example of workaround for function-like behavior¶
goto main
"Function" using goto/label¶
process_file: set file = $1 if (-f $file) then echo "Processing $file" # Process file here else echo "File $file not found" endif goto return_point
main: set return_point = main_continue set argv[1] = "test.txt" goto process_file
main_continue: echo "Back in main" exit 0 ```_
Wann verwenden Sie csh/tcsh¶
```bash
Good for:¶
- Interactive shell use¶
- Simple automation tasks¶
- Users familiar with C-like syntax¶
- Legacy system compatibility¶
Not recommended for:¶
- Complex scripting (use bash/sh instead)¶
- Portable scripts¶
- Production automation¶
- Error-critical applications¶
Migration example from csh to bash¶
csh version:¶
if ($status == 0) then¶
echo "Success"¶
endif¶
bash equivalent:¶
if [ $? -eq 0 ]; then¶
echo "Success"¶
fi¶
```_
Interoperabilität¶
```bash
Running bash scripts from csh¶
bash script.sh
Converting csh variables for bash¶
setenv BASH_VAR $csh_var bash -c 'echo $BASH_VAR'
Calling csh from bash¶
csh -c 'echo $csh_variable'
Mixed environment¶
Use bash for scripting, csh for interactive¶
exec bash script.sh # Execute bash script exec tcsh # Return to tcsh ```_
Die C Shell und ihre erweiterte Version tcsh stellen ein wichtiges Kapitel in der Unix Shell Evolution dar und stellen viele Features vor, die in späteren Shells Standard wurden. Während csh wegen verschiedener Einschränkungen und Inkonsistenzen nicht für komplexe Skripte empfohlen wird, bleibt es für die interaktive Nutzung wertvoll, insbesondere für Nutzer, die ihre C-ähnliche Syntax und spezifische Funktionen bevorzugen. csh zu verstehen ist wichtig für Systemadministratoren, die es in Legacy-Systemen und für Benutzer, die seinen einzigartigen Ansatz zur Kommandozeilen-Interaktion zu schätzen wissen. Für moderne Shell-Skripting braucht man jedoch POSIX-konforme Shells wie Bash oder weitere fortgeschrittene Shells wie zsh.