Lubię odwrotny przepływ notacji polskiej, gdy piszę tylko za pomocą potoków. Jestem znacznie szybszym kodowaniem, a jakość / szybkość kodów nie jest tak ważna. Również nie robię, kiedy łańcuchowanie jest łatwiejsze do komentowania części łańcucha i echa bieżącej mocy wyjściowej, zamiast usuwania tików itp.
MageProspero,
Jeśli obawiasz się o łatwość debugowania, rozważ umieszczenie polecenia wstecznego w szeregu oddzielnych linii. A=$( some | command | here )z każdym some |, command |i herena własnej linii.
Cała ostatnia rura. Potrzebny jest również zestaw notatek bocznych + m (ermmm lub -m) z wiersza poleceń, ponieważ zrobi to, ponieważ ostatnia rura nie działa z aktywną kontrolą zadań.
MageProspero
17
Możesz zrobić coś takiego, jeśli użyjesz bash:
echo cart |while read spo;do echo $spo;done
Niestety zmienna „spo” nie będzie istniała poza pętlą „do zrobienia”. Jeśli możesz uzyskać to, co chcesz zrobić w pętli while, to zadziała.
Możesz właściwie robić dokładnie to, co napisałeś powyżej w ATT ksh (nie w pdksh ani mksh) lub we wspaniałym zsh:
% echo cart | read spo
% echo $spo
cart
Tak więc innym rozwiązaniem byłoby użycie ksh lub zsh.
Możesz użyć koprocesów w skorupie Korna (np. mksh): echo cart |& while read -p spo; do echo $spo; done( while IFS= read -p -r spo; do…Ale lepiej jest użyć )
mirabilos
2
Jeśli dobrze rozumiem problem, chcesz przesłać standardowe wyjście do zmiennej. Przynajmniej tego szukałem i skończyłem tutaj. Więc dla tych, którzy podzielają mój los:
Dlaczego chcesz przesyłać dane wyjściowe do zwykłego cat?
roaima
1
@roaima Niektóre polecenia rozpoznają, że działają na terminalu i zachowują się inaczej niż wtedy, gdy są wysyłane do potoku. W szczególności mogą one przycinać linie do bieżącej szerokości ekranu. W przypadku większości poleceń polecenie cat jest zbędne.
BillThor
Ach, ok, widzę teraz to, co próbujesz zilustrować. echo | catKonstrukt wyrzucił mnie.
roaima
1
Oto moje rozwiązanie problemu.
# assign will take last line of stdout and create an environment variable from it# notes: a.) we avoid functions so that we can write to the current environment# b.) aliases don't take arguments, but we write this so that the "argument" appears# behind the alias, making it appear as though it is taking one, which in turn# becomes an actual argument into the temporary script T2.# example: echo hello world | assign x && echo %x outputs "hello world"
alias assign="tail -1|tee _T1>/dev/null&&printf \"export \\\$1=\$(cat _T1)\nrm _T*\">_T2&&. _T2"
A=$( some | command | here )
z każdymsome |
,command |
ihere
na własnej linii.Odpowiedzi:
Działa (przechowuje wynik
echo
bez końcowego znaku nowej linii wspo
zmiennej), o ileecho
wypisuje tylko jedną linię.Zawsze możesz zrobić:
Następujące rozwiązania będą działać w
bash
skryptach, ale nie wbash
monicie:Lub:
Do przechowywania danych wyjściowych
whatever
do pierwszych NUL znaków (bash
zmienne i tak nie mogą przechowywać znaków NUL)$spo
.Lub:
do przechowywania danych wyjściowych
whatever
w$spo
tablicy (jeden wiersz na element tablicy).źródło
IFS=
iread
?Możesz zrobić coś takiego, jeśli użyjesz
bash
:Niestety zmienna „spo” nie będzie istniała poza pętlą „do zrobienia”. Jeśli możesz uzyskać to, co chcesz zrobić w pętli while, to zadziała.
Możesz właściwie robić dokładnie to, co napisałeś powyżej w ATT ksh (nie w pdksh ani mksh) lub we wspaniałym zsh:
Tak więc innym rozwiązaniem byłoby użycie ksh lub zsh.
źródło
mksh
):echo cart |& while read -p spo; do echo $spo; done
(while IFS= read -p -r spo; do…
Ale lepiej jest użyć )Jeśli dobrze rozumiem problem, chcesz przesłać standardowe wyjście do zmiennej. Przynajmniej tego szukałem i skończyłem tutaj. Więc dla tych, którzy podzielają mój los:
Przypisuje
cart
do zmiennej$spa
.źródło
Jeśli chcesz tylko wyświetlić bieżący strumień potoku użyj
cat
.Jeśli chcesz kontynuować łańcuch poleceń, spróbuj użyć
tee
polecenia, aby wyświetlić dane wyjściowe.Możesz użyć aliasu, aby skrócić polecenie.
źródło
cat
?echo | cat
Konstrukt wyrzucił mnie.Oto moje rozwiązanie problemu.
źródło