15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți
09.10.2024

Directoare Binare Linux Explicate: O Referință Tehnică Completă

Directoarele binare Linux sunt locațiile standardizate din sistemul de fișiere unde rezidă programele executabile, instrumentele de administrare a sistemului și bibliotecile partajate. Standardul Ierarhiei Sistemului de Fișiere (FHS) definește aceste căi pentru a asigura plasarea consecventă a software-ului în toate distribuțiile, permițând rezoluția `PATH` previzibilă, gestionarea curată a pachetelor și recuperarea fiabilă a sistemului — chiar și atunci când sistemele de fișiere neesențiale sunt indisponibile.

Pentru orice administrator care gestionează un mediu de VPS Hosting sau un server bare-metal, cunoașterea exactă a locului unde se află fiecare binar — și de ce — nu este o cunoștință opțională. Aceasta afectează direct comportamentul la pornire, separarea privilegiilor, strategia de implementare a software-ului și consolidarea securității.

De ce contează structura directoarelor binare

Înainte de a analiza directoarele individuale, merită să înțelegem logica arhitecturală din spatele separării. FHS împarte sistemul de fișiere în două axe fundamentale:

  • Esențial vs. neesențial: Binarele necesare pentru modul single-user și repararea de urgență trebuie să fie disponibile înainte ca `/usr` să fie montat. Orice altceva poate fi plasat sub `/usr`.
  • Nivel sistem vs. nivel utilizator: Binarele destinate administrării la nivel root sunt separate de cele disponibile utilizatorilor fără privilegii, permițând un control mai strict al accesului prin permisiunile sistemului de fișiere.

Această filozofie de proiectare este anterioară sistemelor init moderne, dar rămâne profund relevantă. Un `PATH` configurat greșit, un binar plasat în directorul greșit sau un symlink de bibliotecă lipsă pot întrerupe silențios secvențele de pornire, job-urile cron sau scripturile de pornire a serviciilor.

Directoarele binare principale dintr-o privire

DirectorScopNecesită Root?Disponibil înainte de montarea `/usr`?Gestionat de
`/bin`Binare esențiale pentru utilizatoriNuDa (sau symlink)Manager de pachete
`/sbin`Binare esențiale de sistemDaDa (sau symlink)Manager de pachete
`/usr/bin`Binare standard pentru utilizatoriNuNuManager de pachete
`/usr/sbin`Binare de sistem neesențialeDaNuManager de pachete
`/usr/local/bin`Binare pentru utilizatori instalate localNuNuAdministrator
`/usr/local/sbin`Binare de sistem instalate localDaNuAdministrator
`/opt`Software terț autoconținutVariabilNuVendor/Administrator
`/lib`, `/usr/lib`Biblioteci partajateN/AVariabilManager de pachete

/bin — Binare esențiale pentru utilizatori

`/bin` conține setul minimal de executabile necesare pentru pornirea sistemului și pentru ca un utilizator să efectueze operațiuni de bază în modul single-user sau de recuperare. Aceste binare trebuie să fie accesibile chiar și atunci când este montat doar sistemul de fișiere root.

Exemple canonice: `ls`, `cp`, `mv`, `cat`, `bash`, `echo`, `grep`, `chmod`, `ln`, `mkdir`, `rm`, `ps`

Detaliu tehnic critic: Pe distribuțiile bazate pe systemd — inclusiv Debian 10+, Ubuntu 20.04+, Fedora, Arch Linux și RHEL 8+ — `/bin` este acum un link simbolic care indică spre `/usr/bin`. Aceasta face parte din inițiativa UsrMerge, care consolidează directoarele binare de la nivel root în omologii lor `/usr` pentru a simplifica proiectarea initramfs și a permite actualizări atomice ale sistemului de operare. Puteți verifica acest lucru pe orice sistem cu merge:

“`bash

ls -la /bin

lrwxrwxrwx 1 root root 7 /bin -> usr/bin

“`

Implicație operațională: Dacă scrieți scripturi shell destinate să ruleze în medii de recuperare sau hook-uri de pornire timpurie (de ex., scripturi initramfs), nu presupuneți niciodată că `/usr/bin` este disponibil. Folosiți întotdeauna `/bin/sh` ca shebang și referențiați doar utilitarele mandatate de POSIX.

