Nowe posty

Autor Wątek: polecenie cat potok  (Przeczytany 5973 razy)

porschelukas

  • Gość
polecenie cat potok
« dnia: 2011-04-06, 17:20:56 »
Witam, jestem początkującym użytkownikiem systemu linux, w zasadzie używam go tylko jeśli trzeba mi na studiach do kolokwium. Mam problem z takim zadaniem:

"Korzystając z polecenia cat utwórz plik o nazwie plik3.txt, który będzie składał się z zawartości pliku plik1.txt, ciągu znaków z klawiatury i pliku plik2.txt."

Próbowałem już na możliwie różne sposoby, rozumiem, że trudność polega na połączeniu w potok, bo w 3 oddzielnych linijkach zrobić to to żaden problem. Nie rozumiem też do końca czy mogę korzystać tylko z polecenia cat.
Wg mnie to powinno działać:
cat plik1.txt > plik3.txt | cat >>plik3.txt | cat plik2.txt >> plik3.txt

Niestety wczytywanie z klawiatury odbywa się tylko jeśli cat >> plik3.txt jest jako pierwsze, z godzinę już przesiedziałem nad tym

arctgx

  • Gość
polecenie cat potok
« Odpowiedź #1 dnia: 2011-04-06, 18:02:18 »
Cytat: porschelukas
z godzinę już przesiedziałem nad tym
cat <[b][/b]< koniec_pliku
$(<[b][/b]plik1)
Godzina to wielka strata czasu... Tylko się powiesić... :P
$(<[b][/b]plik2)
koniec_pliku
Jak Ty chcesz porządnie poznać basha bez poświęcenia mu czasu?
Pozdrawiam!

porschelukas

  • Gość
polecenie cat potok
« Odpowiedź #2 dnia: 2011-04-06, 18:36:00 »
Okej, dzięki wielkie;)
A co robi ten $(), nie ma tego opisanego nigdzie w manualu cata?
Jeśli chodzi o system Linux, to uważam, że jest on świetny, ale nigdy mi się nie przyda jego znajomość a już na pewno nie znajomość basha, nie widzę praktycznego zastosowania klepania tych komend, jak to samo można sobie wyklikać myszką. Dlatego teraz uczę się tylko tak, aby było zaliczone, być może w przyszłości mi się odmieni. Ogólnie jestem wzrokowcem, lubię jak coś "wygląda" i w przyszłości zamierzam pisać aplikacje "wyglądające", no a aplikacje w bashu niestety "nie wyglądają";) Pozdrawiam!

arctgx

  • Gość
polecenie cat potok
« Odpowiedź #3 dnia: 2011-04-06, 19:16:40 »
Cytat: porschelukas
Okej, dzięki wielkie;)
A co robi ten $(), nie ma tego opisanego nigdzie w manualu cata?
Jeśli chodzi o system Linux, to uważam, że jest on świetny, ale nigdy mi się nie przyda jego znajomość a już na pewno nie znajomość basha, nie widzę praktycznego zastosowania klepania tych komend, jak to samo można sobie wyklikać myszką. Dlatego teraz uczę się tylko tak, aby było zaliczone, być może w przyszłości mi się odmieni. Ogólnie jestem wzrokowcem, lubię jak coś "wygląda" i w przyszłości zamierzam pisać aplikacje "wyglądające", no a aplikacje w bashu niestety "nie wyglądają";) Pozdrawiam!
Nie ma tego w manualu cata, bo to już nie jego składnia. Po słowie cat następuje definicja tzw. dokumentu włączonego (<< mówi powłoce, by tak dalszą treść traktować aż do linii składającej się wyłącznie ze słowa "koniec_pliku"). Przy takim użyciu bash, poza tym magicznym słowem, traktuje specjalnie niektóre znaki. W szczególności, forma $(< plik) to w bashu (nie patrzyłem jak w innych rozszerzeniach posiksowych powłok) to wbudowany w nią odpowiednik polecenia cat plik. Jeśli nie wiesz, co oznacza postać $(słowo) (czyli bez "<"), to zastanawiam się czy był sens dawania Ci tego co wyżej. Wtedy pozostaje Ci tylko zabierać się za lekturę przykładów i man bash. Jeśli nie uważasz, że warto poświęcać czas, daj spokój ludziom na tym forum. Nie interesuje mnie Twoje zaliczenie, jestem chętny podzielić się czasem wiedzą, pod warunkiem że sam włożysz w to wysiłek.

Doceniam potęgę powłok (nie tylko basha) i zewnętrznych poleceń właśnie dlatego, że nieraz znacznie wygodniej mogę obyć się bez zbędnego klikania i ładowania zbędnych kawałków interfejsu, a wynik polecenia okroić do tego, co potrzebne. Programowalne dopełnianie (nazw poleceń, ich ewentualnych opcji i parametrów) w interaktywnej powłoce to funkcjonalność, na rzecz której chętnie rezygnuję z grzebania po menu i ikonkach.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
polecenie cat potok
« Odpowiedź #4 dnia: 2011-04-06, 19:34:13 »
"$(- wstawia w danym miejscu: $()
- zawartość pliku: <

