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 30004. Работа с файлами без головной боли
Копирование файлов с индикаторами выполнения, потому что смотреть, как сохнет краска, скучно:
# Сначала установите 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/' *.jpeg5. Отладка сети в одну строку
Проверка запущенности служб раньше включала несколько команд:
# 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/protected6. Супервозможности рабочего процесса 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, где будет еще больше полезной информации.