/sbin — Binare esențiale de sistem

`/sbin` conține binare rezervate pentru sarcinile de administrare a sistemului care trebuie să fie executabile în timpul pornirii și al operațiunilor de reparare a sistemului de fișiere, înainte ca arborele complet al sistemului de fișiere să fie disponibil.

Exemple canonice: `fsck`, `ifconfig`, `ip`, `reboot`, `shutdown`, `mkfs`, `mount`, `umount`, `fdisk`, `modprobe`, `init`

Nuanță privind privilegiile: Deși binarele din `/sbin` sunt *destinate* utilizării root, ele sunt executabile de toți pe majoritatea distribuțiilor. Restricția este impusă de operațiunile în sine — `fsck` necesită acces direct la dispozitiv, `mount` necesită `CAP_SYS_ADMIN` — nu de bitul de execuție al binarului. Aceasta este o sursă frecventă de confuzie în timpul auditurilor de securitate.

Stare modernă: Ca și `/bin`, `/sbin` este un symlink spre `/usr/sbin` pe sistemele cu usr-merge. Distincția dintre `/sbin` și `/bin` este acum în primul rând semantică și istorică, mai degrabă decât structurală.

/usr/bin — Depozitul principal de binare pentru utilizatori

`/usr/bin` este cel mai mare și mai frecvent accesat director de binare dintr-o instalare Linux tipică. Conține toate utilitarele standard de linie de comandă orientate către utilizatori și aplicațiile instalate prin managerul de pachete al sistemului care nu sunt necesare pentru operațiunile de urgență.

Exemple canonice: `vim`, `nano`, `git`, `python3`, `perl`, `gcc`, `curl`, `wget`, `ssh`, `tar`, `gzip`, `awk`, `sed`, `find`

Scară în practică: Pe o instalare minimă de server Debian, `/usr/bin` poate conține 200–400 de binare. O instalare completă a mediului desktop poate împinge acel număr peste 2.000. Acest director se află întotdeauna în `PATH` implicit pentru toți utilizatorii.

Proprietatea managerului de pachete: Fiecare fișier de aici este urmărit de `dpkg`, `rpm` sau echivalentul distribuției dvs. Plasarea manuală a fișierelor în `/usr/bin` este puternic descurajată — actualizările de pachete le pot suprascrie silențios fără avertisment.

/usr/sbin — Binare de administrare a sistemului neesențiale

`/usr/sbin` conține instrumente de administrare a sistemului care nu sunt necesare în timpul procesului de pornire sau al recuperării în modul single-user, dar sunt esențiale pentru gestionarea zilnică a serverului.

Exemple canonice: `apache2`, `nginx`, `sshd`, `useradd`, `userdel`, `usermod`, `groupadd`, `iptables`, `nftables`, `cron`, `logrotate`, `tcpdump`

Perspectivă arhitecturală: Separarea `/sbin` și `/usr/sbin` a fost inițial concepută astfel încât un administrator de sistem să poată porni în modul single-user și să efectueze reparații fără a fi nevoie să monteze `/usr`. În practică, pe sistemele moderne cu initramfs și spațiu utilizator timpuriu, această distincție s-a estompat în mare măsură. Cu toate acestea, înțelegerea ei rămâne esențială atunci când lucrați cu sisteme mai vechi RHEL 6/CentOS 6 sau medii Linux încorporate unde `/usr` poate fi cu adevărat o partiție separată.

/usr/local/bin — Binare pentru utilizatori instalate de administrator

`/usr/local/bin` este locația corectă pentru binarele instalate manual — în afara managerului de pachete al sistemului — și care ar trebui să fie disponibile tuturor utilizatorilor de pe sistem.

Cazuri de utilizare tipice:

  • Software compilat din sursă (de ex., o compilare personalizată a `nginx` cu module nestandard)
  • Scripturi Python instalate prin `pip install –prefix=/usr/local`
  • Instrumente CLI terțe distribuite ca binare standalone (de ex., `kubectl`, `helm`, `terraform`, `hugo`)
  • Scripturi de automatizare personalizate care trebuie să fie la nivel de sistem