Tak samo możesz wstawić $() wartość zmiennej:
$(zmienna)

---

A jak przyjdzie ci pracować z tysiącem plików zamiast z jednym czy dwoma, to docenisz automatykę Basha ;)

Choćby nawet takie proste przeskalowanie kilkuset zdjęć jednym prostym poleceniem:
for plik in *.jpg; do convert -resize 800x600 $plik przeskalowane/$plik; done
Albo automatyzacja generacji różnych rzeczy w kodzie źródłowym. Bash jak znalazł.
Zobacz na przykład skrypt do generowania kilkuset ikon o różnych rozmiarach i zawartości z jednego pliku obrazu Gimpa (.xcf):
http://gitorious.org/kadu/kadu/blobs/master/varia/themes/icons/oxygen/src/rebuild-statuses.sh
albo skrypt odświeżający pliki tłumaczeń dla całego kodu projektu:
http://gitorious.org/kadu/kadu/blobs/master/translations/update_ts_files.sh

Bash przydaje się też do przetwarzania arkuszy kalkulacyjnych za pomocą awk, bo Calc/Excel nie jest w stanie wykonać podstawowych operacji. Jak masz kilkadziesiąt rekordów, to możesz zrobić to ręcznie. Ale co jak rekordów jest kilka tysięcy? Możesz pisać makro, które będzie bardziej skomplikowane od skryptu w Bashu i dobrze będzie, jak gdzieś nie natkniesz się na ograniczenia makra i wyjdzie, że jednak makrem czegoś zrobić się nie da.

I wiele innych przykładów można by jeszcze znaleźć.

Nie używanie Basha (lub innego tego typu języka skryptowego) to zwyczajne marnowanie czasu.

porschelukas

  • Gość
polecenie cat potok
« Odpowiedź #5 dnia: 2011-04-06, 19:34:36 »
Dzieki raz jeszcze, doczytam o tym czymś i będzie dobrze;)

arctgx

  • Gość
polecenie cat potok
« Odpowiedź #6 dnia: 2011-04-06, 19:55:46 »
Cytat: ultr
Tak samo możesz wstawić $() wartość zmiennej:
$(zmienna)
Nie używanie
Zwróciłem na ten merytoryczny błąd w pierwszej linii uwagę (może nim wyślę tego posta, zdążysz poprawić), bo podczas pisania poprzedniego postu sam na pierwszy ogień odpowiedziałem sobie tak. Druga linijka to powszechny ort.

porschelukas

  • Gość
polecenie cat potok
« Odpowiedź #7 dnia: 2011-04-06, 22:03:46 »
a jeszcze pytanie mam dlaczego takie coś nie działa
cat plik3 | cat <>plik3 | cat >plik3
jeśli w tym potoku po środku wejście z klawiatury przekieruje do innego pliku niż plik3 to zapisuje wszystko ładnie, a w tym przypadku zapisuje tylko dane z pliku1 i pliku2. Dla mnie wygląda to tak jakby tworzył plik3 o zbyt małym rozmiarze. Jest szansa, żeby podobnie napisane polecenie zadziałało czy nie ma co się męczyć w te potoki?

arctgx

  • Gość
polecenie cat potok
« Odpowiedź #8 dnia: 2011-04-07, 01:09:38 »
Cytat: porschelukas
a jeszcze pytanie mam dlaczego takie coś nie działa
cat plik3 | cat <>plik3 | cat >plik3
jeśli w tym potoku po środku wejście z klawiatury przekieruje do innego pliku niż plik3 to zapisuje wszystko ładnie, a w tym przypadku zapisuje tylko dane z pliku1 i pliku2. Dla mnie wygląda to tak jakby tworzył plik3 o zbyt małym rozmiarze. Jest szansa, żeby podobnie napisane polecenie zadziałało czy nie ma co się męczyć w te potoki?
Na widok takiej konstrukcji (chyba najlepiej w cytacie podejrzeć, w niektórych miejscach tego forum znikają znaki przekierowania) i pytania na końcu powiem tak: nie ma co się męczyć z tworzeniem bez zrozumienia złożonego kodu. Stwórz sobie wpierw prosty dokument włączony tylko z klawiatury: przyjrzyj się mojemu przykładowi z dokumentami włączonymi (here document), innym w sieci i ogólnej składni w man bash (ew. w man -LC bash), a potem zobacz, co przeoczyłeś. Odrobina uwagi i mój tekst wystarczy. Dopiero potem proste polecenia, których składnię i działanie zrozumiałeś, połącz w potoki.

Przejrzałem manual basha dla upewnienia się czy << może w tej sytuacji zostać zinterpretowane inaczej - gdzie tam.

Zapoznaj się też z zewnętrznym poleceniem tee (lub z kopiowaniem w połoce deskryptorów plików, czego chyba Ci na razie nie zaproponuję).