DTGARAGE · APPLE · CROSSOVER ГАЙД

LINUX
СРЕЩА
MACOS

Купи Mac след години Linux и внезапно нищо не е там, където очакваш. apt не съществува. systemd го няма. sed се държи различно. Този гайд е всичко, което ти трябва да се ориентираш без да се лудееш.

BASH → ZSH APT → HOMEBREW SYSTEMD → LAUNCHD BSD UTILS FILESYSTEM MACOS-EXCLUSIVE COMMANDS
01
SHELL — BASH СРЕЩА ZSH
macOS ползва zsh по подразбиране от Catalina (2019)
ЗАЩО ZSH
Apple смени default shell от bash на zsh в macOS Catalina. Bash в macOS е замразен на версия 3.2 от 2007 заради GPL v3 лиценза. Zsh е GPL v2 compatible и е значително по-мощен.
LINUX / BASHmacOS / ZSH
~/.bashrcинтерактивен shell config ~/.zshrcинтерактивен shell config
~/.bash_profilelogin shell config ~/.zprofilelogin shell config
~/.bash_history ~/.zsh_history
shopt -s globstar setopt globstar
PS1='$ ' PROMPT='$ '
Arrays: arr=(a b c); echo ${arr[0]}0-indexed Arrays: arr=(a b c); echo ${arr[1]}1-indexed (!)
complete -F _func cmd autoload -U compinit && compinit
КАПАН: ARRAYS СА 1-INDEXED В ZSH
В bash ${arr[0]} е първият елемент. В zsh ${arr[0]} е празно — масивите започват от 1. Ако мигрираш скриптове, провери всички array индекси.
~/.zshrc — МИНИМАЛЕН SETUP ЗА LINUX ПОТРЕБИТЕЛ
# History
HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt HIST_IGNORE_DUPS SHARE_HISTORY

# Completion
autoload -U compinit && compinit

# Aliases познати от Linux
alias ll='ls -lAh'
alias grep='grep --color=auto'
alias ..='cd ..'

# Homebrew (Apple Silicon)
eval "$(/opt/homebrew/bin/brew shellenv)"
ПРО ТИП
Ако искаш bash обратно: brew install bashchsh -s /opt/homebrew/bin/bash. Homebrew bash е версия 5.x, не замразения 3.2. Но zsh е добър — дай му шанс.
02
ПАКЕТИ — APT СРЕЩА HOMEBREW
brew е твоят нов apt — инсталирай го първо
ИНСТАЛАЦИЯ НА HOMEBREW
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Apple Silicon — добави в ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"

# Intel Mac — prefix е /usr/local
eval "$(/usr/local/bin/brew shellenv)"
APT (DEBIAN/UBUNTU)HOMEBREW (macOS)
sudo apt update brew updateбез sudo — умишлено
sudo apt install nginx brew install nginx
sudo apt remove nginx brew uninstall nginx
apt search nginx brew search nginx
apt list --installed brew list
sudo apt upgrade brew upgrade
apt show nginx brew info nginx
sudo apt autoremove brew autoremove && brew cleanup
dpkg -L nginxфайлове на пакет brew list nginx
apt-get install --only-upgrade nginx brew upgrade nginx
FORMULAE vs CASKS
Homebrew има два типа пакети:
Formulae — CLI инструменти и библиотеки: brew install htop
Casks — GUI приложения (DMG/PKG): brew install --cask firefox
Cask е Homebrew алтернатива на App Store за неща, които Apple не разпространява.
ЗАДЪЛЖИТЕЛНИ ПАКЕТИ ЗА LINUX ПОТРЕБИТЕЛИ
# GNU coreutils — ls, cat, find, sort с Linux поведение
brew install coreutils

# GNU sed (с -i без '' глупост)
brew install gnu-sed

# GNU grep (с -P за Perl regex)
brew install grep

# GNU find, xargs
brew install findutils

# wget (не е включен в macOS)
brew install wget

