Miten tehdä shell scripti joka saa parametreina 2 parametria ja käynnistää niillä Java ohjelman?
#
#
java Oma $1 $2
Jotenkin näin vai???
#
#
java Oma $1 $2
Jotenkin näin vai???
Turvaa tilisi vahvistamalla puhelinnumerosi. Voit silloin palauttaa unohtuneen salasanan tekstiviestillä.
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 16
Vanhimmat
kato vielä jostain tutorialista, että ne parametrit tosiaan välittyy noilla $1 merkeillä.
Tuon javan eteen laita koko polku, missä java sijaitsee. Tuo saattaa toimia, kun itse käynnistät shelistä, mutta jos haluatkin ajaa tuota jonkun toisen scriptin sisältä koneen bootatessa, niin silloin tarttee koko polun tuohon eteen.
/usr/sbin/java blaablaa tms. ja perään vielä &, niin se ajaa sitä taustaprosessina
sitten chmod tiedostolle, että sitä voi ajaa. Suoritusoikeus täytyy ainakin olla.
chmod 777 munscript (777 antaa kaikki oikeudet kaikille HUOM HUOM)
ja sitten.
./munscript
Jos haluat sitten tuon käynnistyvän jokaisen bootin päätteeksi, niin laita sen käynnistys vaikka /etc/rc.d/rc.local tiedostoon vaikka näin.
echo '/oikee/polku/tahan/munscript' >> /etc/rc.d/rc.local
miten siirrän folderin toisen folderin sisälle?
mv eka toka
tuo eka sisältää useita tiedostoja. Toimii kyllä komentoriviltä mutta shell scriptissä valittaa jotain ...last argument must be directory... vaikka siis tuo toka onkin jo olemassa oleva dir. Mikä tässä mättää?
chmodille 777 on ok, jos haluaa antaa kaikille mahdollisuuden tehdä jäynää muille. 755 (eli rwxr-xr-x) on huomattavasti turvallisempi.
mv jokuhakemisto jokutoinenhakemisto
Tuo toimii kyllä shelliskripissäkin, joten skriptissäsi on joku bugi. "last argument must be directory" viittaa siihen, että annat mv:lle monta siirrettävää tiedostoa mutta viimeinen argumentti ei ole hakemisto (oletan tuon virheen olevan kokonaisuudessaan "when moving multiple files, last argument must be a directory").
Yksi mahdollisuus tähän bugiin on se, että annat skriptille tiedostonnimiä, joissa on välilyöntejä, ja teet siirron skriptissä mv:llä suoraan näin: mv $1 $2 tjsp. Jotta myös välilyöntejä sisältävät muuttujat tulkittaisiin oikein, niin muuttujat pitää laittaa lainausmerkkien ympärille, jotta myös mv näkee vain kaksi argumenttia. Lisäksi alkuperäisellekin skriptille pitää antaa ne tiedostonnimet lainausmerkkien sisällä, jos ne sisältävät tyhjää, esim. jokuskripti "väli lyönti" "joku toinen".
Jos ongelma ei ole tuossa, niin olisi helpointa, jos kopioit sen oman skriptin tähän sekä annat esimerkkiajon toimimattomasta tilanteesta (copypastet molemmista sellaisenaan, ei ulkomuistista).
Miten tuo siirto pitäisi oikeasti shell scriptiin koodata? Eli jos haluan siirtää useita pdf-dokumenttejä sisältävän kansion toisen kansion sisälle?
Tuleeko scriptiin vain:
mv PDF newFolder
Siirtääkö tuo käsky tuon PDF kansion ja koko sisällön tuohon newFolder-kansioon. Minulla kun tuo ei toimi...damn
ajan ensin sillä shell scriptillä java ohjelman joka luo ton PDF kansion ja siihen sisällön. hHeti perää haluaisin siirtää tuon luodun kansion sisältöineen toiseen (TPDF) kansioo:
echo "Eka shell script(test)"
java -cp Eka
mv PDF TPDF
exit 0
nyt siis sain siirrettyä, mutta nuo *.pdf tiedostot menivät tuon TPDF kansion alle, eikä siis tullut haluamaani rakennetta TPDF/PDF/*.pdf
Ja lisäksi tuon TPDF kansion nimeksi tuli TPDF? Mikä on vialla?
No ihan varmasti pitäisi toimia juuri noin. Kokeile vaikka huviksesi ensin käsin:
luot hakemiston (kansio kun on joku Windows-termi..) PDF (mkdir PDF)
luot hakemiston newFolder (mkdir newFolder)
kopioit hakemistoon PDF jotain testitiedostoja (cp a.pdf b.pdf c.pdf PDF)
Nyt komento "mv PDF newFolder" siirtää hakemiston PDF hakemiston newFolderin alle sisältöineen.
Millä tavalla tuo ei muka toimi ? Virheilmoitus ?
En tosiaan osaa sanoa miksi ei toimi. Esim jos on valmis hakemisto newFolder ja teen shell scriptiin komennon:
mv PDF newFolder
niin tuloksena on tyhjä TPDF hakemisto ja TPDF? hakemisto, jossa *.pdf tiedostot ovat ilman PDF-kansiota. Toimii kyllä ok komentoriviltä
exit 0 on tarpeeton skriptin lopussa, 0 palautetaan muutenkin, jos kaikki meni ok.
Rivi "java -cp Eka" vaikuttaa epäilyttävältä, sillä javan optio -cp ottaa argumentikseen tuon parametrin Eka, muttet anna enää sitä ajettavaa ohjelmaa. Typo ?
Tarkistapa nyt alkajaisiksi, että hakemistot PDF ja TPDF ovat todella olemassa java-ohjelman käynnistymisen jälkeen. Laita vaikka "ls -l" rivien java.. ja mv.. väliin. Mikäli PDF ja TPDF ovat hakemistoja, niin mv PDF TPDF pitäisi luoda hakemistorakenteen TPDF/PDF.
"Ja lisäksi tuon TPDF kansion nimeksi tuli TPDF?", ööh...vai tarkoitatko tuossa oikeasti, että PDF:n nimeksi tuli TPDF? Siinä tapauksessa hakemistoa TPDF ei ole olemassakaan, joten mv vain vaihtaa hakemiston nimen toiseksi. Testaa myös, luoko se java-ohjelma varmasti oikeasti sen hakemiston, jos sitä ei ole ennestään olemassa.
Lopuksi vielä esimerkkipätkä, että se mv toimii kuten pitääkin:
/tmp>mkdir PDF TPDF
/tmp>cd PDF
/tmp/PDF>touch a.pdf b.pdf
/tmp/PDF>cd ..
/tmp>ls PDF TPDF
PDF:
a.pdf b.pdf
TPDF:
/tmp>mv PDF TPDF
/tmp>ls PDF TPDF
ls: PDF: No such file or directory
TPDF:
PDF
/tmp>ls TPDF/PDF/
a.pdf b.pdf
Onpas nyt jo sekavaa. Mikä on tuo hakemisto TPDF?, eli onko siinä joku kysymysmerkkikin ? Mistäs se ilmestyi tähän väliin ? Vaikuttaa vähän siltä, että se skriptisi on joko hämärän buginen (ehket kopoioinut sitä tähän sellaisenaan) tai sitten se java-ohjelma bugaa. Parempien ideoiden puutteessa kokeile vielä vaikka ajaa sitä shellin optioilla -x tai -v tai molemmat yhtä aikaa, esim. sh -xv ./omaskripti, niin näet mitä komentoja ajetaan ja millä arvoilla niitä ajetaan.
Se java juttu toimii ihan ok. Voitko pistää tähän yksinkertaisen scriptin joka siis luo kansion ja siirtää toisen kansion sisältöineen sen sisälle?
Esimerkkipätkät löytyvätkin jo paristakin aiemmasta viestistäni, ota niistä mallia.
Lyhyesti siis:
1. mkdir jokuhakemisto
2. mv jokutoinenhakemisto jokuhakemisto
#!/bin/bash
#
echo "script(test2)"
mkdir Test
mkdir PDF
mv PDF Test
tulee virheilmo:
mv: cannot stat `PDF': No such file or directory
: command not found
: command not found
Kansiot se kyllä luo mutta kummastakin kansiosta tulee ? loppuinen eli PDF? ja Test?. Mikä tässä voi olla?
Minulla tuo toimi täysin oikein niin kuin oletinkin sen toimivan. Ulkoisestikaan tuossa skriptissä ei ole mitään vikaa. Mitä jos kommentoit mv-rivin #-merkillä ja katsot ajon jälkeen tuliko hakemistoon nuo kaksi juuri luotua hakemistoa. Lisää myös ls -l ennen mv:tä. Vastaavanlaista ongelmaa ei ole tullut vastaan viimeiseen viiteen vuoteen.
Kysymysmerkki voisi olla myös ls:n tulostama. Oletuksena ls kai tulostaa muut kuin tulostettavissa olevat merkit kysymysmerkillä. Siinä tapauksessa ongelma voisi olla mkdir-rivien lopussa, eli olet mahdollisesti painanut ennen rivin loppua alt-space tms. normaalisti näkymättömän merkin. Katso siis mitä komento "ls -Q" tulostaa. Jos tulosteessa näkyy lainausmerkkien sisällä jotain muuta kuin hakemiston nimi, niin mkdir-rivin loppuun on jäänyt jotain roskaa (mikä ei normaalisti näy esim. catilla tulostettaessa).
Joo, kokeilin tota ls -Q ja se näutti että esim. PDF dir on "PDF/r". Mistä toi johtuu. Okka. varmaan selvis nyt toi homma. Kun oon notepadilla tehny tota samalla kun teen windowsiin .BATia niin se varmaan heitti noi näkymättömät merkit. Muokkasin sitä picolla ja jo toimi.
Juuri kun meinasin vastata, että oletin sinun editoineen tuota tekstiä jollain muulla kuin Linuxilla/Unixilla, jotka eivät käytä rivinvaihdoissa \r:ää \n:n lisäksi, vaan pelkkää \n:ää. Sen takia \r sisältyi siihen hakemiston nimeen.