February 17

10 трюков с терминалом, которые экономят часы каждую неделю

Это перевод оригинальной статьи 10 Terminal Tricks That Saved Me Hours Every Week.

Подписывайтесь на телеграм-канал usr_bin, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.

После трёх лет созерцания чёрных экранов и ввода непонятных команд я наткнулся на несколько трюков с терминалом, которые действительно изменили мою работу. Это не обычные советы типа «используйте ls -la вместо ls». Это те самые революционные решения, которые заставили моих коллег спросить: «Стоп, как вам удалось сделать это так быстро?»

Позвольте мне поделиться теми, которые мне запомнились, теми, которые я действительно использую ежедневно, и теми, которые заставили меня задуматься, почему меня никто не научил им раньше.

1. Магия !! и !$(сочетания клавиш истории команд)

Это просто спасение, когда вы забываете что-то запустить с помощью sudo:

# You run this and get permission denied
mkdir /etc/myapp

# Instead of retyping, just do:
sudo !!
# This expands to: sudo mkdir /etc/myapp

Но именно с !$ и начинается самое интересное. Он извлекает последний аргумент из вашей предыдущей команды:

# Create a directory
mkdir very/long/path/to/project

# Now you want to cd into it
cd !$
# Expands to: cd very/long/path/to/project
# Or create a file in that path
touch !$/config.json

Я постоянно использую это при работе с файлами. Создаю, потом редактирую. Создаю, потом навигирую. Это стало мышечной памятью.

2. Переход по каталогам с помощью pushd и popd

Забудьте о безумии cd ../../../. Стек каталогов — ваш друг:

# You're in /home/user/projects/frontend
pushd /var/log
# Now you're in /var/log, but /home/user/projects/frontend is saved

# Do your work in /var/log
tail -f application.log
# When done, instantly return
popd
# Back to /home/user/projects/frontend

Вы можете объединить несколько каталогов:

pushd /etc
pushd /tmp  
pushd /var/log

# Check your stack
dirs -v
# 0  /var/log
# 1  /tmp
# 2  /etc
# 3  /home/user/projects/frontend
# Jump to any position
pushd +2  # Goes to /etc

Это изменило мой способ навигации по сложным структурам проекта. Больше не теряюсь, где именно работал.

3. Управление процессами, которое действительно работает

Прежде, чтобы завершить процессы, необходимо выполнить полный танец из нескольких шагов: ps aux | grep, копироватьkill. Теперь это не так:

# Kill process by name
pkill -f "node server.js"

# Kill all processes matching a pattern
pkill -f "python.*script"
# Interactive process killing
htop
# Then use F9 to kill selected processes
# Or my favorite one-liner for stubborn processes
ps aux | grep [s]erver | awk '{print $2}' | xargs kill -9

Трюк со скобками [s]erver предотвращает совпадение grep с самим собой в списке процессов. Мелочь, а экономит кучу времени.

Для серверов разработки, которые отказываются завершаться:

# Find what's using port 3000
lsof -ti:3000 | xargs kill -9

# Or make it a function
killport() {
    lsof -ti:$1 | xargs kill -9
}
# Usage: killport 3000

4. Работа с файлами без головной боли

Копирование файлов с индикаторами выполнения, потому что смотреть, как сохнет краска, скучно:

# Сначала установите pv (pipe viewer) # Ubuntu/Debian: sudo apt install pv # macOS: brew install pv # Копировать с учетом хода выполнения pv largefile.tar.gz > /destination/largefile.tar.gz ## Install pv (pipe viewer) first
# Ubuntu/Debian: sudo apt install pv
# macOS: brew install pv

# Copy with progress
pv largefile.tar.gz > /destination/largefile.tar.gz
# Or use rsync for everything
rsync -ah --progress source/ destination/

Для поиска файлов find это мощно, но fd более быстрый и интуитивно понятный инструмент:

# Install fd first
# Ubuntu: sudo apt install fd-find
# macOS: brew install fd

# Find all JavaScript files
fd "\.jsquot;
# Find files modified in last hour
fd --changed-within 1h
# Find and execute
fd "\.logquot; --exec rm {}

Массовое переименование без потери рассудка:

# Rename all .jpeg to .jpg
for file in *.jpeg; do
    mv "$file" "${file%.jpeg}.jpg"
done

# Or use rename command
rename 's/\.jpeg$/.jpg/' *.jpeg

5. Отладка сети в одну строку

Проверка запущенности служб раньше включала несколько команд:

# Check if port is open
nc -zv localhost 3000

# Test HTTP endpoint with timing
curl -w "@-" -o /dev/null -s "http://localhost:3000/api/health" <<< '
     time_namelookup:  %{time_namelookup}
        time_connect:  %{time_connect}
     time_appconnect:  %{time_appconnect}
    time_pretransfer:  %{time_pretransfer}
       time_redirect:  %{time_redirect}
  time_starttransfer:  %{time_starttransfer}
                     ----------
          time_total:  %{time_total}
'
# Quick network info
ip route | grep default
ss -tulpn | grep LISTEN

Для тестирования API я заменил Postman для простых запросов:

# POST JSON data
curl -X POST http://localhost:3000/api/users \
  -H "Content-Type: application/json" \
  -d '{"name":"John","email":"john@example.com"}'
# With authentication
curl -H "Authorization: Bearer $TOKEN" \
  http://localhost:3000/api/protected

6. Супервозможности рабочего процесса Git

Эти алиасы Git находятся у меня в системе ~/.gitconfig и экономят мне десятки нажатий клавиш ежедневно:

