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 / BASH | macOS / 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 ПОТРЕБИТЕЛ
# HistoryHISTFILE=~/.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 bash → chsh -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 htopCasks — GUI приложения (DMG/PKG):
brew install --cask firefoxCask е 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 — bootloaderswap partition — swapmacOS — ЕКВИВАЛЕНТ
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 PATH | macOS ЕКВИВАЛЕНТ |
|---|---|
/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 / GNU | macOS / 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 / LINUX | LAUNCHD / 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 listlaunchctl listвсички процеси |
journalctl -fu nginxfollow logs |
tail -f /opt/homebrew/var/log/nginx/*.loglog stream --predicate 'process == "nginx"' |
journalctl -bboot logs |
log show --last boot |
systemctl daemon-reload |
launchctl unload ~/Library/LaunchAgents/com.example.plistlaunchctl 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 мрежови инструменти
| LINUX | macOS |
|---|---|
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 -rnroute -n get default |
ss -tlnpopen ports |
lsof -iTCP -sTCP:LISTEN -Pnetstat -anp tcp | grep LISTEN |
ss -ssocket stats |
netstat -s |
ip link set eth0 up |
ifconfig en0 upnetworksetup -setnetworkserviceenabled Wi-Fi on |
nmcli |
networksetupCLI мрежов мениджмент |
iptables -L |
pfctl -srmacOS ползва PF firewall |
/etc/hosts |
/etc/hostssame — но промени изискват sudo dscacheutil -flushcache |
DNS FLUSH — ЧЕСТА ОПЕРАЦИЯ
sudo dscacheutil -flushcachesudo killall -HUP mDNSResponder
# Еквивалент на: sudo systemd-resolve --flush-caches
07
САМО В macOS
Команди, които нямат Linux еквивалент
CLIPBOARD
copy
pbcopypaste
pbpastepipe to clipboard
cat file | pbcopyFINDER ИНТЕГРАЦИЯ
open Finder тук
open .open с приложение
open -a TextEdit fopen URL
open https://...SPOTLIGHT ОТ CLI
търси файлове
mdfind queryв директория
mdfind -onlyin . qreindex
mdutil -i on /SYSTEM INFO
macOS версия
sw_vershardware info
system_profilerсериен номер
system_profiler SPHardwareDataTypePOWER MANAGEMENT
предотврати sleep
caffeinatepower settings
pmset -gsleep сега
pmset sleepnowTEXT TO SPEECH
изговори текст
say "Hello"save to file
say -o out.aiff "text"list voices
say -v '?'DEFAULTS WRITE — SYSTEM PREFERENCES ОТ ТЕРМИНАЛА
# Покажи скрити файлове в Finderdefaults 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 yes06 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
# ~/.zshrcHISTFILE=~/.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 falsegit config --global core.excludesfile ~/.gitignore_global
echo ".DS_Store" >> ~/.gitignore_global
git config --global pull.rebase false
STEP 4 — SSH KEYCHAIN
# ~/.ssh/configHost *
UseKeychain yes
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519
ФИНАЛЕН СЪВЕТ
macOS е BSD с красива обвивка. Докато разбереш разликите — е дразнещо. После е много добро. Terminal.app е окей за начало. iTerm2 или Warp са по-добри. Homebrew прави 95% от нещата, с които се занимаваш на Linux. Останалите 5% са в man страниците.