고안된 예:
#!/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"