Sziasztok,
Van otletetek arra, hogy ha egy subshellben hatterben futtatok egy parancsot, hogyan szerezzem vissza enter leutese nelkul a promptot?
pl: ( ls & )
Elore is koszi a valaszokat.
cU
- 5689 megtekintés
Hozzászólások
Röviden: nem tudod. Hosszabban: xdg-open, esetleg NOHUP, stb. trükkös alkalmazása.
--
Coding for fun. ;)
- A hozzászóláshoz be kell jelentkezni
Androidon ez működik, máshol most nem tudtam kipróbálni:
echo | ( ls & )
- A hozzászóláshoz be kell jelentkezni
Érdekes megközelítés. ls && echo -n működni látszik.
- A hozzászóláshoz be kell jelentkezni
És nem is jó. Elsőre működött, utána már nem.
update: na jó, lassanként csak felébredek... :)
Szóval annyi a történet, hogy ha parancssorból indítasz egy background processzt, ami ír a stdout/stderr eszközökre, akkor az enter megnyomása után rögtön megkapod a promptot, csak a háttérbe tett processz még utána írja a saját szemetét.
Tehát amit tenni lehet, hogy átirányítani a háttérbe tett programok kimenetét valahova, hogy ne az aktuális konzolra szemeteljen.
- A hozzászóláshoz be kell jelentkezni
Nem értem, pedig szeretném.
- A hozzászóláshoz be kell jelentkezni
Mit nem értesz belőle? :)
Ha elindítasz egy background process-t, akkor a promptot azonnal visszakapod, majd ha az ír valamit a stdout/stderr eszközökre, akkor odaszemetel vele az orrod alá és úgy néz ki, mintha a háttérben futó program lenyelte volna a promptodat.
- A hozzászóláshoz be kell jelentkezni
Hát így már értem.
(ls & ) ; sleep 1
- A hozzászóláshoz be kell jelentkezni
Én arra tippelek hogy a probléma gyökere ott van, hogy a derék ember elindít mondjuk egy mplayert a háttérben, és utána küzd a terminálban makacsul megjelenő sorokkal. Ha tényleg így van, akkor a screen lehetne jóbarát (vagy van még egy valami, ami olyan mint a screen, de nem az, de majdnem ugyanaz, de vagy jobb vagy nem, de az biztos).
- A hozzászóláshoz be kell jelentkezni
Hát ha valami X-es izé szemetel, akkor
Xparancs 2>&1 >/dev/null &
lenne a megoldás.
De akkor miért épp az ls volt a példa? ;)
- A hozzászóláshoz be kell jelentkezni
A 2 átirányítást cseréld fel, mert ez nem az ami neked kell :-)
- A hozzászóláshoz be kell jelentkezni
Hm. Mindig így használtam, de igazad van, nem ez a szabványos. :)
- A hozzászóláshoz be kell jelentkezni
Nem az a baj, hogy nem ez a szabályos, hanem így nem jó. Pl. A cp parancs, ha paraméter nélkül hívod, az stderr-re dob hibaüzenetet. Ha jól tippelem, te mind a stderr-t, mind az stdout-ot át akarod irányítani. Vizont mivel a paranccsor feldolgozása balról jobbra történik, a te megoldásoddal először az stderr-t átirányítod oda, ahova az stdout (az átirnyítás pillanatában) megy. Ez a képernyő. (Azaz a képernyőről a képernyőre.) Utána az ettől független stdout-ot a fekete lukba. De attól még a hibaüzenet látszik a képernyőn. Ahogy én írom (javaslom), úgy mind a kettő megy a devnullba.
$ cp a 2>&1 > /dev/null
usage: cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file target_file
cp [-R [-H | -L | -P]] [-f | -i | -n] [-alpvx] source_file ... target_directory
$ cp a > /dev/null 2>&1
$
- A hozzászóláshoz be kell jelentkezni
Furcsa, nekem ez eddig sohasem tűnt fel. Amilyen parancsoknál használtam, azoknál mindig eltüntette a hibaüzeneteket, míg a 2>&1 nélkül a képembe tolta őket.
De most kipróbáltam, linuxon is így megy (gondolom, nálad BSD van, ezért próbáltam ki)
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
mplayer -quiet -really-quiet
És a tmux-ra gondoltál screen-helyettesítőként
- A hozzászóláshoz be kell jelentkezni
tmux! Az!
Kár hogy holnapra megint elfelejtem :(
- A hozzászóláshoz be kell jelentkezni
Mnemonik a man fejléc: Terminal MUltipleXer.
- A hozzászóláshoz be kell jelentkezni
A program amit hatterben futtatok, kb 2-3 mpig fut, /etc/profile-bol aztan kiir vmit.
Nem szeretnem a logint hatraltatni azzal h a usernek varnia kelljen mig lefut, ezert subshellbol futtatom hatterben, de mivel biztos vagyok benne h lesznek olyanok akik reklamalnak majd, h meg egy entert kell nyomniuk ezert gondoltam hatha nektek van otletetek.
- Ennel fogva sajnos a sleepes megoldas nem jo.
- Valtozot nem tudsz kihuzni subshellbol.
- Fileba atiranyitva ugyanott vagy, hiszen egyszer ki kell irni. Esetleg job controllal lehet jatszani, h amint a processem lefutott kicatelem a filet es letorlom. Mondjuk szeretnem tempfile nelkul megoldani.
- A hozzászóláshoz be kell jelentkezni
És mit szeretnél, mi történjen ha ez a 2-3 mp letelte előtt a felhasználó már elkezd dolgozni (parancsot gépelni, végrehajtani stb.)? Hova kerüljön a háttérben futó progi kimenete? Nem zavarná össze őt még jobban, mint a kényszerű várakozás tenné?
- A hozzászóláshoz be kell jelentkezni
Az a gond, h a script amit futtatok egy eleg nagy filet huz be httpn keresztul intranetrol, de mi van ha vmi miatt mondjuk 20mpig fut le, akkor 20 mpig nem tud a user semmit se csinalni?
Raadasul amennyire csak lehet real-time adatokat kene mutatnia :)
- A hozzászóláshoz be kell jelentkezni
egmont kérése arra vonatkozott, hogy ha nem várod meg a 20 secet ilyenkor, a user meg már dolgozik, akkor mit szeretnél:
- beleszemetelni a te vackodat a munkája közepébe, mert fontos (vállalva, hogy fogalmad sincs, épp mi van a képernyőn, uh zagyva lehet, ill tuti sűrűn fogsz csuklani)
- ilyenkor már inkább letojni, amit ki akar írni.
my 2 cents, hogy ilyet inkább ne csinálj loginkor.
- A hozzászóláshoz be kell jelentkezni
Nem voltam teljesen preciz, mert van egy 3 masodperces timeout a curl-on, szoval max 3 masodperc telik el a script futasa es az adatok kiirasa kozott, ha tobb akkor exit 1.
Arrol lenne alapvetoen szo, h ha a szerver monitorozva van akkor ezt kiirja, igy az adminok tudjak, h ovatosan barmifele valtoztatassal...
- A hozzászóláshoz be kell jelentkezni
Még mindig nem érted a kérdésemet. Tegyük fel, a felhasználó nem várja ki ezt a 3mp-et, hanem már elkezd dolgozni. Vagy elkezdte már begépelni a parancsot, vagy esetleg le is ütötte az entert és elindította kedvenc programját ilyen gyorsan. Ez után letelik a 3mp és a curl-nak közlendője támad. Mi történjen, hogyan képzelted el???
- A hozzászóláshoz be kell jelentkezni
Ertem a kerdest, de a tapasztalatok szerint ennyi ido alatt senki nem fog parancsot kiadni (nagyjabol ket masodpercen belul megjelenik az info).
- A hozzászóláshoz be kell jelentkezni
Akkor mi a baj az előtérben futtatással?
- A hozzászóláshoz be kell jelentkezni
Ha a shell history megmarad két belépés között, akkor onnan akármit is vissza lehet szedni és elindítani. Egyébként meg mi van, ha az ssh banner-t és/vagy a motd-t állítgatod attól függően, hogy épp milyen státuszban van a szerver? Mondjuk a gond ezzel ott van, hogy a monitoringnak kéne odaszólni az adott gépre, hogy átbillentették az állapotát.
- A hozzászóláshoz be kell jelentkezni
http://hup.hu/node/132219#comment-1729579
Kb. ezt feszegettem, csak ennyire nem részleteztem az ötletem. De arra is rájöttem, hogy nem 100%-os módszer (kérdés, mennyire kell betonbiztosnak lennie?)
A motd és hasonlók azért nem jók (szerintem - de ez csak utólag jutott eszembe), mert ha már be van jelentkezve a delikvens, akkor nem fog értesülni a váltásról. És amíg élesből maintenance módba kapcsolnak, addig nem is baj, max. telefonálgat feleslegesen az admin kolléga, de ha akkor kapcsolja vissza valaki élesben, mikor be van jelentkezve és tovább dolgozik abban a hitben, hogy még mindig lehet...
Szóval erre valami olyan megoldás kellene, ami azonnal értesíti a bejelentkezett usereket is.
Még1x: szerintem.
- A hozzászóláshoz be kell jelentkezni
Mivel nem tudom hogy pontosan mit kellene megjeleníteni, de ha pl. csak egy egyszerű üzenetet, akkor man tput, man terminfo, tput sc, tput rc, tput cup és ezeket belekopácsolni a scriptbe.
Ízlés szerint lehet színezni is a szöveget.
- A hozzászóláshoz be kell jelentkezni
cron-bol percenkent frissiteni az adatokat, letenni egy file-ba, es ezt a kesz file-t tolni a juzer arcaba?
- A hozzászóláshoz be kell jelentkezni
Ez eleg sok felesleges forgalmat generalna parezer szerver eseten :)
- A hozzászóláshoz be kell jelentkezni
Nem artana tudni, hogy mi a megoldando feladat ;-)
- A hozzászóláshoz be kell jelentkezni
A feladatot mar megoldottam, csak a prompt megjelenitesere lenne szuksegem :)
Most azon gondolkodom, h Fisher javaslata alapjan restoreolom a kurzort es a scriptbol eledobom a promptot.
- A hozzászóláshoz be kell jelentkezni
Hát, én nem épp így csinálnám. Feltéve ha tényleg csak egy kis üzit kell megjeleníteni, hanem az üzenet elejére tput sc, pozicionálni pl. az első sorba (hátha nem ott áll :D), üzenet és a végére tput rc.
- A hozzászóláshoz be kell jelentkezni
Az uzenet kb igy nez ki:
\n
ez egy prod szerver
\n
vigyazz mert monitorozzuk :)
\n
- A hozzászóláshoz be kell jelentkezni
Nem igazán értem a koncepciót.
X időközönként bekapcsoltok valami monitorozó szoftvert, amiről értesíteni akarod a belépőket, ha épp aktív a monitor?
- A hozzászóláshoz be kell jelentkezni
A monitoring mindig fut. A script lekerdezi h a gep eppen aktivan van-e monitorozva vagy esetleg maintenance modban van.
A dolog lenyege az, hogy megelozzem h az adminok a gep maintenance modba rakasa nelkul csinaljanak vmit, ami ticketet generalna a monitoring teamnek.
A statusz lekeresen kivul annyit tud a cucc, h commandlinebol tudod maintenance-be rakni a gepet es nem kell kattintgatni a webes feluleten hozza.
- A hozzászóláshoz be kell jelentkezni
Ha előveszem a gépem, majd írok pár szót, mert szerintem ez így nem túl jó ötlet. Csak ne felejtsem el...
Elővettem... :)
Szóval ha a monitorozó szoftver ezt lehetővé teszi, akkor valami olyasmit csinálnék, hogy amikor maintenance módba kapcsol, akkor ezt jelzi pl. egy fájl létrehozásával a felügyelt rendszeren, amikor visszavált élesbe, akkor törli a fájlt (vagy fordítva)
Így csak üzemmód váltáskor kell foglalkozni vele és nem kell trükközni a belépéskor lefutó szkriptben, mindössze ellenőrizni kell a fájl létét/esetleg tartalmát.
Másik tippem az lett volna, hogy ne a stdout-ra küldd az üzenetet, de ez már macerásabb, mert X-es felületen még lehet valami üzenetet feldobni, de ha ssh-n megy be... (régi, szép idők, VT220-as vagy nagyobb terminálok, ahol volt státusz sor, ahova ilyesmit ki lehetett volna nyomni egy ANSI escape szekvenciával... :) )
Szóval ssh-n nem nyerő, mert bármit csinálsz, ugyanúgy beleszemetel a képernyő tartalmába és nyomkodni kell az entert, hogy lásd a promptot.
- A hozzászóláshoz be kell jelentkezni
koszi :)
Az a gond, h ugye a webes illetve a nativ feluletrol is maintenancebe lehet rakni a gepet es ezt vhogy detektalnom kell az sshs belepes soran.
Jelenleg ugy oldottam meg, h letarolom a kurzor pozicoit, kiirok egy kamu promptot es visszarakom a kurzort a vegere. Nem tul szep megoldas sajna :/
- A hozzászóláshoz be kell jelentkezni
Még egy tipp jutott eszembe: a belépéskor háttérben lefutó program is létrehozhatna egy fájlt a user saját könyvtárában és (már nem emlékszem, hogyan) a promptot is be lehet állítani úgy, hogy minden megjelenítése előtt futtasson le egy parancsot, ami átalakíthatja magát a promptot is.
Így lehet valahogy megoldani, hogy pl. git repoba tartozó könyvtárba lépve a prompt mutassa, hogy pl. melyik branch aktív az adott helyen. (nem tudom, érthető-e, hogy miről beszélek)
- A hozzászóláshoz be kell jelentkezni
hmm, abszolut erheto, tetszik az otlet :)
- A hozzászóláshoz be kell jelentkezni
Úgy, hogy a .bashrc-ben a PS1 értékadásába írhatsz $(), avagy `` helyettsítést. Így a kód lefut, a kimenete pedig a PS1-be kerül. Ráadásul ez lényegében tetszőlegesen bonyolult lehet.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Ez így nem csak egyszer fut le? (már nem emlékszem, akár igazad is lehet)
- A hozzászóláshoz be kell jelentkezni
Nem. Minden alkalommal lefut, amikor a promptot generálja. Ennek az az oka, hogy a promptot a $PS1 kiíratásával teszi ki, viszont a PS1-ben van olyan helyettesítés, ami kódot futtat.
Amit mondok, abban biztos vagyok, mert így írom ki az előző parancs exit kódját sárgával a promptomba, ha viszont az exit kód nulla, azt nem íratom ki, hiszen az a normális.
PS1='\[\e[m\][`RET=$?; [ $RET -ne 0 ] && echo "\[\e[33;1m\]$RET\[\e[m\] "`\u@\h \w]\$ '
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Figyelj!
PS1="$(pwd) > "
PS1='$(pwd) > '
Az első forma az értékadáskor futtatja le a pwd-t, tehát tulajdonképp konstans promptod van. A második az értékadáskor nem futtat semmit, ellenben a prompt minden aktuális kiírásánál igen, tehát mindig a helyes PWD látszik.
(A pwd parancs példa, *tudom* hogy bash-ban ezt lehet millió más módon is.)
- A hozzászóláshoz be kell jelentkezni
Erről beszélek én is... pontosabban nekem az első variáció ugrott be locsemege hozzászólásáról.
Inkább azt a 2>&1-t magyarázd meg, hogy a ...ba működhetett korábban a hibás sorrend ellenére! ;)
- A hozzászóláshoz be kell jelentkezni
Ebben az esetben miért így viselkedik az aposztrof és az idézőjel? Általában nem így szokott. Néztem most, a PROMPTING részben nem látom a doksiban, de elég felületesen olvastam.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Ha idézőjelek (") közé teszel egy stringet, akkor a shell kifejti a benne található $ kezdetű részeket és e szerint a backticket is.
Ha aposztrófok (') közé, akkor ez a helyettesítés elmarad.
Ez nem a prompting szakaszban van leírva, hanem... na ezt majd Zahy, nekem nem jut eszembe.
update: Quoting a man bash alatt. És rosszul emlékeztem, úgy tűnik, a backslash kezdetű spec. karaktereket is behelyettesíti idézőjelek közt...
- A hozzászóláshoz be kell jelentkezni
A kérdést se értem. A modern shellek, ha a PS1-ben parancshelyettesítést látnak, akkor prompt kiíráskor azt végrehajtják. Az, hogy mi módon rakom be a helyettesítést, tök mindegy, így is tehetném:
PS1=\$\(pwd\)\ \> \{space}
Az aposztróf mindig takar mindent, az idézőjel meg pl. pont az öszes dollárjeles helyettesítést ($v, ${v}, $(cmd), $(( kif )) - vagy helyette $[ kif ] ) - és persze a backtick-kel is ugyanígy - megcsinálja még a parancssor feldolgozásakor.
- A hozzászóláshoz be kell jelentkezni
Köszönöm, így már világos.
Azt nem tudtam, hogy lényegében olyan ez, mint az eval. Egyszer végrehajtódik értékadáskor, utána pedig az értékadáskor keletkezett produktum minden egyes prompt kiírás alkalmával értelmezésre és végrehajtásra kerül.
Tehát, ha jól értelek, aposztrof esetén értékadáskor marad a futtatható kód, ami a prompt kiírásakor végrehajtásra kerül.
Idézőjel esetén pedig az értékadáskor már lefut a kód, majd a keletkezett statikus string kerül kiíratásra a prompt kiíratásakor.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
?
--
A legértékesebb idő a pillanat amelyben élsz.
https://sites.google.com/site/jupiter2005ster/
- A hozzászóláshoz be kell jelentkezni