Saltar a contenido

csh - Intérprete de Comandos C

El Intérprete de Comandos C (csh) es un shell de Unix desarrollado por Bill Joy en la Universidad de California, Berkeley, lanzado por primera vez en 1978. Diseñado para proporcionar una sintaxis más similar a C para uso interactivo, csh introdujo muchas características que se convirtieron en estándar en shells posteriores, incluyendo historial de comandos, alias y control de trabajos. Aunque csh y su versión mejorada tcsh se utilizan principalmente para sesiones interactivas en lugar de scripting, siguen siendo importantes en ciertos entornos Unix y ofrecen características únicas que algunos usuarios prefieren. Comprender csh es valioso para administradores de sistemas y usuarios que lo encuentran en sistemas heredados o distribuciones Unix específicas.

Instalación y Configuración

Variantes del Intérprete de Comandos C

# 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

Instalación del Intérprete de Comandos C

# 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

Configurar csh/tcsh como Intérprete de Comandos Predeterminado

# 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

Archivos de Configuración Básicos

# 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

Sintaxis y Variables del Intérprete de Comandos C

Asignación y Uso 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

Operaciones con Cadenas

# 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

Sustitución de Comandos

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

Estructuras de Control

Declaraciones Condicionales

# 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

Declaraciones Switch

# 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

Bucles

# 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

Operaciones Aritméticas

Aritmética con el Comando @

# 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

Herramientas Aritméticas Externas

# 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 e Historial

Gestión de 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

Gestión del Historial

# 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

Control de Trabajos y Gestión de Procesos

Control de Trabajos

# 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

Información de Procesos

# 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

Entrada/Salida y Redirección

Redirección Básica de E/S

# 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

Características Avanzadas de E/S

# 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

Comandos Integrados y Características

Comandos Integrados Esenciales

Would you like me to continue with the remaining sections?```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 ### Características Específicas de tcshbash

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 ## Configuración y Personalizaciónbash

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 ### Personalización del Promptbash

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 ### Configuración del Entornobash

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 * ### Opciones del Shellbash

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

## Consideraciones de Scriptingbash

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

### Estructura de Scriptsbash

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 ### Mejores Prácticas para Scripts de cshbash

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

## Limitaciones y Alternativasbash

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 ```### Limitaciones Conocidas