# htop, ncdu, tmux — познати инструменти
brew install htop ncdu tmux
GNU COREUTILS PREFIX
GNU coreutils се инсталират с g prefix: gls, gsed, ggrep, gfind. За да ги ползваш без prefix (като на Linux), добави /opt/homebrew/opt/coreutils/libexec/gnubin в PATH преди /usr/bin.
03
ФАЙЛОВА СИСТЕМА
APFS, SIP, /proc го няма и case-insensitive капан
КРИТИЧЕН КАПАН: CASE-INSENSITIVE ПО ПОДРАЗБИРАНЕ
APFS на macOS е case-insensitive по подразбиране. file.txt, File.txt и FILE.TXT са един и същ файл. На Linux (ext4) са три различни файла. Ако git clone-ваш проект с файлове, различаващи се само по case — ПРОБЛЕМ.
LINUX — ИМА
/proc — kernel process info
/sys — sysfs kernel interface
/etc/passwd — user база
/etc/fstab — mount конфиг
/var/log/syslog — system log
/boot — bootloader
swap partition — swap
macOS — ЕКВИВАЛЕНТ
sysctl -a — kernel параметри
няма директен еквивалент
dscl . -list /Users
/etc/fstab съществува (рядко ползван)
log show / Console.app
скрит, управляван от macOS
swap файлове в /private/var/vm/
SIP — SYSTEM INTEGRITY PROTECTION
SIP (rootless mode) защитава тези директории дори от root:
/System · /usr (без /usr/local) · /bin · /sbin · /Applications

Затова Homebrew е в /opt/homebrew (Apple Silicon) или /usr/local (Intel) — и двете са извън SIP.
Да деактивираш SIP е възможно, но не е препоръчително. Ако смяташ "ще пусна sudo rm на /System" — не.
LINUX PATHmacOS ЕКВИВАЛЕНТ
/etc /etc (symlink към /private/etc)
/tmp /tmp (symlink към /private/tmp)
~/.config ~/Library/Application SupportmacOS apps пишат тук
~/.local/share ~/Library
/var/log /var/log + ~/Library/Logs
/opt /opt/homebrew (Apple Silicon Homebrew prefix)
/usr/local/bin /opt/homebrew/bin (Apple Silicon)
04
BSD vs GNU UTILS
Командите изглеждат еднакво — държат се различно
ОСНОВНИЯТ ПРОБЛЕМ
macOS ползва BSD userland — sed, awk, find, grep, date, stat са BSD версии. Те имат различни флагове от GNU версиите на Linux. Скрипт, работещ на Linux, може да счупи на macOS.
LINUX / GNUmacOS / BSD
sed -i 's/foo/bar/' file in-place edit sed -i '' 's/foo/bar/' file backup extension е задължителен (дори празен)
date -d "yesterday" relative date date -v-1d BSD date adjustment flags
stat -c '%s' file file size stat -f '%z' file различни format specifiers
grep -P 'regex' Perl-compatible regex grep -E 'regex' -P не се поддържа; инсталирай brew install grep за ggrep -P
ls --color=auto ls -G или export CLICOLOR=1
find . -printf '%f\n' -printf не съществува в BSD find find . -exec basename {} \; или brew install findutils за gfind
xargs -r skip if empty input xargs -r не се поддържа в BSD xargs
cp -r --preserve=all cp -rp --preserve не съществува
readlink -f path canonical path realpath path или brew install coreutils за greadlink -f
free -h memory usage vm_stat или brew install free
РЕШЕНИЕ ЗА CROSS-PLATFORM СКРИПТОВЕ
Добави в началото на скриптове, предназначени за двете системи:

if [[ "$OSTYPE" == "darwin"* ]]; then
  SED="gsed"; DATE="gdate"; STAT="gstat"
else
  SED="sed"; DATE="date"; STAT="stat"
fi