Precedența PATH: Pe un sistem conform FHS standard, `/usr/local/bin` apare *înaintea* `/usr/bin` în `PATH` implicit. Aceasta înseamnă că un binar plasat aici va umbri un binar gestionat de pachete cu același nume. Acest lucru este intenționat — permite personalizărilor locale să suprascrie valorile implicite ale distribuției — dar este și o sursă frecventă de erori subtile atunci când versiunile diferă.

“`bash

echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

“`

Considerație de securitate: Deoarece `/usr/local/bin` nu este auditat de managerul de pachete, binarele plasate aici nu primesc actualizări de securitate automate. Pe serverele care rulează sarcini de lucru de producție — inclusiv cele pe Servere Dedicate — stabiliți un calendar de actualizare manuală sau utilizați un instrument de gestionare a configurației (Ansible, Puppet, Chef) pentru a urmări și actualiza aceste binare.

/usr/local/sbin — Binare de sistem instalate de administrator

`/usr/local/sbin` oglindește relația dintre `/sbin` și `/bin`, dar la nivel local. Este locația corectă pentru instrumentele de administrare a sistemului instalate manual care necesită privilegii ridicate sau sunt destinate doar utilizatorului root.

Cazuri de utilizare tipice:

  • Scripturi de backup personalizate care rulează ca root prin cron
  • Agenți de monitorizare compilați manual (de ex., o compilare personalizată a `node_exporter`)
  • Scripturi administrative wrapper care apelează apeluri de sistem privilegiate
  • Utilitare de gestionare furnizate de vendor care sunt livrate ca arhive tarball în loc de pachete

Disciplină operațională: Mențineți un `README` sau un fișier de inventar în `/usr/local/sbin` care documentează originea, versiunea și procedura de actualizare a fiecărui binar. Pe infrastructura partajată, binarele nedocumentate din acest director reprezintă o responsabilitate de securitate și auditabilitate.

/opt — Aplicații terțe autoconținute

`/opt` este conceput pentru pachete software care nu respectă structura de directoare FHS — de obicei aplicații comerciale sau proprietare, suite software mari distribuite de vendor și aplicații care includ propriile biblioteci pentru a evita conflictele de dependențe.

Exemple canonice:

  • `/opt/google/chrome/` — browserul Google Chrome
  • `/opt/lampp/` — stiva XAMPP
  • `/opt/pycharm/` — IDE-ul JetBrains PyCharm
  • `/opt/gitlab/` — instalarea Omnibus GitLab
  • `/opt/aws/` — AWS CLI v2 și SSM Agent

Convenție structurală: Fiecare aplicație din `/opt` ar trebui să ocupe propriul subdirector urmând modelul `/opt/<provider>/` sau `/opt/<package>/`. Binarele aplicației se află de obicei la `/opt/<package>/bin/`, iar vendor-ul este de așteptat să instaleze un symlink în `/usr/local/bin` sau să modifice `/etc/profile.d/` pentru a adăuga calea.

Când să folosiți `/opt` față de `/usr/local`: Folosiți `/opt` când software-ul este livrat ca un pachet autoconținut cu propriile biblioteci, configurație și directoare de date. Folosiți `/usr/local/bin` pentru instrumente cu un singur binar sau scripturi care se integrează curat cu stiva de biblioteci existentă a sistemului.

Caz limită din lumea reală: GitLab Omnibus se instalează complet sub `/opt/gitlab/` și gestionează propriile instanțe de PostgreSQL, Redis și Nginx. Această izolare este intenționată — previne conflictele de versiuni cu serviciile la nivel de sistem. Cu toate acestea, înseamnă și că instrumentele de monitorizare la nivel de sistem nu vor descoperi automat aceste procese dacă nu sunt configurate explicit să caute în `/opt`.

/lib, /usr/lib, /lib64 și /usr/lib64 — Biblioteci partajate

Aceste directoare conțin fișierele obiect partajate (fișierele `.so`) de care depind binarele din directoarele binare corespunzătoare la rulare. Ele nu sunt executabile în sensul tradițional, dar sunt încărcate în memoria procesului de către linker-ul dinamic (`ld-linux.so`).

