Zwykle musimy przekazać tylko jeden argument:
echo abc | cat
echo abc | cat some_file -
echo abc | cat - some_file
Czy istnieje sposób na przekazanie dwóch argumentów? Coś jak
{echo abc , echo xyz} | cat
cat `echo abc` `echo xyz`
Mógłbym najpierw zapisać oba wyniki w pliku
echo abc > file1
echo xyz > file2
cat file1 file2
Ale wtedy mogę przypadkowo zastąpić plik, co nie jest w porządku. Przechodzi w nieinteraktywny skrypt. Zasadniczo potrzebuję sposobu na przekazanie wyników dwóch dowolnych poleceń cat
bez zapisywania do pliku.
AKTUALIZACJA: Przykro nam, przykład maskuje problem. Chociaż { echo abc ; echo xyz ; } | cat
wydaje się, że działa, wynik jest spowodowany przez echo
s, a nie przez cat
.
Lepszym przykładem byłby ten, { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d,
który nie działa zgodnie z oczekiwaniami.
Z
file1:
a,b
c,d
file2:
1,2
3,4
Oczekiwany wynik to:
b,1
d,3
ZDECYDOWANY:
Użyj podstawienia procesu :cat <(command1) <(command2)
Możesz też utworzyć nazwane potoki, używając mkfifo
:
mkfifo temp1
mkfifo temp2
command1 > temp1 &
command2 > temp2 &
cat temp1 temp2
Mniej elegancki i bardziej szczegółowy, ale działa dobrze, o ile upewnisz się, że temp1 i temp2 nie istnieją wcześniej.
Odpowiedzi:
Myślę, że chcesz „Proces zastępowania” http://tldp.org/LDP/abs/html/process-sub.html . Działa również na zsh, choć ma więcej opcji, a składnia może być inna.
Tworzy pseudo plik (
/dev/fd/something
) dla każdego podstawienia. To całkiem przydatne. Polecenie może być odczytywane tylko jako strumień, co oznacza, że nie może przesuwać się tam iz powrotem z fseek. Musi to odczytać jako strumień bajtów, jak potok.Twoje przykłady działają jako podstawienie procesu:
Pomyśl o tym jak o narzędziu do wykorzystania procesu i udawaj, że jest plikiem bez plików tymczasowych.
(z mojej wcześniejszej odpowiedzi )
źródło
Nawiasy klamrowe faktycznie działały, ponieważ operator potoku połączy standardowe wyjścia zgrupowanych poleceń ze standardowym wejściem trzeciego.
Możesz stwierdzić, że wydruk nie pochodzi z echa, uruchamiając dowolne polecenie, które nie korzysta ze standardowego wejścia, np.
{ echo 1; echo 2;} | echo 3
Wypisze 3 zamiast 1 \ n2 \ n3.Jednak nie jest to rzecz, której chciałeś, ponieważ dwa polecenia w nawiasach klamrowych zapisują do tego samego wyniku, który przypomina
cat
wyniki. Aby wygenerować dwa różne wyniki do użycia jako dwa argumenty dla poleceń takich jakpaste
, musisz użyć pliku tymczasowego lub nazwanego potoku.Możesz użyć
mktemp
do wygenerowania unikalnego pliku tymczasowego lubmkfifo
do utworzenia pliku potoku FIFO.źródło
Lubię xargs Jako przykład chcę znaleźć rozmiar wszystkich danych mysql w katalogu / usr / local
xargs
źródło