2012-04-17 20 views
7

Niedawno natknąłem się na polecenie powłoki, które wyglądało tak: "> outfile < infile cat", który wydaje się funkcjonalnie równoważny "cat infile> outfile". W tym przypadku ogólną formą wydaje się być "> outfile < komenda infile arg1 ... argN" staje się "polecenie arg1 ... argN infile> outfile".Polecenie powłoki zaczynające się od ">"

W każdym razie zastanawiałem się, czy ktokolwiek mógłby rozwinąć to, w jaki sposób wiodący ">" osiąga ten efekt i czy są jakieś praktyczne zastosowania.

+0

Dlaczego zostało to odrzucone? To dobre pytanie. – Aatch

Odpowiedz

6

"Bash Reference Manual" mówi o następujących operatorów przekierowania:

Poniższe operatory przekierowania mogą poprzedzać lub pojawiają się w dowolnym miejscu w prostym poleceniem lub może nastąpić polecenie.

Więc poniższe polecenia są równoważne:

ls -al > listing.txt 
> listing.txt ls -al 
ls > listing.txt -al 

Choć Przypuszczam, że pierwszy jest najbardziej rozpowszechnioną formą.

Należy zauważyć, że w stosunku zamówienie przekierowań jest znaczna, więc jeśli przekierowanie jeden deskryptor pliku do innego, na przykład, co następuje byłaby inna:

ls > listing.txt 2>&1 # both stdout and stderr go in to listing.txt 

ls 2>&1 > listing.txt # only stdout goes to listing.txt, because stderr was made 
         # a copy of stdout before the redirection of stdout 
4

">" po prostu przekierowuje wyjście polecenia do pliku podanego jako następny argument. Typowym zastosowaniem jest dołączenie tego na końcu polecenia, ale może być w dowolnym miejscu. A więc:

> outfile <command> jest odpowiednikiem <command> > outfile. To samo dotyczy przekierowania wejścia.

Należy zauważyć, że w powyższych przykładach <command> nie jest jakąś dziwną składnią - po prostu zastępuje dowolne polecenie.

+0

Prawdopodobnie nie powinieneś używać nawiasów trójkątnych wokół mitycznego "polecenia" - sprawia to, że przykład jest nieco mylący. –

+0

@MichaelBurr yeap Myślałem o tym, ale nie mogłem wymyślić lepszego formatu. –

+1

'> OUTFILE COMMAND','>% outfile%% command% ','> $ outfile $ command' – user123444555621

1

Ekwiwalent nie jest:

cat infile > outfile 

Raczej jest

cat <infile> outfile 

(tylko, że w przypadku kotów, cat infile jest taka sama jak cat <infile)

Gdy widzisz to, że sposób, pierwotne polecenie wydaje się bardziej proste.

0

Znak wiodący większy niż (>) służy do przekierowania wyjścia. Domyślnie przekieruje STDOUT. W takim przypadku STDOUT jest puste, a zatem tworzony jest nowy i pusty plik (podobny efekt do touch output).

Można również użyć tego stylu dowodzenia do pustych istniejących plików, tj

$ echo FOO >/tmp/foo 
    $ ls -l /tmp/foo 
    -rw-r--r-- 1 flah wheel 4 Apr 17 01:49 /tmp/foo 
    $ > /tmp/foo 
    $ ls -l /tmp/foo 
    -rw-r--r-- 1 flah wheel 0 Apr 17 01:49 /tmp/foo 
    $ 

Aby uzyskać więcej informacji zobacz sekcję przekierowanie strony atakujących człowieka.

1

Jedna uwaga.To dlatego, że rzeczywiście można napisać ten

< file command 

to czyni bezużytecznym Zastosowanie Cat tym bardziej niewybaczalny:

cat file | command 

Oznacza to, że nawet jeśli z jakiegoś powodu plik ma być składniowo do po lewej stronie polecenia, nadal nie potrzebujesz cat!

Powiązane problemy