Directoare cheie și rolurile lor:

  • `/lib` — Biblioteci partajate necesare binarelor din `/bin` și `/sbin`. Pe sistemele cu usr-merge, un symlink spre `/usr/lib`.
  • `/usr/lib` — Depozitul principal pentru toate bibliotecile partajate ale sistemului. Aici rezidă bibliotecile gestionate de pachete.
  • `/lib64` — Varianta pe 64 de biți a `/lib` pe sistemele multilib (frecventă pe RHEL/CentOS x86_64). Adesea un symlink spre `/usr/lib64`.
  • `/usr/lib64` — Biblioteci partajate pe 64 de biți pe distribuțiile bazate pe RPM.
  • `/usr/local/lib` — Biblioteci instalate alături de software compilat manual.
  • `/usr/lib/x86_64-linux-gnu/` — Calea bibliotecii multiarch Debian/Ubuntu, permițând coexistența bibliotecilor pe 32 și 64 de biți.

Mecanica linker-ului la rulare: Când un binar se execută, kernel-ul predă controlul linker-ului dinamic specificat în antetul ELF (de obicei `/lib64/ld-linux-x86-64.so.2`). Linker-ul rezolvă dependențele bibliotecilor partajate folosind cache-ul construit de `ldconfig`, care citește `/etc/ld.so.conf` și directorul său de includere. Dacă o bibliotecă este instalată dar `ldconfig` nu a fost rulat, binarul va eșua cu o eroare „shared library not found” chiar dacă fișierul există.

“`bash

After installing a library to /usr/local/lib, always run:

ldconfig

Verify library resolution for a specific binary:

ldd /usr/bin/curl

“`

Capcană frecventă: Instalarea unei biblioteci compilate personalizat în `/usr/local/lib` fără a rula ulterior `ldconfig` este una dintre cele mai frecvente cauze ale erorilor „cannot open shared object file” pe serverele Linux. Acest lucru este deosebit de frecvent la compilarea software-ului din sursă pe un VPS cu cPanel sau medii gestionate similare unde procesul de compilare poate să nu aibă acces root pentru a rula `ldconfig`.

UsrMerge: Consolidarea modernă a sistemului de fișiere

Inițiativa UsrMerge (sau `usr-merge`) merită atenție dedicată deoarece schimbă fundamental modelul mental pe care mulți administratori îl păstrează de pe sistemele mai vechi.

Problema pe care o rezolvă: Istoric, `/bin`, `/sbin`, `/lib` și `/lib64` existau ca directoare independente pe sistemul de fișiere root, separate de `/usr`. Aceasta necesita ca initramfs să conțină un set minimal de instrumente pentru a monta `/usr` înainte ca sistemul complet să se poată inițializa. Pe măsură ce initramfs a devenit universal și `/usr` a început să fie tratat ca un volum read-only, potențial montat în rețea sau gestionat prin snapshot-uri, separarea a devenit un obstacol pentru actualizările atomice și implementările bazate pe imagini.

Ce s-a schimbat: Pe sistemele cu merge, directoarele de la nivel root devin symlink-uri:

“`

/bin -> usr/bin

/sbin -> usr/sbin

/lib -> usr/lib

/lib64 -> usr/lib64

“`

Distribuții care au finalizat UsrMerge:

  • Fedora (din Fedora 17, 2012)
  • Arch Linux (din 2013)
  • Debian (din Debian 12 Bookworm, 2023)
  • Ubuntu (din Ubuntu 21.10)
  • RHEL/CentOS (din RHEL 7)

Impact practic: Scripturile care codifică direct `/bin/bash` funcționează în continuare deoarece `/bin` este un symlink spre `/usr/bin`. Cu toate acestea, scripturile care încearcă să determine dacă o cale este „esențială” verificând dacă începe cu `/bin` în loc de `/usr/bin` vor produce rezultate incorecte. Actualizați orice astfel de logică în instrumentele dvs. de automatizare.

Permisiunile directoarelor binare și consolidarea securității

Înțelegerea directoarelor binare este inseparabilă de înțelegerea implicațiilor lor de securitate. Mai multe măsuri de consolidare se aplică direct acestor căi.

Linii de bază recomandate pentru permisiuni:

DirectorProprietarGrupPermisiuni
`/usr/bin`rootroot`755`
`/usr/sbin`rootroot`755`
`/usr/local/bin`rootroot`755`
`/usr/local/sbin`rootroot`750` sau `755`
`/opt/<package>`rootroot`755`

