Skrivet av Mejan:
Hitta min lössning med hjälp av denna link.
Skulle också ha rekommenderat en `tee`-lösning. En fördel är att man begränsar privilegieeskaleringen till det steg där den faktiskt behövs. I detta fall spelar det ingen större roll, men låt säga att man skulle vilja ha output från ett skript att pipea vidare: då är det inte önskvärt att köra hela skriptet som `root` om det går att undvika.
En annan sak att nämna är att `cat` i stort sett aldrig är varken bra eller nödvändigt att använda till detta ändamål. Använder man `cat` så behöver man starta en extra process bara för att skyffla data vidare, när skalet som redan körs mycket lättare kan presentera dessa direkt via omdirigering (program som `grep`/`sed`/`awk`/`wc`/etc. kan dessutom ta ett filnamn som direkt argument). Här skulle man exempelvis kunna köra:
sudo tee -a /etc/fstab < tmp.txt
eller om man tycker ovanstående ser bakvänt ut:
< tmp.txt sudo tee -a /etc/fstab
Jag tycker personligen att det första är tydligare, men det är bara en vanesak.
Detta är effektivare och använder skalet till vad det är till för. I detta fall är prestandaskillnaden säkerligen inte märkbar, men det finns likväl ingen anledning att lära sig olater . Det hindrar också tidigt framtida dåliga konstruktioner som `for i in $(cat minfil); do` (mellanslag och mer exotiska tecken kommer en dag bita den som skriver sådant, och dessutom kan man braka in i `ARG_MAX`-taket om man inte har koll på `minfil`) och att gå i fällor som kan illustreras av `cat minfil | while read x; do y=$x; done` (vad innehåller nu `$y`?). Utöver att skapa en extra process så kommer systemet i praktiken också behöva läsa inputdata multipla gånger om man använder `cat`, då den först kommer läsa filen till pipebufferten, och sedan läsa från denna och skicka vidare — handlar det om stora datamängder så kan detta bli märkbart. Ger man redirectoperatorn så kommer programmet läsa direkt från filen, vilket även ger möjlighet för programmet att söka i filen om det skulle ge fördelar.
Om det bara handlar om en enda fil så finns det alltså extremt sällan någon anledning att använda `cat`. Vill man däremot konkatenera (slå ihop) flera filer innan de skickas vidare (vilket ju är det `concatenate` egentligen är till för) så kan `cat minfil1 minfil2 |` vara en bra konstruktion.
Notera återigen att hastigheten inte nödvändigen är det centrala (även om man någon dag säkert kommer råka på en gigantisk fil, eller skapa en loop som körs många gånger), utan att det snarare handlar om att använda de verktyg man har på det sätt det är tänkt.
Se även Useless Use of Cat Award . (EDIT: länk via archive.org, då originalsidan eventuellt är nertagen.)