서브셸 스크립트의 반환 값을 가져옵니다.

서브셸 스크립트의 반환 값을 가져옵니다.

새로운 .sh 스크립트를 시작하는 쉘 스크립트가 있습니다. 이제 첨자의 반환 값을 변수에 저장하고 싶습니다.

이 스크립트를 찾았습니다.

#!/bin/bash
r=1
while [[ r -ne 0 ]]
do
r=`vx $* < \`tty\` > \`tty\``
done
exit 0

매개변수를 사용하여 스크립트 vx를 호출하고 반환 값을 변수 r에 저장합니다. tty...은 무슨 뜻인가요? 이것이 반환 값입니까? $를 사용할 수 없나요? 값을 반환하려면?

감사해요!

편집하다:

그렇다면 다음 진술은 틀린 것인가요?

#!/bin/bash

returnvalue=1

while  [ $returnvalue -ne 0 ]
do
    bash ./vx $1
    returnvalue=$?
done

답변1

나는 당신이 실제로 다음을 원한다고 믿습니다.

#! /bin/sh -
until rv "$@"; do
  continue
done

$?일반적으로 종료 상태( )의 실제 값을 가져올 필요가 없으며 0이 true인지 false를 의미하는지 알 필요도 없습니다. until, while, ... 구조로 if이 문제를 해결할 수 있습니다. 위 내용은 continue단지 가독성을 위한 것입니다. no-op 명령을 포함한 모든 명령을 여기에 넣을 수 있습니다 :.

$*따옴표를 사용 하거나 남기지 마십시오 $@. 의미가 없습니다.

답변2

스크립트의 출력을 "r"에 저장하고 종료 코드는 $?에 저장됩니다.

그러니 "완료" 앞에 한 줄만 추가하세요.

result=$?

답변3

표현에 있어서

r=`vx $* < \`tty\` > \`tty\``

Bash는 이를 현재 스크립트에 전달된 모든 쉘 확장 인수( )를 전달할 vx수 있는 실행 파일 이름으로 해석합니다. $*예를 들어 스크립트의 인수가 이면 * `ls /dev`vx에 전달되는 인수 목록은 현재 디렉터리에 있는 모든 파일의 이름에 를 더한 것입니다 /dev. 인수 수는 파일 이름 수와 같습니다.

vx표준 입력에서 입력이 허용된다고 가정합니다.

ttyBash가 파일 이름으로 해석하는 문자열을 반환하는 실행 파일입니다.

첫 번째 호출은 tty두 번째 호출과 다른 파일 이름을 반환할 수 있습니다. 예를 들어 tty파일 이름이 일부 외부 조건(예: 이전 호출에서 생성된 이름을 가진 파일의 내용)을 기반으로 생성되거나 파일 이름이 다음과 같은 경우입니다. 타임스탬프 또는 변경될 수 있는 기타 외부 조건을 기반으로 생성됩니다.

이 표현식은 r=`...`backtick 명령의 표준 출력을 에 할당합니다 r. 백틱 표현식의 반환 값은 입니다 $?.

의 표준 출력은 vx두 번째 호출에서 생성된 파일 이름으로 리디렉션되므로 tty의 값은 r표현식에서와 마찬가지로 항상 비어 있습니다( ) r=. 결과적으로 루프가 두 번 이상 실행되지 않습니다.r=0[[ r -ne 0 ]]

관련 정보