PHPStan (PHP Static Analysis Tool), nástroj pro statickou analýzu a hledání chyb v PHP kódu, byl vydán ve verzi 2.0. Po třech letech od vydání verze 1.0. Podrobný přehled novinek v poznámkách k vydání na GitHubu.
Multiplatformní open source voxelový herní engine Luanti byl vydán ve verzi 5.10.0. Podrobný přehled novinek v changelogu. Původně se jedná o Minecraftem inspirovaný Minetest (Wikipedie) před měsícem přejmenovaný na Luanti.
Vyšla nová verze open source ticketovacího nástroje Redmine 6.0.0. Tato verze přináší 146 vylepšení a oprav. Došlo k vylepšení UI, upgrade na Rails 7.2 a Ruby 3.3, byla provedena integrace asset pipelines s Propshaft a mnoho dalšího, viz kompletní changelog.
Firefox slaví 20 let (YouTube). Verze 1.0 byla vydána 9. listopadu 2004.
Z proprietárního světa: Přijdete ráno do práce a zjistíte, že všechny Windows Servery byly neplánovaně automaticky upgradovány z verze 2022 na verzi 2025.
Byl vydán Debian 12.8, tj. osmá opravná verze Debianu 12 s kódovým názvem Bookworm. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 12 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.
Standard Matter (Wikipedie, GitHub), původně Project Connected Home over IP (CHIP), pro propojení IoT a domácí automatizaci byl vydán ve verzi 1.4.
Fedora Linux je aktuálně k dispozici v 5 edicích: Workstation, Server, IoT, Cloud a CoreOS. Pro desktopové nasazení je určena edice Workstation, což je prostředí GNOME. Vývojářům a uživatelům KDE Plasma se dlouhodobě nelíbí, že jejich prostředí je schováno mezi spiny, tj. alternativními desktopy. Prosadili si, že s následující verzí Fedora Linuxu KDE Plasma povýší ze spinu na edici a bude tak na úrovni Workstation.
UBports, nadace a komunita kolem Ubuntu pro telefony a tablety Ubuntu Touch, vydala Ubuntu Touch OTA-6 Focal, tj. šesté stabilní vydání založené na Ubuntu 20.04 Focal Fossa.
Byla vydána nová verze 8.0 (𝕏) frameworku pro vývoj webových aplikací Ruby on Rails (Wikipedie). Přehled novinek v příspěvku na blogu, v poznámkách k vydání a na GitHubu.
Kopie root@vzdalenypocitac cp /adresar/soubor /cilNo a potřeboval bych napsat skript, který to projde a na vzdáleném PC spustí daný příkaz. Skript napsaný níže by fungoval, kdyby... - když to nechám takto použije read standardní oddělovač a v proměnné $command mám jen "cp" namísto "cp /adresar/soubor /cil" - když definuju proměnnou IFS=";" (a použiju v cfg souboru jako oddělovač ;), tak to píše chybu: ./sript.sh: line 45: ssh root@vzalenypocitac: command not found Poradí někdo co s tím? (Netrvám na použití příkazu read, nic lepšího jsem ale stvořit nedokázal. Ve smyčce cyklu se toho bude provádět více (další dotazy, kontrola))
#!/bin/bash Config=${0%.*}.cfg echo $Config #IFS=; grep -v "^#" $Config | while read label remoteuser command do echo $label sshcmd="ssh $remoteuser" cmd="$($sshcmd $command; exit)" done
Řešení dotazu:
Kopie root@vzdalenypocitac "cp /adresar/soubor /cil"
IFS=';'
, zkuste si dát IFS=' '
před cmd="$($sshcmd $command; exit)"
.
…samozřejmě to nevyřeší zadání, jen to provede první řádek…
IFS=";"
, ale ve skriptu máte IFS=;
(navíc zakomentované), což udělá něco úplně jiného. Takže pokud chcete poradit, dejte sem skript, vstup a chybovou hlášku, které si odpovídají. Nemusejí to samozřejmě být ostrá (a citlivá) data, ale mělo by to být něco, na čem lze chybu reprodukovat.
while read line; do set -- $line label="$1" remoteuser="$2" shift 2 command="$*" ... done < $Config
#!/bin/bash Config=1.cfg #IFS=";" grep -v "^#" $Config | while read label remoteuser command2 command3 do command="mkdir /test" echo $command echo $command2 echo $command3 sshcmd="ssh $remoteuser" cmd1="$($sshcmd $command; exit)" cmd2="$($sshcmd $command2; exit)" cmd2="$($sshcmd $command3; exit)" doneA mám dva konfigurační soubory ve stejném adresáři (1.cfg oddělený tabulátory, 2.cfg oddělený středníky), ale oba obsahují stejná data:
uloha1 root@vzdalenypocitac touch /test/test.txt cp /test/test.txt /test/test_copy.txtKdyž použiju Config=1.cfg a zakomentuju $IFS=";", tak se sice načtou proměnné command2 a command3 špatně, ale aspoň ten natvrdo napsaný $command (mkdir /test) se provede:
mkdir /test touch /test/test.txt cp /test/test.txt /test/test_copy.txt touch: missing file operand Try `touch --help' for more information. bash: /test/test.txt: No such file or directoryKdyž použiju Config=2.cfg a použiju $IFS=";", tak mám sice nádherně načtené proměnné ze souboru, ale nic se neprovede. Nic!
mkdir /test touch /test/test.txt cp /test/test.txt /test/test_copy.txt ./dotaz.sh: line 11: ssh root@cz-brn1-ssm: command not found ./dotaz.sh: line 12: ssh root@cz-brn1-ssm: command not found ./dotaz.sh: line 13: ssh root@cz-brn1-ssm: command not foundA nepomůže ani, když v konfiguračním souboru dám jednotlivé řetězce do uvozovek, když nedefinuju IFS, tak to bere za oddělovače i mezery uvnitř uvozovek. Takže otázka je pořád stejná. Když nedefinuju $IFS, tak čtu špatně soubor. Když definuju $IFS, tak se mi v cyklu odmítá cokoli spustit (dokonce i mimo cyklus)! Co s tím? PS: Ten druhý způsob cyklu s read jsem už taky zkoušel. Chovalo se to stejně. Navíc jsem nevěděl jak se zbavit řádků s komentáři...
while read line; do ... done < $Config
#!/bin/bash Config=1.cfg OLDIFS="$IFS" MYSEP=';' IFS="$MYSEP" grep -v "^#" $Config | while read label remoteuser command2 command3 do command="mkdir /test" echo $command echo $command2 echo $command3 sshcmd="ssh $remoteuser" #nejpozději tady IFS="$OLDIFS" cmd1="$($sshcmd $command; exit)" cmd2="$($sshcmd $command2; exit)" cmd2="$($sshcmd $command3; exit)" IFS="$MYSEP" done
Ach jo. To je opravdu tak těžké pochopit, že pro řešení problému je potřeba ukázat, jak vypadá konfigurační soubor, se kterým máte problémy, ne ten, se kterým je nemáte?
Takže otázka je pořád stejná. Když nedefinuju $IFS, tak čtu špatně soubor. Když definuju $IFS, tak se mi v cyklu odmítá cokoli spustit (dokonce i mimo cyklus)! Co s tím?
Místo tučného písma a vykřičníku raději poskytněte informace potřebné k řešení. Takhle můžu jen hádat, jeden problém by mohl být v tom, že když nastavíte proměnnou IFS
takhle, tak (1) ovlivní úplně všechno, co dělá váš shell a co závisí na její hodnotě, tj. i v té příkazové substituci a (2) jen shodou okolností se vůbec aplikuje na ten příkaz read
. Proměnná IFS
je nebezpečná hračka a měla by se nastavovat jen tam, kde to opravdu potřebujete, tj.
egrep -v '^#' $config | while IFS=';' read label target cmd2 cmd3; do
Další problém, na který narazíte vzápětí, je, že všechno, co je v těle cyklu, tedy i ssh, zpracovává stejný standardní vstup jako read
, takže se ve výsledku zpracuje jen první řádek. Dá se to obejít různě, např. tak, že všemu, co by mohlo něco číst ze vstupu (např. tomu ssh) přesměrujete vstup z /dev/null
. Nebo si lze pomoci trikem
exec 3< <(egrep -v '^#' $config) while IFS=';' read label target cmd2 cmd3 <&3; do
Na vašem místě bych si ovšem nekomplikoval život, konfigurační soubor by vypadal takto
job1 mike@host1 id ; df -h / ; w -f job2 root@host1 id ; w -f job3 root@host2 id ; w -f ; df -h
a skript takto
#!/bin/bash egrep -v '^#' cmds | while read label target cmd; do out=`ssh $target "$cmd" </dev/null` echo -e "job $label:\n$out" done
Tiskni Sdílej: