Niekedy sa ocitnem v situácii, keď si potrebujem pozrieť spustiteľné súbory dostupné v aktuálnom projektovom adresári, vybrať vhodný a spustiť ho, prípadne s nejakými parametrami. Bohužiaľ, správcovia balíčkov sa nedohodli na jednotnej ceste, kde by spustiteľné súbory mali sídliť. Dva príklady, ktoré ma bežne trápia, sú:

  1. PHP composer ich ukladá do adresára vendor/bin/
  2. Node npm ich ukladá do adresára node_modules/.bin

Iné jazyky ako Go alebo Rust majú vlastných správcov balíčkov, ktoré môžu používať iné cesty. Aby toho nebolo málo, správca balíčkov node používa skrytý adresár (začínajúci bodkou). A okrem toho oba adresáre neobsahujú priamo spustiteľné súbory, ale symbolické odkazy na ne. Používanie symbolických odkazov je úplne správne, len to veci trochu komplikuje.

Treba povedať, že v prípade npm je argument pre skrytie node_modules/.bin/ opodstatnený – kedy si naposledy ručne zadával celú cestu k binárke node balíčka? Na to máme npx. Ale npx dokáže spúšťať aj binárky z balíčkov, ktoré nie sú nainštalované v lokálnom projekte, a tieto by som chcel vidieť.

Zsh alias #

Takto som problém rýchlo vyriešil pomocou aliasu:

fx() { print -z $(fd -HI -tl | fzf) }

Pozri ho v akcii nižšie, otestovaný pre npm aj composer ako je uvedené vyššie:

Rýchly výpis spustiteľných súborov pomocou fzf, krátky screencast

Alias vyžaduje fd, fzf a zsh. Je tiež možné ho trochu upraviť, aby vypisoval všetky spustiteľné súbory pomocou dodatočného parametra -tx:

fx() { print -z $(fd -HI -tl -tx | fzf) }

Ja však preferujem výpis len symbolických odkazov pomocou -tl, pretože z dôvodu, ktorý mi momentálne uniká, balíčky od spomínaných správcov balíčkov majú tendenciu obsahovať súbory s nastaveným príznakom spustiteľnosti na všelijakých súboroch, dokonca aj na README.md. Preto je výstup so skutočnými spustiteľnými príznakmi veľmi chaotický a má len malú praktickú hodnotu. Výpis len symbolických odkazov – hoci to môže znieť prekvapivo – funguje pri hľadaní spustiteľných súborov oveľa lepšie. Enjoy!

Odkazy #