csh - C Shell¶
# 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
```Der C Shell (csh) ist eine Unix-Shell, die von Bill Joy an der University of California, Berkeley entwickelt und erstmals 1978 veröffentlicht wurde. Entwickelt, um eine C-ähnlichere Syntax für interaktive Nutzung zu bieten, führte csh viele Funktionen ein, die später in anderen Shells Standard wurden, einschließlich Befehlsverlauf, Aliase und Job-Kontrolle. Obwohl csh und seine verbesserte Version tcsh hauptsächlich für interaktive Sitzungen und weniger für Scripting verwendet werden, bleiben sie in bestimmten Unix-Umgebungen wichtig und bieten einzigartige Funktionen, die einige Benutzer bevorzugen. Das Verständnis von csh ist wertvoll für Systemadministratoren und Benutzer, die auf Legacy-Systemen oder spezifischen Unix-Distributionen darauf stoßen.
## Installation und Einrichtung
### C Shell-Varianten
```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
C Shell installieren¶
# 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
csh/tcsh als Standardshell festlegen¶
# 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
Grundlegende Konfigurationsdateien¶
# 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
C Shell-Syntax und Variablen¶
Variablenzuweisung und -nutzung¶
# 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
Zeichenkettenoperationen¶
# 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`"
Befehlssubstitution¶
# 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
Kontrollstrukturen¶
Bedingte Anweisungen¶
# 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
Switch-Anweisungen¶
# 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
Schleifen¶
# 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
Arithmetische Operationen¶
Arithmetik mit @ Befehl¶
# 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\\}"`
Externe arithmetische Werkzeuge¶
# 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
Aliase und Verlauf¶
Alias-Verwaltung¶
# 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
^old^new # 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
Verlaufsverwaltung¶
# 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
Job-Kontrolle und Prozessverwaltung¶
Job-Kontrolle¶
# 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
Prozessinformationen¶
# 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
Ein-/Ausgabe und Umleitung¶
Grundlegende I/O-Umleitung¶
# 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
Erweiterte I/O-Funktionen¶
```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-Spezifische Funktionenbash
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 Anpassungbash
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
### Prompt-Anpassungbash
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
### Umgebungskonfigurationbash
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 *
### Shell-Optionenbash
!/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
## Skriptüberlegungenbash
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¶
### Skriptstrukturbash
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
### Best Practices für csh-Skriptebash
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¶
## Einschränkungen und Alternativenbash
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 ```### Bekannte Einschränkungen