Изисква brew install gnu-sed coreutils.
05
SERVICES — SYSTEMD СРЕЩА LAUNCHD
launchd е macOS init system — systemctl го няма
КАК РАБОТИ LAUNCHD
macOS ползва launchd вместо systemd. Services се дефинират като XML plist файлове и живеят в:
~/Library/LaunchAgents/ — user services (стартират при login)
/Library/LaunchDaemons/ — system services (стартират при boot, root)
/System/Library/LaunchDaemons/ — Apple system services (не пипай)
SYSTEMD / LINUXLAUNCHD / macOS
systemctl start nginx brew services start nginxHomebrew wrapper около launchctl
systemctl stop nginx brew services stop nginx
systemctl restart nginx brew services restart nginx
systemctl enable nginx brew services start nginxstart = enable + start в Homebrew
systemctl status nginx brew services info nginx
systemctl list-units --type=service brew services list
launchctl listвсички процеси
journalctl -fu nginxfollow logs tail -f /opt/homebrew/var/log/nginx/*.log
log stream --predicate 'process == "nginx"'
journalctl -bboot logs log show --last boot
systemctl daemon-reload launchctl unload ~/Library/LaunchAgents/com.example.plist
launchctl load ~/Library/LaunchAgents/com.example.plist
ПРИМЕР: LAUNCHD PLIST ЗА CUSTOM SERVICE
<!-- ~/Library/LaunchAgents/com.toni.myapp.plist -->
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0"><dict>
  <key>Label</key>
  <string>com.toni.myapp</string>
  <key>ProgramArguments</key>
  <array><string>/usr/local/bin/myapp</string></array>
  <key>RunAtLoad</key><true/>
  <key>KeepAlive</key><true/>
</dict></plist>

# Зареди
launchctl load ~/Library/LaunchAgents/com.toni.myapp.plist
06
МРЕЖА
ip командата го няма — BSD мрежови инструменти
LINUXmacOS
ip addrlist interfaces ifconfigили brew install iproute2mac за ip
ip addr show eth0 ifconfig en0интерфейсите се казват en0, en1, utun0
hostname -Ilocal IP ipconfig getifaddr en0
ip route netstat -rn
route -n get default
ss -tlnpopen ports lsof -iTCP -sTCP:LISTEN -P
netstat -anp tcp | grep LISTEN
ss -ssocket stats netstat -s
ip link set eth0 up ifconfig en0 up
networksetup -setnetworkserviceenabled Wi-Fi on
nmcli networksetupCLI мрежов мениджмент
iptables -L pfctl -srmacOS ползва PF firewall
/etc/hosts /etc/hostssame — но промени изискват sudo dscacheutil -flushcache
DNS FLUSH — ЧЕСТА ОПЕРАЦИЯ
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
# Еквивалент на: sudo systemd-resolve --flush-caches
07
САМО В macOS
Команди, които нямат Linux еквивалент
CLIPBOARD
copypbcopy
pastepbpaste
pipe to clipboardcat file | pbcopy
FINDER ИНТЕГРАЦИЯ
open Finder тукopen .
open с приложениеopen -a TextEdit f
open URLopen https://...
SPOTLIGHT ОТ CLI
търси файловеmdfind query
в директорияmdfind -onlyin . q
reindexmdutil -i on /
SYSTEM INFO
macOS версияsw_vers
hardware infosystem_profiler
сериен номерsystem_profiler SPHardwareDataType
POWER MANAGEMENT
предотврати sleepcaffeinate
power settingspmset -g
sleep сегаpmset sleepnow
TEXT TO SPEECH
изговори текстsay "Hello"
save to filesay -o out.aiff "text"
list voicessay -v '?'
DEFAULTS WRITE — SYSTEM PREFERENCES ОТ ТЕРМИНАЛА
# Покажи скрити файлове в Finder
defaults write com.apple.finder AppleShowAllFiles YES
killall Finder

# Деактивирай .DS_Store на мрежови дялове
defaults write com.apple.desktopservices DSDontWriteNetworkStores true

# Screenshot формат — PNG по подразбиране
defaults write com.apple.screencapture type jpg

# Покажи пълния path в Finder title bar
defaults write com.apple.finder _FXShowPosixPathInTitle YES
08
КАПАНИ — НЕЩА, КОИТО ЩЕ ТЕ ИЗНЕНАДАТ
Грешки, които всеки Linux потребител прави при преход
01 sudo НЕ Е ЦАРСКИ НА macOS
SIP блокира дори root. sudo rm -rf /System/Library/... ще даде "Operation not permitted". Не опитвай да деактивираш SIP — работи с него, не против него.
02 HOMEBREW БЕЗ SUDO — УМИШЛЕНО
Homebrew отказва да се инсталира или ъпдейтва с sudo. Причината: всичко в /opt/homebrew е собственост на твоя потребител. sudo brew install ще счупи permissions. Никога.
03 PYTHON/RUBY/PERL — НЕ ПИПАЙ СИСТЕМНИТЕ
macOS има system Python, Ruby и Perl в /usr/bin/. Те са за macOS инструменти, не за теб. Инсталирай свои версии: brew install python. Никога pip install --system без --break-system-packages.
04 /TMP СЕ ИЗЧИСТВА ПРИ РЕСТАРТ
Точно като Linux, но macOS го изчиства и при дълъг uptime. Не складирай нищо важно в /tmp.
05 SSH KEYCHAIN ИНТЕГРАЦИЯ
macOS пази SSH ключове в Keychain автоматично. Ако ssh-add -l е празно след рестарт — нормално е. Добави в ~/.ssh/config:
Host *
  UseKeychain yes
  AddKeysToAgent yes
06 CTRL+C В ТЕРМИНАЛА РАБОТИ — CMD+C НЕ ИЗПРАЩА SIGINT
В GUI приложения: Cmd+C = copy. В терминал: Ctrl+C = SIGINT. Ctrl+Z = SIGTSTP. Ctrl+D = EOF. Същото като Linux — терминалът е терминал.
07 CASE-INSENSITIVE ФАЙЛОВА СИСТЕМА
Git може да мисли, че файл не е променен когато само case се е сменил. git config core.ignorecase false помага, но не 100%. За сериозна dev работа: създай case-sensitive APFS volume.
08 .DS_STORE ФАЙЛОВЕТЕ
Finder създава .DS_Store в почти всяка директория. Добави в ~/.gitignore_global:
.DS_Store
**/.DS_Store

