programing

셸 내의 변수로 출력을 리다이렉트하려면 어떻게 해야 하나요?

easyjava 2023. 4. 14. 22:16
반응형

셸 내의 변수로 출력을 리다이렉트하려면 어떻게 해야 하나요?

그런 대본이 있어요.

genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5

변수에서 genhash에 의해 생성된 스트림을 가져오고 싶습니다.변수로 리다이렉트하려면 어떻게 해야 하나요?$hash비교할 수 있을까요?

if [ $hash -ne 0 ]
  then echo KO
  exit 0
else echo -n OK
  exit 0
fi

를 사용합니다.$( ... )구성:

hash=$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)

TL;DR

저장하다"abc"안으로$foo:

echo "abc" | read foo

하지만 파이프는 포크를 만들기 때문에$foo파이프가 끝나기 전에, 그러니까...

echo "abc" | ( read foo; date +"I received $foo on %D"; )

물론, 이 모든 답변들은 작전본부가 요청한 것을 하지 않는 방법을 보여주고 있지만, 작전본부의 질문을 검색한 나머지 사람들을 정말 망치고 있다.

이 질문에 대한 답은 명령어를 사용하는 것입니다.

방법은 이렇습니다.

# I would usually do this on one line, but for readability...
series | of | commands \
| \
(
  read string;
  mystic_command --opt "$string" /path/to/file
) \
| \
handle_mystified_file

다음은 그 기능과 그 중요성입니다.

  1. 예를 들어, 이 경우,series | of | commands는 매우 복잡한 일련의 명령어입니다.

  2. mystic_command는 파일 경로 대신 stdin으로 파일 내용을 받아들일 수 있지만 arg는 사용할 수 없으므로 변수로 입력해야 합니다.이 명령어는 수정된 내용을 출력하며 일반적으로 파일로 리디렉션되거나 다른 명령어로 파이핑됩니다(예:sed,awk,perl등)

  3. readstdin을 사용하여 변수에 배치한다.$string

  4. 를 배치하다read및 그mystic_command괄호를 통해 "sub shell"로 만들 필요는 없지만 마치 두 개의 명령어가 별도의 스크립트 파일에 있는 것처럼 연속 파이프처럼 흐르게 합니다.

항상 대안이 있습니다. 이 경우, 그 대안은 위의 예와 비교할 때 보기 흉하고 읽기 어렵습니다.

# my example above as a oneliner
series | of | commands | (read string; mystic_command --opt "$string" /path/to/file) | handle_mystified_file

# ugly and unreadable alternative
mystic_command --opt "$(series | of | commands)" /path/to/file | handle_mystified_file

내 방식은 전적으로 시간순과 논리적이다.대체 방법은 네 번째 명령어부터 시작하여 명령어 1, 2, 3을 명령어 치환에 포함시킵니다.

스크립트에 실제 예제가 있지만, 위의 예로는 사용하지 않았습니다.그것은 다른 미친/혼란/분열하는 bash 마법도 있기 때문입니다.

read hash < <(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)

이 기술은 "명령어 대체"와 혼동되지 않도록 Bash의 "프로세스 대체"를 사용합니다.

다음은 몇 가지 참고 자료입니다.

호환성이 있다고 생각합니다.

hash=`genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5`

하지만 나는 더 좋다

hash="$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)"

$(...)함수의 기입을 검토해 주십시오.정의 시 사용 가능한 모든 로컬 변수에 액세스할 수 있습니다.

function getHash {
  genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5
}
hash=$(getHash)

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Functions

다음 작업을 수행할 수 있습니다.

hash=$(genhash --use-ssl -s $IP -p 443 --url $URL)

또는

hash=`genhash --use-ssl -s $IP -p 443 --url $URL`

파이프 전체를 변수에 할당하려면 위의 할당에서 파이프 전체를 사용할 수 있습니다.

사용할 때 오류가 발생할 수 있습니다.$(`code`)컨스트럭터

드디어 https://stackoverflow.com/a/7902174/2480481에서 접근하게 되었습니다.

기본적으로 Tee를 사용하여 다시 out을 읽고 변수에 넣는 것입니다.정상적인 출력은 출력에서 읽을수록 표시됩니다.

그렇지 않나요? 현재 작업 genhash는 단일 문자열 해시를 출력할 것입니다.

저는 아직 완전 출력 및 저장 명령어를 찾고 있습니다.안부 전해요.

호출할 명령어로 호출하는 함수를 만듭니다.이 경우에는 ruok 명령을 사용해야 합니다.

그런 다음 함수를 호출하고 결과를 변수에 할당합니다.이 경우 변수 상태에 결과를 할당합니다.

function ruok {
  echo ruok | nc *ip* 2181
}

health=echo ruok *ip*

언급URL : https://stackoverflow.com/questions/2559076/how-do-i-redirect-output-to-a-variable-in-shell

반응형