Aller au contenu

csh - C Shell

Copier toutes les commandes Générer PDF

Le C Shell (csh) est une coquille Unix développée par Bill Joy à l'Université de Californie, Berkeley. Conçu pour fournir une syntaxe plus C pour une utilisation interactive, csh a introduit de nombreuses fonctionnalités qui sont devenues standard dans les shells ultérieurs, y compris l'historique des commandes, les alias et le contrôle de travail. Alors que csh et sa version améliorée tcsh sont principalement utilisés pour des sessions interactives plutôt que des scripts, ils restent importants dans certains environnements Unix et offrent des fonctionnalités uniques que certains utilisateurs préfèrent. Comprendre csh est utile pour les administrateurs et les utilisateurs du système qui le rencontrent dans les systèmes existants ou dans des distributions Unix spécifiques.

Installation et configuration

C Variantes de coquille

# 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 de C Shell

# 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
```_

### Définir csh/tcsh comme Shell par défaut
```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
```_

### Fichiers de configuration de base
```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 Syntaxe Shell et variables

Attribution et utilisation de variables

# 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

Opérations de chaînes

# 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

Substitution de commandement

# 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`"

Structures de contrôle

Déclarations conditionnelles

# 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

Changer les énoncés

# 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

Boucles

# 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

Opérations arithmétiques

Arithmétique avec @ Commande

# 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

Arithmétique externe Outils

# 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\\}"`

Aliases et histoire

Gestion des Alias

# 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

Gestion de l'histoire

# 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

Contrôle du travail et gestion des processus

Contrôle de l'emploi

# 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

Information sur le processus

# 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

Entrée/sortie et réorientation

Redirection des E/S de base

# 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

Caractéristiques d'E/S avancées

# 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

Commandes et fonctionnalités intégrées

Eléments essentiels

# 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

Caractéristiques spécifiques

# 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

Configuration et personnalisation

Personnalisation rapide

# 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

Configuration de l'environnement

# 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

Options de la coque

# 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 *

Scénarios

Structure des scripts

#!/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

Meilleures pratiques pour les scripts csh

# 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

Limitations et solutions de rechange

Limitations connues

# 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

Quand utiliser csh/tcsh

# 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

Interopérabilité

# 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

Le C Shell et sa version améliorée tcsh représentent un chapitre important dans l'évolution du shell Unix, introduisant de nombreuses fonctionnalités qui sont devenues standard dans les shells ultérieurs. Bien que csh ne soit pas recommandé pour les scripts complexes en raison de diverses limitations et incohérences, il reste utile pour une utilisation interactive, en particulier pour les utilisateurs qui préfèrent sa syntaxe C et ses fonctionnalités spécifiques. La compréhension de csh est importante pour les administrateurs de système qui la rencontrent dans les systèmes existants et pour les utilisateurs qui apprécient son approche unique de l'interaction en ligne de commande. Pour les besoins de scripts shell modernes, cependant, les shells conformes à POSIX comme bash ou les shells plus avancés comme zsh sont généralement préférés.