Binare SUID/SGID: Unele binare din `/usr/bin` și `/usr/sbin` poartă bitul SUID, permițându-le să se execute cu privilegii ridicate indiferent de cine le invocă. Exemplele includ `passwd`, `sudo`, `su` și `ping`. Auditați-le periodic:

“`bash

find /usr/bin /usr/sbin /bin /sbin -perm /4000 -o -perm /2000 2>/dev/null

“`

Flag-uri imutabile: Pe sistemele cu securitate ridicată, luați în considerare aplicarea `chattr +i` la binarele critice sau montarea `/usr` în mod read-only. Aceasta previne modificarea la rulare de către malware sau un proces compromis, deși necesită remontarea în mod read-write pentru actualizările legitime ale pachetelor.

Opțiunea de montare `noexec`: Montarea `/tmp` și `/var/tmp` cu `noexec` previne executarea directă a binarelor plasate acolo — o tehnică frecventă în atacurile cu web shell. Aceasta nu afectează directoarele binare în sine, dar este o măsură de consolidare complementară relevantă pentru orice server care rulează aplicații web, inclusiv cele care utilizează medii de Găzduire Web Partajată.

Variabila de mediu PATH și ordinea de rezoluție a binarelor

Variabila `PATH` determină ordinea în care shell-ul caută executabilele în directoare. Înțelegerea acestei ordini este esențială pentru depanarea erorilor „command not found” și pentru umbrirea intenționată a binarelor.

PATH tipic pentru root pe un sistem Debian/Ubuntu:

“`

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

“`

PATH tipic pentru utilizatorul fără privilegii:

“`

/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

“`

Observații cheie:

  • `/usr/local/bin` precede `/usr/bin`, astfel binarele instalate local le umbresc pe cele gestionate de pachete.
  • `/sbin` și `/usr/sbin` lipsesc din PATH-ul implicit al utilizatorului fără privilegii pe unele distribuții, motiv pentru care rularea `ifconfig` ca utilizator non-root poate eșua cu „command not found” chiar dacă binarul există.
  • Când un serviciu rulează sub un cont de utilizator non-root (de ex., un utilizator de aplicație web), PATH-ul său poate fi și mai restricționat. Folosiți întotdeauna căi absolute în fișierele de unitate de serviciu și job-urile cron.

Depanarea problemelor PATH:

“`bash

Find all instances of a binary across PATH directories:

which -a python3

Show full PATH resolution including aliases and functions:

type -a python3

Check the effective PATH for a specific service:

systemctl show myservice | grep -i environment

“`

Matricea de decizie practică: Unde să instalați un binar

Când implementați software pe un server Linux — fie că este un instrument compilat, un binar descărcat sau un script personalizat — utilizați acest cadru de decizie:

Este gestionat de managerul de pachete al sistemului?

  • Da: Managerul de pachete îl plasează automat în `/usr/bin` sau `/usr/sbin`. Nu îl mutați.

Este un binar sau script unic instalat manual, destinat tuturor utilizatorilor?

  • Instrument orientat către utilizatori: `/usr/local/bin`
  • Instrument root/admin: `/usr/local/sbin`

Este un pachet de aplicație autoconținut cu propriile dependențe?

  • Folosiți `/opt/<vendor>/<package>/` și creați un symlink al binarului principal spre `/usr/local/bin`

Este un instrument temporar sau specific unui utilizator?

  • Plasați-l în `~/bin` (creați dacă nu există) și adăugați `~/bin` la `PATH` personal în `~/.bashrc` sau `~/.profile`

Este o bibliotecă partajată pentru o aplicație compilată manual?

  • Instalați în `/usr/local/lib`, apoi rulați `ldconfig`

Acest cadru previne cea mai frecventă formă de entropie a sistemului de fișiere pe serverele cu rulare îndelungată: binare împrăștiate în locații arbitrare, invizibile pentru managerul de pachete și uitate de administratorul care le-a instalat.

