변수를 서브쉘에 전달

변수를 서브쉘에 전달

고안된 예:

#!/usr/bin/bash
MYVAR=$(cat /somedir | grep -i myval)

이제 나는 다음을 원한다:

#!/usr/bin/bash
BASEDIR=/somedir
MYVAR=$(cat [BASEDIR?] | grep -i myval)

변수는 서브쉘에 어떻게 전달되어야 합니까?

답변1

오직:

#!/bin/sh -
BASEDIR=/somedir
MYVAR=$(grep -rie myval -- "$BASEDIR")

하위 쉘은 상위 쉘의 복사본이며 변수 및 기타 대부분의 항목을 포함한 모든 메모리를 상속합니다.

cat디렉터리에서 실행하는 것은 거의 의미가 없습니다. 여기서는 변수의 내용을 인수로 전달 grep하고 (비표준) -r옵션을 사용하여 grep해당 디렉토리의 재귀 하강으로 찾은 파일을 grep합니다.

개별 파일을 연결하는 것도 cat별 의미가 없습니다 .

이를 위해 bash를 설치할 필요는 없습니다. sh설치도 마찬가지로 좋고 아마도 더 효율적일 것입니다.

grep디렉토리를 반복적으로 내림차순으로 찾은 모든 일반 파일의 연결을 실행하려면 다음을 수행할 수 있습니다.

MY_VAR=$(find -- "$BASEDIR" -type f -exec cat {} + | grep -i myval)

따라서 이러한 파일은 특정 순서로 연결되지 않습니다. GNU를 사용하면 grep다음도 수행할 수 있습니다.

MYVAR=$(grep -rhie myval -- "$BASEDIR")

where는 -h유사한 효과를 얻기 위해 일치하는 행이 발견된 파일 이름 인쇄를 건너뜁니다. 순서가 다를 수 있으며 일부 파일에 구분 기호가 없는 마지막 몇 줄이 있는 경우에도 차이가 발생할 수 있습니다.

답변2

변수는 서브쉘에 복사됩니다. 값을 변경하면 무엇이 변경되나요?아니요상위 항목으로 다시 전파합니다.

#!/bin/bash
set -eu
tmp=$(mktemp)

echo 123 > "$tmp"

value=$(cat "$tmp")
echo Found $value.

rm "$tmp"

관련 정보