[alias]
    co = checkout
    br = branch
    ci = commit
    st = status
    unstage = reset HEAD --
    last = log -1 HEAD
    visual = !gitk
    
    # The real game changers
    lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
    
    # Undo last commit but keep changes
    soft = reset --soft HEAD~1
    
    # Interactive rebase last 3 commits
    rb3 = rebase -i HEAD~3
    
    # Push current branch
    pc = push origin HEAD

Удобные команды для работы с ветками:

# Delete merged branches
git branch --merged | grep -v "\*\|main\|master" | xargs -n 1 git branch -d

# Create and switch to branch in one command
git checkout -b feature/new-thing
# Set upstream and push
git push -u origin $(git branch --show-current)

7. Обработка текста как профессионал

sed, awk и grep являются мощными инструментами, но вот как я на самом деле их использую:

# Extract emails from a file
grep -oE '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' file.txt

# Replace text in multiple files
find . -name "*.js" -exec sed -i 's/oldFunction/newFunction/g' {} +
# Count lines of code (excluding comments and blank lines)
find . -name "*.js" | xargs grep -v -E "^\s*$|^\s*//" | wc -l
# Format JSON on the command line
echo '{"name":"John","age":30}' | python -m json.tool
# Or use jq for more complex operations
curl -s https://api.github.com/users/octocat | jq '.name, .public_repos'

8. Управление средой и конфигурацией

Раньше управление несколькими средами было настоящим кошмаром. Вот что реально работает:

# In your ~/.bashrc or ~/.zshrc
export DEVELOPMENT_DB="postgresql://localhost/myapp_dev"
export STAGING_DB="postgresql://staging.example.com/myapp"
export PRODUCTION_DB="postgresql://prod.example.com/myapp"

# Environment switcher function
env_switch() {
    case $1 in
        dev)
            export DATABASE_URL=$DEVELOPMENT_DB
            export API_URL="http://localhost:3000"
            echo "Switched to development"
            ;;
        staging)
            export DATABASE_URL=$STAGING_DB
            export API_URL="https://api-staging.example.com"
            echo "Switched to staging"
            ;;
        prod)
            export DATABASE_URL=$PRODUCTION_DB
            export API_URL="https://api.example.com"
            echo "Switched to production"
            ;;
    esac
}
# Usage: env_switch dev

Для управления dot-файлами на разных машинах:

# Create a bare git repo for dotfiles
git init --bare ~/.dotfiles
alias dotfiles='git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
dotfiles config --local status.showUntrackedFiles no

# Track your important configs
dotfiles add ~/.bashrc ~/.vimrc ~/.gitconfig
dotfiles commit -m "Initial dotfiles"
dotfiles push origin main

9. Мониторинг производительности и системная информация

Когда дела идут не так, ответы нужны быстро:

# Real-time disk usage
watch -n 1 df -h

# Find what's eating your disk space
du -h --max-depth=1 | sort -hr
# Process monitoring with context
ps aux --sort=-%cpu | head -20
ps aux --sort=-%mem | head -20
# Network connections
netstat -tulpn | grep LISTEN
# System load with history
uptime && w

Исследование памяти и процессора:

# Memory usage by process
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head

# Find memory leaks in running processes
while true; do ps -p $PID -o %mem,rss,vsz; sleep 5; done
# CPU usage over time
sar -u 1 10  # If sysstat is installed

10. Автоматизация, которая действительно помогает

Описанные выше приемы хороши, но именно автоматизация дает реальную экономию времени:

# Backup script that runs before risky operations
backup_current() {
    local backup_name="backup_$(date +%Y%m%d_%H%M%S)"
    tar -czf "${backup_name}.tar.gz" . --exclude=node_modules --exclude=.git
    echo "Backup created: ${backup_name}.tar.gz"
}

# Project setup automation
new_project() {
    mkdir "$1" && cd "$1"
    git init
    npm init -y
    echo "node_modules/" > .gitignore
    echo "# $1" > README.md
    git add . && git commit -m "Initial commit"
    code .  # Opens in VS Code
}
# Log monitoring with alerts
monitor_errors() {
    tail -f /var/log/application.log | while read line; do
        if echo "$line" | grep -q "ERROR"; then
            echo "$(date): $line" | mail -s "Application Error" admin@company.com
        fi
    done
}

Моя любимая автоматизация — проверка работоспособности развертывания:

deploy_and_verify() {
    local app_url=$1
    echo "Deploying application..."
    
    # Your deployment commands here
    git push heroku main
    
    echo "Waiting for deployment to complete..."
    sleep 30
    
    # Health check
    if curl -f -s "$app_url/health" > /dev/null; then
        echo "✅ Deployment successful - app is responding"
        # Notify team
        curl -X POST -H 'Content-type: application/json' \
            --data '{"text":"🚀 Deployment successful"}' \
            $SLACK_WEBHOOK_URL
    else
        echo "❌ Deployment failed - app not responding"
        # Rollback logic here
    fi
}

Подведение итогов

Это не просто трюки — это инструменты, которые умножают время. Пятнадцать минут, потраченные на настройку этих алиасов и функций, будут приносить пользу каждый день. Начните с одного-двух, которые решают ваши текущие проблемы, а затем постепенно добавляйте остальные.

Терминал — это не просто место, куда поступают команды для выполнения. Это усилитель производительности, инструмент решения проблем, и, честно говоря, как только вы привыкнете к этим шаблонам, работа в любом другом режиме покажется мучительно медленной.

На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.