파이프는 변수를 할당


19

간단하게하기 위해하고 싶습니다 :

echo cart | assign spo;
echo $spo  

출력 : 카트

그러한 assign응용 프로그램이 있습니까?

대체를 사용 하여이 작업을 수행하는 모든 방법을 알고 있습니다.


대체하지 않고 왜이 작업을 수행 하시겠습니까?
Thanatos

파이프로만 쓸 때는 역 폴란드 표기법 흐름이 마음에 듭니다. 코딩 속도가 훨씬 빠르며 코드 품질 / 속도는 그다지 중요하지 않습니다. 또한 체인을 연결할 때 체인의 일부를 주석 처리하고 전류 출력을 반향하는 대신 틱 등을 지우는 것이
쉽지 않습니다

디버깅 용이성에 대해 우려가있는 경우 backticks 명령을 일련의 개별 행에 배치하십시오. A=$( some | command | here )의 각각 some |, command |그리고 here자신의 라인에.
roaima

답변:


11
echo cart | { IFS= read -r spo; printf '%s\n' "$spo"; }

한 줄만 출력 하면 작동합니다 ( echo후행 줄 바꿈 문자없이 출력을 spo변수에 저장) echo.

당신은 항상 할 수 있습니다 :

assign() {
  eval "$1=\$(cat; echo .); $1=\${$1%.}"
}
assign spo < <(echo cart)

다음 솔루션은 bash스크립트에서는 작동 하지만 bash프롬프트 에서는 작동 하지 않습니다 .

shopt -s lastpipe
echo cat | assign spo

또는:

shopt -s lastpipe
whatever | IFS= read -rd '' spo

whatever의 첫 번째 NUL 문자까지 의 출력을 저장하려면 ( bash변수는 NUL 문자를 저장할 수 없습니다) $spo.

또는:

shopt -s lastpipe
whatever | readarray -t spo

출력 저장할 whatever하여$spo 배열 (어레이 요소마다 1 개 라인).


1
IFS=와 사이에 공백이 없어야합니다 read.
caesarsol

모든 우박 마지막 파이프. 또한 마지막 파이프는 작업 제어가 활성화 된 상태에서 작동하지 않기 때문에 명령 행에서 사이드 노트 세트 + m (ermmm 또는 -m)이 필요합니다.
MageProspero

17

사용하면 이런 식으로 할 수 있습니다 bash .

echo cart | while read spo; do echo $spo; done

불행히도 변수 "spo"는 while-do-do-one 루프 외부에 존재하지 않습니다. while 루프 안에서 원하는 것을 얻을 수 있다면 효과가 있습니다.

실제로 ATT ksh (pdksh 또는 mksh가 아님) 또는 멋진 zsh에서 위에서 작성한 내용을 거의 정확하게 수행 할 수 있습니다.

% echo cart | read spo
% echo $spo
cart

따라서 또 다른 해결책은 ksh 또는 zsh를 사용하는 것입니다.


1
당신은 Korn 쉘에서 (예를 coprocesses을 사용할 수 있습니다 mksh:) echo cart |& while read -p spo; do echo $spo; done(사용하는 것이 실제로 더 나은 while IFS= read -p -r spo; do…불구하고)
mirabilos

2

문제를 올바르게 이해하면 stdout을 변수에 파이프하려고합니다. 적어도 그것은 내가 찾고 있었고 여기에서 끝났습니다. 내 운명을 공유하는 사람들을 위해 :

spa=$(echo cart)

cart변수에 할당 합니다 $spa.


2
그것이 그들이 대체라고 부르는 것인데, OP는 피하고 싶어했습니다.
Dmitry Grigoryev

이것은 나에게 유용했습니다. 변수에 변수를 할당해야했는데 어떻게 거기에 있는지 신경 쓰지 않았습니다!
Chris Marisic

1

현재 파이프 스트림을 출력하려면을 사용하십시오 cat.

echo cart | cat 

명령 체인을 계속하려면 tee명령을 사용 하여 출력을 에코하십시오.

echo cart | tee /dev/tty | xargs ls

별명을 사용하여 명령을 단축 할 수 있습니다.

alias tout='tee /dev/tty'
echo cart | tout | xargs ls

왜 출력을 평원으로 파이프하고 싶 cat습니까?
roaima

1
@roaima 일부 명령은 터미널에서 실행되고 파이프로 출력 할 때와 다르게 동작한다는 것을 인식합니다. 특히 선을 현재 화면 너비로자를 수 있습니다. 대부분의 명령에서 cat 명령은 중복됩니다.
BillThor

아 알았어, 이제 네가 무엇을 설명하려고했는지 알 겠어. 그 echo | cat구조물은 나를 던졌다.
roaima

1

여기에 문제에 대한 해결책이 있습니다.

# 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"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.