После: git config --global core.excludesfile ~/.gitignore_global
09
ПРЕПОРЪЧИТЕЛЕН SETUP
Нов Mac → usable за Linux потребител за под час
STEP 1 — HOMEBREW + ЗАДЪЛЖИТЕЛНИ ПАКЕТИ
# Инсталирай Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# GNU utils за Linux поведение
brew install coreutils gnu-sed grep findutils wget

# CLI инструменти
brew install htop ncdu tmux git curl jq

# Dev инструменти
brew install python node go
STEP 2 — ZSH CONFIG
# ~/.zshrc
HISTFILE=~/.zsh_history; HISTSIZE=10000; SAVEHIST=10000
setopt HIST_IGNORE_DUPS SHARE_HISTORY
autoload -U compinit && compinit

# GNU utils без g-prefix в PATH
export PATH="/opt/homebrew/opt/coreutils/libexec/gnubin:$PATH"
export PATH="/opt/homebrew/opt/gnu-sed/libexec/gnubin:$PATH"
export PATH="/opt/homebrew/opt/grep/libexec/gnubin:$PATH"

# Aliases
alias ll='ls -lAh --color=auto'
alias grep='grep --color=auto'
alias ..='cd ..'
STEP 3 — GIT ГЛОБАЛЕН CONFIG
git config --global core.ignorecase false
git config --global core.excludesfile ~/.gitignore_global
echo ".DS_Store" >> ~/.gitignore_global
git config --global pull.rebase false
STEP 4 — SSH KEYCHAIN
# ~/.ssh/config
Host *
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_ed25519
ФИНАЛЕН СЪВЕТ
macOS е BSD с красива обвивка. Докато разбереш разликите — е дразнещо. После е много добро. Terminal.app е окей за начало. iTerm2 или Warp са по-добри. Homebrew прави 95% от нещата, с които се занимаваш на Linux. Останалите 5% са в man страниците.