Permalänk
Medlem

Problem med "cat" commandot

Har skrivit ett script som bla. ska skriva ut datumet när scriptet kördes i en fil. Det ser ut såhär:

cat | date >> log.txt

Problemet är att jag måste avbryta inputen till cat med ^D varje gång jag kör kommandot. Finns det något sätt att slippa detta?

Permalänk
Medlem

Varför inte bara:

date >> log.txt

Visa signatur

Behind every great fortune there is a crime. - Honoré de Balzac
simonb @ irc

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Movement
Varför inte bara:

date >> log.txt

Ah! Mycket bra Tackar

Permalänk
Medlem

Om du vill ha en förklaring varför ditt första försök inte fungerade så kommer här dagens lektion i bashscriptande Det är så att date >> log.txt stoppar in datumet i log.txt, som du säkert redan listat ut. Sen "pipar" du resulatet till cat, men date >> log.txt ger ingen utskrift då du redan skickat vidare allt från date till log.txt. Om man sen startar cat utan att ange något så kommer cat bara att eka tillbaks allt från standard output, dvs. det som skrivs in. Testa att starta cat och skriv något, så ser du att den upprepar det du skrev in när du trycker enter. Föga användbart kanske, men så fungerar det.

Så cat | date >> log.txt kommer att stoppa in utskriften från date i log.txt, och sen skicka vidare resultatet, som är ingenting, till cat. cat startas då i "ekoläge", och står och väntar på att du ska skriva in någonting. Hade du däremot kört bara cat | date så hade date skickat vidare datumet till cat som hade sedan hade skrivit ut datumet. Men cat hade ändå inte avslutats, utan fortsatt att eka tills du avbrutit cat.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av perost
Om du vill ha en förklaring varför ditt första försök inte fungerade så kommer här dagens lektion i bashscriptande Det är så att date >> log.txt stoppar in datumet i log.txt, som du säkert redan listat ut. Sen "pipar" du resulatet till cat, men date >> log.txt ger ingen utskrift då du redan skickat vidare allt från date till log.txt. Om man sen startar cat utan att ange något så kommer cat bara att eka tillbaks allt från standard output, dvs. det som skrivs in. Testa att starta cat och skriv något, så ser du att den upprepar det du skrev in när du trycker enter. Föga användbart kanske, men så fungerar det.

Så cat | date >> log.txt kommer att stoppa in utskriften från date i log.txt, och sen skicka vidare resultatet, som är ingenting, till cat. cat startas då i "ekoläge", och står och väntar på att du ska skriva in någonting. Hade du däremot kört bara cat | date så hade date skickat vidare datumet till cat som hade sedan hade skrivit ut datumet. Men cat hade ändå inte avslutats, utan fortsatt att eka tills du avbrutit cat.

tvärtom väl?

cat | date >> log.txt kommer få cat att försöka skicka sin output (som är noll iom att den inte har någon input) till date >> log.txt ?

För han pipar ju cat till date där, och inte date till cat, som ju skulle bli date | cat >> log.txt ?

Det du beskriver låter ju mer som date >> log.txt | cat, d.v.s. att han pipear noll out från date till cat som bara väntar?

Visa signatur

Kör väl en klassisk signatur:
9900K @ 5GHz/128GB 3200MHz DDR4/3x1TB NVME/6800XT på Aorus Z390 Elite
Samsung C34F791, Svive 34C801, Xiaomi 34", Logitech MX Master 3 + G512...
Behöver för jobb, ej gamer.

Permalänk
Medlem

Det är som bogg säger, han pipeline:ar ju cat till date och inte tvärt om.

Permalänk
Medlem

Jag slänger in en ny fråga här, lite skild från ämnet: Jag vill köra mitt script när min externa disk mountas. Finns det något smidigt sätt att aktivt lyssna /Volumes när disk "Blabla" mountas?

Permalänk
Hedersmedlem

Kolla upp Folder actions, det kanske funkar till sånt.
http://docs.info.apple.com/article.html?path=Mac/10.4/en/mh19...

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Ja alltså ekoläge är ju inget annat än att inputströmmen som levereras till cat utan några argument är stdin, vilket blir terminalen.

Visa signatur

Björn