Sziasztok,
Egy ideje használom egyszerűbb dolgokhoz az fzf parancsot, mint pl apt installhoz, vagy pont a remove-hoz hogy egy listát kiad, és kiválasztva enterrel eltávolítja, vagy épp telepíti. Viszont szeretnék egy olyan shell scriptet létrehozni, ahol megadott szövegek közül lehetne válogatni, és a kiválasztott esetén különböző parancsokat futtatna le. Ezt eddig egy olyan scripttel oldottam meg, ahol egy echo paranccsal kiírta, hogy pl:
1. NGINX
2. SAMBA
3. BACKUP
és utána case parannccsal megoldottam, hogy attól függően hogy milyen számot írtam be, annak megfelelően lefutott egy parancsok sorozata (jelen esetben ssh-s csatlakozás a megadott szerverre, esetleg előtte egy vpn-es csatlakozás.
Viszont ez tök jó lenne, ha fzf-el megtudnám valósítítani, hogy egy listából ugyanúgy fzf-el kurozorral kiválasztom melyik szerverről legyen szó (név alapján), és enter-el kiválasztva az ahhoz tartozó egyedi parancsokat futtatná le.
Erre van valamilyen mód fzf esetén?
Megoldás:
No csináltam egy megoldást. A sokadik keresésben találtam egy teljesen más fzf-es használatot. De a gondolkodásmódja viszont használhatónak tűnt, és azt felhasználva meg is tudtam oldani. A lényege, hogy létrehoztam egy file-t, amibe felsoroltam a menüpontokat és a hozzájuk tartozó parancsokat amit le kell futtatni a kiválasztáskor. Ezeket elválasztottam egy kettősponttal, tehát a kettőspont lett a delimiter. Például
BACKUP:ssh name@ip -p 8911 -i ~/.ssh/user
ICINGA:nmcli connection up userlaptop > /dev/null;ssh name@ip -i ~/.ssh/user;nmcli connection down userlaptop > /dev/null
REMOTE:ssh name@ip -i ~/.ssh/user
Aztán csináltam egy scriptet ami ezt tartalmazza:
#!/bin/bash
file="/path/server.txt"
selection1=$(cut -f1 -d ':' ${file} | fzf --prompt='Válassz szervert: ' --layout=reverse --no-multi)
selection2=$(grep $selection1 ${file} | cut -f2 -d ':')
eval "$selection2"
Definiáltam a file változóban ezt a szöveges filet, amiben az adatokat vannak. A selection változó tartalmazza azt a szerver nevet amit kiválasztottam az fzf menüjével. A selection 2 változó meg tartalmazza a kiválasztott szerverhez kapcsolódó parancsokat. Ezután parancsként értelmezem a selection2 függvény tartalmát. Lehetne bash -c -vel is futtatni, de így független a shelltől.
- 456 megtekintés
Hozzászólások
zenity parancsot ismered? ez GUI-t ad hozzá könnyen shell-hez, tud select-et, input-ot stb.
- A hozzászóláshoz be kell jelentkezni
Ismerem, de nem szeretnék zenity-t. Szimpla fzf-et szeretnék használni. Van rá mód, egyszer láttam egy példát rá, de az istenért nem találom most.
- A hozzászóláshoz be kell jelentkezni
Rászántam tíz percet, ez alapján a --preview kapcsolóval lehet ügyeskedni. Írsz egy saját scriptet amit megadsz a previewnek, és hurrá.
De nekem ez elég fából vaskarika módszernek tűnik.
- A hozzászóláshoz be kell jelentkezni
curses?
- A hozzászóláshoz be kell jelentkezni
dialog
- A hozzászóláshoz be kell jelentkezni
slinky és geri
fzf-el szeretném megoldani, és nem egyéb más módon. Főleg nem dialog-al ami végképp ódivatú.
- A hozzászóláshoz be kell jelentkezni
echo -e "1. hello\n2. bello\n3. valami" | fzf --layout=reverse
- A hozzászóláshoz be kell jelentkezni
EZ csak felsorolás, de ugye választásfüggően kellene is valamit csinálnia.
- A hozzászóláshoz be kell jelentkezni
COMMAND EXECUTION
With execute(...) action, you can execute arbitrary commands without leaving fzf.
For example, you can turn fzf into a simple file browser by binding enter key to
less command like follows.
fzf --bind "enter:execute(less {})"
Ez alapján egy-egy parancsot hozzárendelni egy-egy billentyűhöz/billentyűkombóhoz? Pl.
$ ... | fzf --preview "apt show {}" --bind "i:execute(apt install {})" --bind "r:execute(apt remove {})" # N.B. Nem próbáltam, csak ötletelek =)
- A hozzászóláshoz be kell jelentkezni
Igen ezt néztem, csak ezzel az a bajom, hogy mindegyik menüpontra mást mást kellene csinálnia, vagyis hogyan adom meg, hogy Enter-t használva az adott menüpontot kiválasztva éppen milyen utasítás(oka)t használjon?
- A hozzászóláshoz be kell jelentkezni
Miért nem jó a "dialog" amit feljebb írtak? Miért gondolod "ódivatú"-nak?
https://unix.stackexchange.com/a/146587
Ebben a szálban pure bash megoldás is van egyébként.
- A hozzászóláshoz be kell jelentkezni
Mert 5-6 választási lehetőségnél még csak csak elmegy, de ennél jóval összetettebb több elemű kiválasztásnál egyszerűen nem hatékony. Fzf fuzzy logika alapján tud keresni. Egyszerűen jóval korszerűbb, kényelmesebb használni. Mondhatnám analógiának a dialog=mc fzf=vifm -et is. Ég és föld a különbség a kettő között.
- A hozzászóláshoz be kell jelentkezni
Utána olvastam, nem rossz cucc. Viszont akkor tudnál bővebb infót adni arról, hogy miért akarod a menu hook-ot? Hátha jön több ötlet. Például fájlokat akarsz szűrni, és a talált fájlokon végezni adott műveleteket a menü segítségével?
- A hozzászóláshoz be kell jelentkezni
Igen, pontosan. Pl lenne egy több mint 50db-os szerverpark, amit így menübe szerveznék, és amelyiket kiválasztom, arra ssh-val rákapcsolódnék. Ezért is lenne változó az enter parancs, hisz az ipcímek változnak, sőt valamelyikhez vpn kapcsolatot is kell indítanom. Sima bash scriptet használok most hozzá, amivel ugye beírom az adott számot, csak 50 feletti szerver esetén eléggé kényelmetlen. Ideiglenesen Rofi-ba is lehet rakni scriptet, és akkor ő is ilyesmi fzf-es megoldást használ, csak nem az igazi.
Amúgy iszonyatosan univerzális ez az fzf. Valaki szimpla filekeresésre használja, mert jóval gyorsabb, mint mondjuk a find vagy locate, valaki ezt használja filekezelőnek, én pl használom programok installálására, törlésére. Ahog elkezdem begépelni a parancsot, úgy jeleníti meg hogy mi lehet az, közben a jobb oldalt már ki is írja a tulajsongáait, verziót stb a programnak.
- A hozzászóláshoz be kell jelentkezni
"jóval gyorsabb, mint mondjuk a find vagy locate"
Ezt azért - így látatlanba - azért kétlem :)
Bár biztos lehet mindkettőt úgy használni, hogy ez igaz legyen...
- A hozzászóláshoz be kell jelentkezni
Akkor ne látatlanba reagálj rá, hanem próbáld ki. Én a teljes filerendszeren próbáltam mikor ezt olvastam, és bizony gyorsabb :)
- A hozzászóláshoz be kell jelentkezni
https://github.com/junegunn/fzf#usage
Erre gondolsz?
find * -type f | fzf > selected
Eleve findet használ, nem sok esély van rá, hogy gyorsabb legyen :)
- A hozzászóláshoz be kell jelentkezni
Ha használsz előtte find-ot akkor nmyilván nem, na de ki mondta hogy kötelező használni? simán györkében fzf-et kiadva megtalál egy sokadik almappában egy olyan file-t fél másodperc alatt, amivel a find elszórakozik a világ végéig.
- A hozzászóláshoz be kell jelentkezni
> Without STDIN pipe, fzf will use find command to fetch the list of files excluding hidden ones. (You can override the default command with FZF_DEFAULT_COMMAND
)
Findet használ.
- A hozzászóláshoz be kell jelentkezni
Akkor itt lesz a bibi. Nekem a find át van symlinkelve az fd-re. Ezért gyorsabb.
- A hozzászóláshoz be kell jelentkezni
Csodak nincsenek. Mindkettonek vegig kell olvasnia a strukturat, megcsinalni a stat-okat.
Az fzf esetleg ott tud "csalni", hogy azonnal kereshetoen jeleniti meg a find outputjat (mar az elso sortol kezdodoen), ez valoban javithatja a felhasznaloi elmenyt.
De a find is tudja azt, hogy az elso talalat utan ugy dont, hogy ennyi eleg volt (-quit vagy -exit), es akkor nem olvassa vegig az egesz hobelevancot.
- A hozzászóláshoz be kell jelentkezni
Kivéve ha indexel.
A find esetében az a baj azzal, hogy az első találatig végzi a kereést, hogy igen ritka, hogy az a találat az legyen, amire az illető vágyik. Valszeg anno ezért is cseréltem le fd-re, és most az fzf is azért testzik, mert a sok találatból beállíthatóan úgy jeleníti meg ahogyan számomra fontos lehet, és kiértékelhető.
- A hozzászóláshoz be kell jelentkezni
Indexelést én is csinálok, ha a sebesség fontos. Plusz nálam is fd van a find helyett, valóban gyorsabb. Igazából az sem baj, ha néha nem azonnali az fzf, mire elkezdem írni az első 1-2 keresési karaktert, addigra menet közben beolvassa, amit kell, úgyis a user reakcióideje a szűk keresztmetszet olyankor, mikor sok ezer elemről van szó. Ilyen pár elemes szerveres választószkriptnél nem lényeges a sebesség, nem kell indexelni sem.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni
Zárójelben kérdezem, hogy "fish" shell-t ismered?
- A hozzászóláshoz be kell jelentkezni
Igen. Egy időben kipróbálásmániás voltam, és akkor leteszteltem, de akkor maradtam a zsh-nál. Az sokkal jobban megfogott, jobban alakítható volt, de aztán visszatértem az alap bash-hez. Most 2-3 éve a teljesen minimalista rendszereket kedvelem, semmi sallang.
- A hozzászóláshoz be kell jelentkezni
És miért nem használod a shell saját select parancsát? (Igen, tudom, fzf-fel akarod megoldani.)
- A hozzászóláshoz be kell jelentkezni
A select is működhet, végül baj nincs vele, de az fzf gyorsabb, mivel fuzzy, 1-2 karakter után általában megtalál minden relevánsat, kiszűri, amolyan regexp módjára, de speciális regexp karaktere és krix-krax nélkül. A hagyományos selectnél végig kell olvasnod a listát, amíg meg nem találod benne, amit kerestél, ami főleg akkor elég bosszantó, ha a listán több elem van, mint ami egyszerre a képernyőre fér, meg annyi opció van, hogy több karakteres az azonosítójuk.
Persze a selectnek is megvan az előnye, minden rendszeren ott lesz, így akár valami ősi BSD variánson is lehet használni, és ha csak nagyon kevés elem közül kell választani, akkor elég. Nem kell nekiállni ilyenkor fzf-et forráskódból kipörgetni. Minimalistább, ha úgy tetszik. Más részről az fzf sem probléma, mert azt amúgy is érdemes a rendszerre feltenni, nagyon sok mindenre jó, többféle dolgot meg tud gyorsítani, pl. history visszakeresést, fájlmegnyitást, stb., így én ezt nem spórolnám le. Végső soron preferencia kérdése. Nincs legjobb megoldás, ki mit szokott meg, felhasználásához mi a legjobb.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni
Ezt azzal egészíteném ki, hogy még csak forrásból sem kell fordítani. Ubuntu, Debian, Arch stb ott van a saját repojukban. Egyszerűen mindennapos lett az fzf ahogy nézem. Nem kell már mókolni hozzá. Pont úgy ahogy a zstd is elfogadott lett, mint gyors tömörítő a zip, rar stb helyett. Sőt az Arch linux már a csomagjait is zstd-be tömöríti alapból.
- A hozzászóláshoz be kell jelentkezni
Általában főbb BSD-ken is ott van a tárolókban (fzf és zstd is), de előfordulhatnak régebbi rendszerek, amiknél nincs. Azokon van az, hogy forráskódból pörgeted. Egyik se nagy kódméret, nem fordul lassan, de néha reszelni kell hozzá, ha a libek sincsenek meg még fordításban, meg ha meg is vannak, akkor is szórakozni lehet szükséges, hogy leforduljon.
Linux alatt a zip és rar sose volt elfogadott. A zip azért, mert ott volt helyette mindig is a gzip, a rar meg azért nem, mert a betömörítő része proprietary (maga a formátum és a kitömörítő viszont FOSS), és nem kezeli normálisan a jogosultságokat, ezért archiválásra nem jó önmagában (bár elég lehet tar.rar formájában). Épp így a 7-zip is ugyanezért nem volt elfogadott, még p7zip formájában sem, helyette az xz nyújtotta ugyanazt (LZMA2 tömörítés). A zstd leginkább az xz-t és a gzip-et szorította ki. Egyébként én is imádom, veszedelem gyors. Nagyon meg lehetett érezni, mikor az Arch elkezdte tömöríteni zstd-vel a csomagokat és az initramfs-t, mennyivel gyorsabb lett a boot és a csomagok kibontása. Tovább gyorsult a pacman a párhuzamos csomagletöltéssel is, néha így már olyan gyors, hogy alig lehet a sorokat elolvasni, pikk-pakk megvan egy frissítés, aki ezt még nem szokta meg, mert lomhább apt, dnf, Windows update-eket látott eddig, annak már ez a sebesség morbid. Jó, ennek az is feltétele, hogy ne fusson lassú gépen, egy HDD-s, P3-P4-es gépen nem lesz ilyen gyors, de még azon is gyorsabb lesz sokkal, mint a hagyományos megoldások ugyanazon a hardveren.
Az fzf teljesen univerzális, nem csak elemválasztásra, fájlkeresésre lehet bedrótozni, hanem shell-be is függvényekhez, aliasnak, gyors mappaváltáshoz, history kezeléshez, mime típusok kezeléséhez, gyors fájlmegnyitásra, launchernek (pl. dmenu, rofi, wofi, stb. helyett), be lehet drótozni programokba (pl. Vifm-be én bedrótoztam, de vannak hozzá vim, neovim, Emacs pluginek is). Amolyan svájci bicska, sok mindenre jó, sok script használja nálam is, gyors fájlmegnyitástól az online rádióhallgatáson át a lemezkép/partíció felcsatolásig, mime társítások kezeléséig. Olyan alap program lett, hogy az ember nem is érti, hogy hogyan volt meg régebben nélküle.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni
No csináltam egy megoldást. A sokadik keresésben találtam egy teljesen más fzf-es használatot. De a gondolkodásmódja viszont használhatónak tűnt, és azt felhasználva meg is tudtam oldani. A lényege, hogy létrehoztam egy file-t, amibe felsoroltam a menüpontokat és a hozzájuk tartozó parancsokat amit le kell futtatni a kiválasztáskor. Ezeket elválasztottam egy kettősponttal, tehát a kettőspont lett a delimiter. Például
BACKUP:ssh name@ip -p 8911 -i ~/.ssh/user
ICINGA:nmcli connection up userlaptop > /dev/null;ssh name@ip -i ~/.ssh/user;nmcli connection down userlaptop > /dev/null
REMOTE:ssh name@ip -i ~/.ssh/user
Aztán csináltam egy scriptet ami ezt tartalmazza:
#!/bin/bash
file="/path/server.txt"
selection1=$(cut -f1 -d ':' ${file} | fzf --prompt='Válassz szervert: ' --layout=reverse --no-multi)
selection2=$(grep $selection1 ${file} | cut -f2 -d ':')
eval "$selection2"
Definiáltam a file változóban ezt a szöveges filet, amiben az adatokat vannak. A selection változó tartalmazza azt a szerver nevet amit kiválasztottam az fzf menüjével. A selection 2 változó meg tartalmazza a kiválasztott szerverhez kapcsolódó parancsokat. Ezután parancsként értelmezem a selection2 függvény tartalmát. Lehetne bash -c -vel is futtatni, de így független a shelltől.
- A hozzászóláshoz be kell jelentkezni
Részemről TAB karakter javasolnék delimiter-nek, hogy a jövőben is minél univerzálisabb tudjon maradni. Edit-áláskor ezt is könnyű használni és az olvashatósága is jó.
- A hozzászóláshoz be kell jelentkezni
A $selection1 helyett én ilyesmit írnék: "^${selection1}:", a cut pedig -f 2- és akkor nem kell aggódni a későbbeni kettőspontok miatt.
- A hozzászóláshoz be kell jelentkezni
#!/bin/bash
file="./server.txt"
sel=$(fzf --prompt='Válassz szervert: ' --layout=reverse --no-multi < <(cut -f1 -d: "${file}"))
echo $(awk -v pat="^$sel" -F ":" '$0 ~ pat { print $2 }' ${file})
# mehet echo helyett az eval
- A hozzászóláshoz be kell jelentkezni
Az awk így meg csak a második mezőt adja vissza, ami gond, ha van kettőspont a parancsban, ezért javasoltam a cut -f2- megoldást. Fixme, de awkban csak ciklussal lehetne a másodiktól az összes mezőt kiíratni.
- A hozzászóláshoz be kell jelentkezni
awk '{ $1="" ; print }'
Azért nem olyan eget verően nehéz :-)
- A hozzászóláshoz be kell jelentkezni
Hahh, hacsak úgy nem :)
Báááár...
fisher@s1:~$ echo a:b:c:d | cut -d: -f2-
b:c:d
fisher@s1:~$ echo a:b:c:d | awk -F: '{ $1=""; print }'
b c d
- A hozzászóláshoz be kell jelentkezni
Jogos a kontra, szigorúan csak a fixme részre reagáltam, a szövegkörnyezetet teljesen figyelmen kívül hagytam - így olyan választ adtam, ami s te felvetésedre éppen válasz, de az eredeti kérdéshez használhatatlan.
Ha általánosságban nézem a dolgot, és odáig már eljutottam, hogy egy shell-scriptben (!) be kell gyűjtenem valami adatot, le kell tárolnom egy változóban, valamint arra is oda kell figyelni, hogy valahol van benne egy db. kettőspont (és esetleg lehet mögötte másik), és el kell dobni a kezdő kettőspontot és az előtte levő egyebeket, akkor én 2 lehetőséget látok:
a)
v=$( valamilyen parancssorozat | X )
- ahol X végzi ezt a : alapú szabdalást
vagy pedig
b)
v=$( valamilyen parancssorozat )
v="${v#*:}"
- ahol a shell végzi el ugyanezt a szabdalást. ( A második értékadás helyett akár ezt is használhatnánk:
v="${v/*([^:]):}
de ezt írja le akinek két anyja van. Egyrészt mert a felhasználók minimum 99,99%-a nem is ismeri ezt a kibővített globbing formát, másrészt pedig na.)
Mindenki maga dönti el, hogy mit használ X-ként (*) vagy mikrooptimalizál-e vagy nem. Az első - a) - megoldásban van a "valamilyen parancssor" és egy plusz pipe létrehozás, két átirányítás (pipe-ba bele, pipe-ból kifele), az X processz létrehozása, és magának az X-nek a futási ideje. A második - b) - esetben szintén ott van a "valamilyen parancssor", és 2 db shell belső művelet - a kicsit ritkán használt formájú változóhelyettesítés és a változóértékadás. Sajnos az emberek többsége számára a második forma olvashatatlan, pedig a plusz processz létrehozás miatt az első jóval drágább (azaz lassabb).
(*) a teljesség igénye nélkül
- a leglogikusabbnak látszó a cut -d: -f2- # ha már pont erre van kitalálva
- de ugyanilyen jó lehet egy sed -e 's/^[^:]*://' # mondjuk ezt a regex miatt sokan undorodva kiköpik
- vagy egy awk '{ sub( "^[^:]*:", "", $0 ); print }' # sajnos a regex nem lett szebb
(és nyilván Perl, Python, PHP, Basic, Pascal és egyéb kódok is használhatók. Meg valszeg egy rakat egyéb standard util.
- A hozzászóláshoz be kell jelentkezni
Srácok. Értékelem, hogy még agyaltok rajta, és a megírt scriptemet alakítgatjátok tovább vagy épp át, de úgy látom erősen túlbonyolítjátok a koncepciót (pl olyan mértékű regexp, amit kezdő úgysem tud értelmezni, amit én csináltam meg könnyen felfogható). Ráadásul semmilyen módon nem fordulhat elő benne soronként több kettőspont. Pl ezért választottam ezt. Ez csak annyi adatot tartalmaz mint szerver neve, és a hozzá kapcsolódó ssh parancs paraméterezése. Ennyi, nem több. Kár bonyolítani. Kivéve persze, ha valaki ez alapján egy olyan menüt állítana össze magának, ami jóval bonyolultabb parancssorozatokat tartalmazna :)
Azóta ugyanezt megcsináltam sshfs-ként is, hogy ne csak felsshz-ni tudjak, hanem fel is tudjam mountolni a filerendszerét, ha arra van szükségem (ugye mindent konzolból csinálok szinte, mert tiling WM-et használok), és ugye ott sem jön elő paraméternek a kettőspont, tehát csak a parancsot és egy paramétert kellett átírnom, és máris kész lett ez a menü is.
- A hozzászóláshoz be kell jelentkezni
Ah, nekem pont jo igy, a legegyszerubb dologra nem gondoltam csak. Es ugyan most pont nem kellett, de jol fog ez meg jonni :)
- A hozzászóláshoz be kell jelentkezni
Én is így vagyok ezzel. Alapvetőleg nem volt ez létfontosságú script, de gyorsítja a munkám egy kicsit, meg ebből is (mint mindenből), lehet tanulni. Persze csinálhattam volna dmenu, vagy rofi launcher használatával, de igyekszem minimálisra venni a Linuxom. Még az usb driveok mountolása, meg mtp is mind saját, vagy 7-8 éves scriptek átírásával végzem el. Semmi udiskie, vagy udevil, mert csak foglalja a memóriát. Most egy boot után a linux csak 187MB memóriát foglal, pedig van grafikus felület, meg minden progi amire szükságem van :D
Közben amúgy kiegészítettem a scriptet, mert akkor megcsináltam ezt olyan változatban is, hogy nem csak ssh-val tud felkapcsolódni, hanem sshfs-el felmountolja ugyanezen szerverek driveját is, és rögtön nyit egy konzolos filemanagert (vifm), és odanavigál kapásból. Kilépéskor meg persze szabályosan leválasztja. Úgyhogy a kettőspontot mégiscsak lecseréltem tabulátorra delimiternek,
- A hozzászóláshoz be kell jelentkezni
"Úgyhogy a kettőspontot mégiscsak lecseréltem tabulátorra delimiternek"
Ha rám hallgatsz, akkor azt csinálsz, amit akarsz, de a cut -d: -f2-höz csak egy - kell, és nem kell fájjon a fejed a kettőspontok miatt.
A tab meg akkor lesz vicces, amikor valamelyik okos editor lecseréli szóközökre, mert csak.
- A hozzászóláshoz be kell jelentkezni
Ez pontosan mit csinálna? Mert ha most ezt használom, akkor nagyon nem az történik aminek kellene, igaz közben a delimiter a fileban tabulátor lett. Amúgy én még nem találkoztam linux alatrt olyan editorral, ami szó nélkül lecserélt volna bármilyen tab-ot vagy akármit bármi másra, pedig használtam már vi, vim, neovim, mc beépített editora, nano, micro -t is.
- A hozzászóláshoz be kell jelentkezni
Hát, akkor persze hogy a -d: nem azt csinálja :)
- A hozzászóláshoz be kell jelentkezni
cut -d: -f2 a kettosponttal evlasztott mezokbol a masodikat adja vissza
cut -d: -f2- a kettosponttal evlasztott mezokbol a masodiktol kezdve a sor vegeig mindent visszaad.
fisher@bnc0:~$ echo a:b:c:d | cut -d: -f2
b
fisher@bnc0:~$ echo a:b:c:d | cut -d: -f2-
b:c:d
Persze ha a kettospontot lecsereled, akkor erheto modon ez nem fog mukodni :)
- A hozzászóláshoz be kell jelentkezni
Fisher
köszi az infókat, de akkor ez semennyivel nem egyszerűbb nekem, mint az eredeti amit írtam, hiszen ugyanúgy meg kell adni, hogy mi a delimiter, és hogy a másodiktól kezdve a végéig adja az megint nem jó, mert időközben lett egy harmadik oszlop, ami meg az sshfs változat parancsait tartralmazza (ezért is dobtam a kettőspontot)
- A hozzászóláshoz be kell jelentkezni
A cut-nál a -d: azt jelenti, hogy kettősponttal elválasztott mezők vannak. Ha közben átálltál TAB-ra, akkor ez értelemszerűen már nem jó. Ha TAb a mezőelválasztó, akkor nem kell a -d: opció, mert az pont za alapértelmezett delimiter a cut-nak. A -f2 helyett a -f2- pedig azt jelenti, hogy nem a második mezőt, hanem a második, harmadik, negyedik, .... - azaz az összes mezőt ki fogja neked adni, tehát ahogy eredetileg is mondták: ez azért jó, mert ha véletlenül van több elválasztójel a sorban, akkor is megkapod az első mező kivételével az összeset.
Ami meg az editort illeti, addig jó neked, amíg nem találkozol ilyen furcsa viselkedéssel. Én speciel kevéssé az editort mondanám, hanme a különböző terminálokban, terminál emulátorokban a kopipasztát, az szeret tabot szóközre cseélni :-(
- A hozzászóláshoz be kell jelentkezni
Köszi ezt nem tudtam. Lehet hogy ennek ellenére megtartom a delimiter kapcsolót, hogy ha változna a cut parancs default delimitere, akkor is biztosan működőképes maradjon a jövőben.
Linux alatt sem találkoztam még amúgy olyan terminal-al, ami cserélgette volna a tab-okat. Jelenlegi suckless terminal sem csinál semmi ilyen csúnyákat, de az előtte levő alacritty, xterm, konsole, termite stb-k sem csináltak ilyet sem copyzáskor sem máskor,
- A hozzászóláshoz be kell jelentkezni
A tabot nem ajánlom delimiternek. Működhet, de komplikációk lehetnek belőle, ha a forrásfájlt véletlenül olyan text editorral módosítod, ami a tabokat lecseréli szóközre. Én ebben az esetben vesszőket használnék inkább, úgy csv-nek is használható a fájl, bár a kettősponttal sincs baj.
Amúgy meg nagyon helyes, hogy dolgozol ilyen scriptek írásával. Ebből lehet tanulni ténylegesen a scriptelést, shelles dolgokat. Múltkor itt a kolléga nem hitte el nekem egy másik topikban, hogy könyvből meg mindenféle bootcamp-ből nem fogják ezt elméletileg megtanulni, ezt csinálni kell a gyakorlatban, próbálkozni vele. Eleinte lehet gányolás lesz de már akkor is sikerélmény, hogy ha végre működik, onnan meg lehet fejlődni. Rendszerépítésnél is jól jön, hogy nem csak minimalista a rendszered, de érted is mit csinál, mivel a legtöbb funkciót az általad írt scriptek és konfigfájlok alkotják, és nem ilyen millió kódsoros, nem tudom hány API-n/liben átszőtt absztrakciós réteghegyekből álló gigás szutykok futnak, amikről nem is érted hogy működnek, meg rá vagy szorulva miattuk nagy cégek szutyok szoftvereire, meg küzdesz bughegyekkel, amit egyedül esélytelen lesz megoldani.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni
(Egy cseppet lehet javítani a dolgot, de tökéletessé ez a trükk se teszi:
echo a:b:c:d | awk -F: 'BEGIN { OFS=FS } { $1=""; print }'
:b:c:d
Szóval marad a sub.)
- A hozzászóláshoz be kell jelentkezni
Annyi még a többiek által írtakon kívül, hogy fzf-nél ellenőrizd a végén, hogy végül választottak-e valamit, vagy csak úgy választás nélkül léptek-e ki belőle. Mert előfordul, hogy véletlenül indítod el a scriptet, kilépsz belőle, akkor ne próbáljon hülyeségre műveleteket elvégezni.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni
Ez igaz. Csináltam bele egy Kilépést, mert sima ESC-re is indította az adott menüpontot. Köszi.
- A hozzászóláshoz be kell jelentkezni
Közvetlenül az fzf nem tud ilyet önmagában. Shell scriptben viszont megoldható, pl. két fzf parancsot ágyazol egymásba, első választáskor szervert választasz, akkor kilép az első fzf, visszaadja a kiválasztott elemet, amit elmentesz egy változóba, majd mindjárt indul a második fzf, ahol a műveletet választod ki.
Esetleg csak egy fzf, és utána case ... esac szerkezettel vizsgálod, hogy a kiválasztott string milyen mintára illeszkedik, és aszerint rendelsz hozzá futtatandó parancsot.
Szerk.: alternatív megoldásként csak egy darab fzf, de case szerkezet helyett többféle gyorsbillentyűt lehet definiálni fzf-ben, így ha nem csak Enterrel választod ki az elemet, hanem egy alternatív billentyűkombót definiálsz, és ahhoz rendelhetsz parancsot, amit azon az elemen fog végrehajtani, amin a kurzor van.
“Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”
- A hozzászóláshoz be kell jelentkezni