Listă de verificare a punctelor tehnice cheie

  • Verificați starea UsrMerge pe sistemul dvs. cu `ls -la /bin /sbin /lib`. Dacă sunt symlink-uri, `/bin` și `/usr/bin` sunt spații de nume identice.
  • Nu plasați niciodată fișiere direct în `/usr/bin` sau `/usr/sbin` — actualizările de pachete le vor suprascrie silențios.
  • Rulați întotdeauna `ldconfig` după instalarea bibliotecilor partajate în `/usr/local/lib` sau orice cale nestandard.
  • Folosiți căi absolute în job-urile cron, fișierele de unitate systemd și scripturile init — nu vă bazați niciodată pe `PATH` setat corect în contexte neinteractive.
  • Auditați binarele SUID/SGID trimestrial pe serverele de producție: `find /usr /bin /sbin -perm /6000 -type f`
  • Documentați fiecare binar instalat în `/usr/local/` și `/opt/` cu versiunea, URL-ul sursei și data instalării într-un sistem de gestionare a configurației sau cel puțin într-un jurnal local de modificări.
  • Pe sistemele cu usr-merge, actualizați orice automatizare care distinge binarele „esențiale” prin prefixul căii — distincția este acum pur semantică.
  • Când implementați aplicații pe Panouri de Control VPS sau medii de găzduire gestionate, confirmați dacă panoul de control modifică `PATH` sau instalează propriile versiuni de binare sub `/opt` sau `/usr/local`, deoarece acest lucru poate cauza conflicte de versiuni cu instrumentele de sistem.
  • Pentru instrumentele legate de SSL (`openssl`, `certbot`), confirmați ce versiune de binar este invocată — o versiune instalată manual depășită în `/usr/local/bin` va umbri versiunea gestionată de pachete și poate conține vulnerabilități nepatchate. Combinați aceasta cu gestionarea corectă a Certificatelor SSL pentru a vă asigura că lanțul dvs. de instrumente criptografice este actualizat de la un capăt la altul.

Întrebări frecvente

Care este diferența dintre `/bin` și `/usr/bin` pe Linux modern?

Pe distribuțiile moderne care au finalizat UsrMerge, nu există nicio diferență funcțională — `/bin` este un link simbolic spre `/usr/bin`. Istoric, `/bin` conținea doar binarele necesare înainte ca `/usr` să poată fi montat, în timp ce `/usr/bin` conținea orice altceva. Distincția este acum semantică pe sistemele cu merge, dar rămâne semnificativă din punct de vedere arhitectural pe instalările Linux mai vechi sau încorporate.

De ce plasarea unui binar în `/usr/local/bin` suprascrie același binar din `/usr/bin`?

Deoarece `/usr/local/bin` apare mai devreme în `PATH` implicit decât `/usr/bin`. Shell-ul rezolvă comenzile căutând în directoarele `PATH` de la stânga la dreapta și executând prima potrivire găsită. Această ordine este intenționată — permite administratorilor să implementeze suprascrieri locale fără a modifica fișierele gestionate de pachete.

Ce se întâmplă dacă uit să rulez `ldconfig` după instalarea unei biblioteci partajate?

Cache-ul linker-ului dinamic (`/etc/ld.so.cache`) nu va include noua bibliotecă, iar orice binar care depinde de ea va eșua la rulare cu o eroare de tipul `error while loading shared libraries: libfoo.so.1: cannot open shared object file: No such file or directory`. Rularea `sudo ldconfig` reconstruiește cache-ul și rezolvă problema imediat.

Este sigur să instalez software direct în `/usr/bin` în loc de `/usr/local/bin`?

Nu. Fișierele din `/usr/bin` sunt deținute și urmărite de managerul de pachete. O viitoare actualizare de pachete sau actualizare de sistem poate suprascrie, muta sau șterge orice fișier din acel director fără avertisment. Folosiți întotdeauna `/usr/local/bin` pentru binarele instalate manual pentru a menține o separare curată între software-ul gestionat de pachete și cel gestionat de administrator.

Cum găsesc din ce director este executată o comandă?

Folosiți `which <command>` pentru o căutare rapidă a primei potriviri din `PATH`, sau `type -a <command>` pentru a lista toate potrivirile inclusiv built-in-urile shell, aliasurile și fiecare instanță din toate directoarele `PATH`. Pentru un răspuns definitiv inclusiv rezoluția symlink-urilor, folosiți `readlink -f $(which <command>)`.

15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți